From c1f8f4fdcdc5d4098b67b0a9c6a9348a67870a6a Mon Sep 17 00:00:00 2001 From: Fedor Dikarev Date: Thu, 23 Jan 2025 14:24:04 +0100 Subject: [PATCH] add tests for retries Signed-off-by: Fedor Dikarev --- __tests__/retries_fail.test.ts | 61 +++++++++++++++++++++++++++++++ __tests__/retries_success.test.ts | 58 +++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 __tests__/retries_fail.test.ts create mode 100644 __tests__/retries_success.test.ts diff --git a/__tests__/retries_fail.test.ts b/__tests__/retries_fail.test.ts new file mode 100644 index 0000000..45ba2cd --- /dev/null +++ b/__tests__/retries_fail.test.ts @@ -0,0 +1,61 @@ +import { expect, jest, test, } from '@jest/globals'; +import * as path from 'path'; + +// import * as dockerModule from '../src/docker'; + +import { login } from '../src/docker'; +import { Docker } from '@docker/actions-toolkit/lib/docker/docker'; + +test('login retries function', async () => { + let stderr_strings: string[] = [] + let call_count: number = -1 + + // const execSpy = jest.spyOn(Docker, 'getExecOutput').mockImplementation(async () => { + Docker.getExecOutput = jest.fn(async () => { + call_count++ + console.log(`Mock: ${call_count}, ${stderr_strings}`) + if (call_count >= stderr_strings.length) { + return { + exitCode: 0, + stdout: 'Mock success', + stderr: '' + } + } + return { + exitCode: 1, + stdout: '', + stderr: stderr_strings[(call_count) % stderr_strings.length] + } + }) + + const username = 'dbowie'; + const password = 'groundcontrol'; + const registry = 'https://ghcr.io'; + + stderr_strings = [ + 'mock error, failed with status: 408 Request Timeout', + 'mock error, failed with status: 502 Request Timeout', + 'mock error, failed with status: 400 Request Timeout', + ] + call_count = -1 + await expect(async () => { + await login(registry, username, password, 'false', ['408', '400'], 5, 0.1); + }) + .rejects + .toThrow("mock error, failed with status: 502 Request Timeout"); + expect(Docker.getExecOutput).toHaveBeenCalledTimes(2); + + stderr_strings = [ + 'not matching error', + 'mock error, failed with status: 502 Request Timeout', + 'mock error, failed with status: 400 Request Timeout', + ] + call_count = -1 + await expect(async () => { + await login(registry, username, password, 'false', ['408', '400'], 5, 0.1); + }) + .rejects + .toThrow('not matching error'); + expect(Docker.getExecOutput).toHaveBeenCalledTimes(2 + 1); + +}); diff --git a/__tests__/retries_success.test.ts b/__tests__/retries_success.test.ts new file mode 100644 index 0000000..8c470e5 --- /dev/null +++ b/__tests__/retries_success.test.ts @@ -0,0 +1,58 @@ +import { expect, jest, test, } from '@jest/globals'; +import * as path from 'path'; + +// import * as dockerModule from '../src/docker'; + +import { login } from '../src/docker'; +import { Docker } from '@docker/actions-toolkit/lib/docker/docker'; + +test('login retries success function', async () => { + // let stderr_strings: string[] = [] + let stderr_strings: string[] = [ + 'mock error, failed with status: 408 Request Timeout', + 'mock error, failed with status: 502 Request Timeout', + 'mock error, failed with status: 400 Request Timeout', + ] + let call_count: number = -1 + + Docker.getExecOutput = jest.fn(async () => { + call_count++ + console.log(`Mock: ${call_count}, ${stderr_strings}`) + if (call_count >= stderr_strings.length) { + return { + exitCode: 0, + stdout: 'Mock success', + stderr: '' + } + } + return { + exitCode: 1, + stdout: '', + stderr: stderr_strings[(call_count) % stderr_strings.length] + } + }) + + const username = 'dbowie'; + const password = 'groundcontrol'; + const registry = 'https://ghcr.io'; + + // stderr_strings = [] + call_count = -1 + expect(async () => { + await login(registry, username, password, 'false', ['408', '502', '400'], 5, 0.1); + }) + .resolves; + expect(Docker.getExecOutput).toHaveBeenCalledTimes(1); + + stderr_strings = [ + 'mock error, failed with status: 408 Request Timeout', + 'mock error, failed with status: 502 Request Timeout', + 'mock error, failed with status: 400 Request Timeout', + ] + call_count = -1 + expect(async () => { + await login(registry, username, password, 'false', ['408', '502', '400'], 5, 0.1); + }) + .resolves; + expect(Docker.getExecOutput).toHaveBeenCalledTimes(0); +});