From 980ee066bff7538e80b6441adbb92aada6697c51 Mon Sep 17 00:00:00 2001 From: turbocrime <134443988+turbocrime@users.noreply.github.com> Date: Tue, 29 Jul 2025 22:36:08 -0700 Subject: [PATCH 1/2] fix: Zemu.checkAndPullImage should propagate failures --- src/emulator.ts | 13 +++++++------ tests/check-and-pull-image.test.ts | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 tests/check-and-pull-image.test.ts diff --git a/src/emulator.ts b/src/emulator.ts index 94e00fb..f08feed 100644 --- a/src/emulator.ts +++ b/src/emulator.ts @@ -70,8 +70,8 @@ export default class EmuContainer { static async checkAndPullImage(imageName: string): Promise { const docker = new Docker() - await new Promise((resolve) => { - docker.pull(imageName, {}, (err: any, stream: any) => { + await new Promise((resolve, reject) => { + docker.pull(imageName, {}, (err: unknown, stream) => { function onProgress(event: any): void { const progress = event?.progress ?? '' const status = event?.status ?? '' @@ -81,18 +81,19 @@ export default class EmuContainer { function onFinished(err: any, _output: any): void { if (err != null) { process.stdout.write(`[DOCKER] ${err}\n`) - throw err + reject(err) } resolve() } if (err != null) { process.stdout.write(`[DOCKER] ${err}\n`) - throw err + reject(err) } - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - docker.modem.followProgress(stream, onFinished, onProgress) + if (stream) { + docker.modem.followProgress(stream, onFinished, onProgress) + } }) }) } diff --git a/tests/check-and-pull-image.test.ts b/tests/check-and-pull-image.test.ts new file mode 100644 index 0000000..d487e4b --- /dev/null +++ b/tests/check-and-pull-image.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, test, vi } from 'vitest' +import EmuContainer from '../src/emulator' +import Zemu from '../src/Zemu' +import { DEFAULT_EMU_IMG } from '../src/constants' + +describe('checkAndPullImage', () => { + test('EmuContainer should throw if checking for image fails', async () => { + await expect(() => EmuContainer.checkAndPullImage('please fail')).rejects.toThrow() + }) + + test('Zemu should throw if checking for image fails', async () => { + vi.spyOn(EmuContainer, 'checkAndPullImage').mockImplementationOnce(async (discarded) => { + // expect a typical call + expect(discarded).toBe(DEFAULT_EMU_IMG) + // forward to the original implementation + return EmuContainer.checkAndPullImage('please fail') + }) + + await expect(() => Zemu.checkAndPullImage()).rejects.toThrow() + }) +}) From 4eb1f03560f7c25a7e23948c33101e4f0da87644 Mon Sep 17 00:00:00 2001 From: turbocrime <134443988+turbocrime@users.noreply.github.com> Date: Tue, 29 Jul 2025 23:11:48 -0700 Subject: [PATCH 2/2] use constant name --- tests/check-and-pull-image.test.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/check-and-pull-image.test.ts b/tests/check-and-pull-image.test.ts index d487e4b..eecfc6f 100644 --- a/tests/check-and-pull-image.test.ts +++ b/tests/check-and-pull-image.test.ts @@ -3,9 +3,11 @@ import EmuContainer from '../src/emulator' import Zemu from '../src/Zemu' import { DEFAULT_EMU_IMG } from '../src/constants' -describe('checkAndPullImage', () => { +describe('checkAndPullImage fails', () => { + const BAD_IMAGE_NAME = 'this is not a valid image name' + test('EmuContainer should throw if checking for image fails', async () => { - await expect(() => EmuContainer.checkAndPullImage('please fail')).rejects.toThrow() + await expect(() => EmuContainer.checkAndPullImage(BAD_IMAGE_NAME)).rejects.toThrow() }) test('Zemu should throw if checking for image fails', async () => { @@ -13,7 +15,7 @@ describe('checkAndPullImage', () => { // expect a typical call expect(discarded).toBe(DEFAULT_EMU_IMG) // forward to the original implementation - return EmuContainer.checkAndPullImage('please fail') + return EmuContainer.checkAndPullImage(BAD_IMAGE_NAME) }) await expect(() => Zemu.checkAndPullImage()).rejects.toThrow()