Skip to content

Commit 570aa54

Browse files
committed
feat: add infinite loop error test for recursive resolver
1 parent d354d77 commit 570aa54

2 files changed

Lines changed: 61 additions & 0 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[
2+
"wrap://test/1 => InfiniteRedirectResolver => uri (wrap://test/2)",
3+
"wrap://test/2 => InfiniteRedirectResolver => uri (wrap://test/3)",
4+
"wrap://test/3 => InfiniteRedirectResolver => uri (wrap://test/1)"
5+
]

packages/uri-resolvers/src/__tests__/recursive-resolver/recursive-resolver.spec.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,38 @@ class SimpleRedirectResolver implements IUriResolver<Error> {
4646
}
4747
}
4848

49+
class InfiniteRedirectResolver implements IUriResolver<Error> {
50+
async tryResolveUri(
51+
uri: Uri,
52+
client: CoreClient,
53+
resolutionContext: IUriResolutionContext
54+
): Promise<Result<UriPackageOrWrapper, Error>> {
55+
let result: Result<UriPackageOrWrapper, Error>;
56+
57+
switch (uri.uri) {
58+
case "wrap://test/1":
59+
result = UriResolutionResult.ok(Uri.from("test/2"));
60+
break;
61+
case "wrap://test/2":
62+
result = UriResolutionResult.ok(Uri.from("test/3"));
63+
break;
64+
case "wrap://test/3":
65+
result = UriResolutionResult.ok(Uri.from("test/1"));
66+
break;
67+
default:
68+
result = UriResolutionResult.ok(uri);
69+
}
70+
71+
resolutionContext.trackStep({
72+
sourceUri: uri,
73+
result,
74+
description: "InfiniteRedirectResolver",
75+
});
76+
77+
return result;
78+
}
79+
}
80+
4981
describe("RecursiveResolver", () => {
5082
it("can recursively resolve a URI", async () => {
5183
const uri = new Uri("test/1");
@@ -100,4 +132,28 @@ describe("RecursiveResolver", () => {
100132

101133
expect(result.value.uri.uri).toEqual("wrap://test/not-a-match");
102134
});
135+
136+
it("should raise an error if infinite loop detected during URI Resolution", async () => {
137+
const uri = new Uri("test/1");
138+
139+
const client = new PolywrapCoreClient({
140+
resolver: RecursiveResolver.from(new InfiniteRedirectResolver()),
141+
});
142+
143+
let resolutionContext = new UriResolutionContext();
144+
let result = await client.tryResolveUri({ uri, resolutionContext });
145+
146+
await expectHistory(
147+
resolutionContext.getHistory(),
148+
"recursive-resolver",
149+
"infinite-loop"
150+
);
151+
152+
if (result.ok) {
153+
fail(`Expected an error got value: ${result.value}`);
154+
}
155+
156+
// @ts-ignore
157+
expect(result.error!.message).toMatch("An infinite loop was detected while resolving the URI: wrap://test/1");
158+
})
103159
});

0 commit comments

Comments
 (0)