Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions src/emulator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ export default class EmuContainer {

static async checkAndPullImage(imageName: string): Promise<void> {
const docker = new Docker()
await new Promise<void>((resolve) => {
docker.pull(imageName, {}, (err: any, stream: any) => {
await new Promise<void>((resolve, reject) => {
docker.pull(imageName, {}, (err: unknown, stream) => {
function onProgress(event: any): void {
const progress = event?.progress ?? ''
const status = event?.status ?? ''
Expand All @@ -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)
}
})
})
}
Expand Down
23 changes: 23 additions & 0 deletions tests/check-and-pull-image.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
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 fails', () => {
const BAD_IMAGE_NAME = 'this is not a valid image name'
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i encountered the issue due to network errors, but it seems like simply requesting an invalid image name can activate the same conditions.


test('EmuContainer should throw if checking for image fails', async () => {
await expect(() => EmuContainer.checkAndPullImage(BAD_IMAGE_NAME)).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(BAD_IMAGE_NAME)
})

await expect(() => Zemu.checkAndPullImage()).rejects.toThrow()
})
})