Skip to content

Commit

Permalink
test(credential-provider-imds): update tests for retry (#1316)
Browse files Browse the repository at this point in the history
  • Loading branch information
trivikr committed Jul 6, 2020
1 parent 0c0383c commit b9a1715
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 20 deletions.
39 changes: 22 additions & 17 deletions packages/credential-provider-imds/src/remoteProvider/retry.spec.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,34 @@
import { retry } from "./retry";

describe("retry", () => {
const successMsg = "Success";
const errorMsg = "Expected failure";
const retries = 10;
const retryable = jest.fn().mockRejectedValue(errorMsg);

afterEach(() => {
jest.clearAllMocks();
});

it("should retry a function the specified number of times", async () => {
const retries = 10;
const retryable = jest.fn().mockRejectedValue("Expected failure");
await expect(retry(retryable, retries)).rejects.toStrictEqual(errorMsg);
expect(retryable).toHaveBeenCalledTimes(retries + 1);
});

await retry(retryable, retries).catch(msg => {
expect(retryable.mock.calls.length).toEqual(retries + 1);
expect(msg).toEqual("Expected failure");
});
it("should not retry if successful", async () => {
retryable.mockResolvedValueOnce(successMsg);
await expect(retry(retryable, retries)).resolves.toStrictEqual(successMsg);
expect(retryable).toHaveBeenCalledTimes(1);
});

it("should stop retrying after the first successful invocation", async () => {
const retries = 10;
const successfulInvocationIndex = 3;
let invocations = 0;
const retryable = jest.fn(() => {
if (++invocations === successfulInvocationIndex) {
return Promise.resolve("Success!");
}
return Promise.reject("Expected failure");
});
for (let i = 1; i < successfulInvocationIndex; i++) {
retryable.mockRejectedValueOnce(errorMsg);
}
retryable.mockResolvedValueOnce(successMsg);

await retry(retryable, retries).then(() => {
expect(retryable.mock.calls.length).toEqual(successfulInvocationIndex);
});
await expect(retry(retryable, retries)).resolves.toStrictEqual(successMsg);
expect(retryable).toHaveBeenCalledTimes(successfulInvocationIndex);
});
});
6 changes: 3 additions & 3 deletions packages/credential-provider-imds/src/remoteProvider/retry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ export interface RetryableProvider<T> {
/**
* @internal
*/
export function retry<T>(
export const retry = <T>(
toRetry: RetryableProvider<T>,
maxRetries: number
): Promise<T> {
): Promise<T> => {
let promise = toRetry();
for (let i = 0; i < maxRetries; i++) {
promise = promise.catch(toRetry);
}

return promise;
}
};

0 comments on commit b9a1715

Please sign in to comment.