diff --git a/lib/common/mobile/android/android-virtual-device-service.ts b/lib/common/mobile/android/android-virtual-device-service.ts index c98b859131..3aeb0fbe8f 100644 --- a/lib/common/mobile/android/android-virtual-device-service.ts +++ b/lib/common/mobile/android/android-virtual-device-service.ts @@ -151,6 +151,7 @@ export class AndroidVirtualDeviceService implements Mobile.IAndroidVirtualDevice private async getEmulatorImagesCore(): Promise { let result: ISpawnResult = null; let devices: Mobile.IDeviceInfo[] = []; + let errors: string[] = []; if (this.pathToAvdManagerExecutable && this.$fs.exists(this.pathToAvdManagerExecutable)) { result = await this.$childProcess.trySpawnFromCloseEvent(this.pathToAvdManagerExecutable, ["list", "avds"]); @@ -160,11 +161,12 @@ export class AndroidVirtualDeviceService implements Mobile.IAndroidVirtualDevice if (result && result.stdout) { devices = this.parseListAvdsOutput(result.stdout); + errors = result && result.stderr ? [result.stderr] : []; } else { devices = this.listAvdsFromDirectory(); } - return { devices, errors: result && result.stderr ? [result.stderr] : [] }; + return { devices, errors }; } private async getRunningEmulatorData(runningEmulatorId: string, availableEmulators: Mobile.IDeviceInfo[]): Promise { diff --git a/lib/common/test/unit-tests/mobile/android-virtual-device-service.ts b/lib/common/test/unit-tests/mobile/android-virtual-device-service.ts index 3130cb51a4..9cf9795fe3 100644 --- a/lib/common/test/unit-tests/mobile/android-virtual-device-service.ts +++ b/lib/common/test/unit-tests/mobile/android-virtual-device-service.ts @@ -176,14 +176,13 @@ describe("androidVirtualDeviceService", () => { assert.deepEqual(result.devices, []); assert.deepEqual(result.errors, []); }); - it("should return an empty array when `avdmanager list avds` command fails", async () => { + it("should return an empty array and no errors when `avdmanager list avds` command fails", async () => { const avdManagerError = "some error while executing avdmanager list avds"; const avdService = mockAvdService({ avdManagerError }); const result = await avdService.getEmulatorImages([]); assert.lengthOf(result.devices, 0); assert.deepEqual(result.devices, []); - assert.lengthOf(result.errors, 1); - assert.deepEqual(result.errors, [avdManagerError]); + assert.lengthOf(result.errors, 0); }); it("should return all emulators when there are available emulators and no running emulators", async () => { const avdService = mockAvdService({ @@ -214,6 +213,24 @@ describe("androidVirtualDeviceService", () => { assert.deepEqual(result[1], getAvailableEmulatorData({ displayName: "Nexus_5X_API_28", imageIdentifier: "Nexus_5X_API_28", version: "9.0.0", model: "Nexus 5X" })); assert.deepEqual(result[2], getAvailableEmulatorData({ displayName: "Nexus_6P_API_28", imageIdentifier: "Nexus_6P_API_28", version: "9.0.0", model: "Nexus 6P" })); }); + // In this case we should fallback to list avd directory and should't report errors from avdmanager + it("should return devices and no errors when there is an error on avdmanager's stderr", async () => { + const iniFilesData = getIniFilesData(); + const testInjector = createTestInjector({ + avdManagerOutput: "", + avdManagerError: "my test error", + iniFilesData + }); + + const fs = testInjector.resolve("fs"); + fs.readDirectory = () => _.keys(iniFilesData); + + const avdService = testInjector.resolve("androidVirtualDeviceService"); + const result = await avdService.getEmulatorImages(["emulator-5554 device"]); + + assert.deepEqual(result.devices.length, 3); + assert.deepEqual(result.errors.length, 0); + }); }); describe("when avdmanager is not found", () => {