diff --git a/src/platforms/android/__tests__/devices.test.ts b/src/platforms/android/__tests__/devices.test.ts index a6f2c2348..1bcc2e5d0 100644 --- a/src/platforms/android/__tests__/devices.test.ts +++ b/src/platforms/android/__tests__/devices.test.ts @@ -6,6 +6,7 @@ import path from 'node:path'; import { ensureAndroidEmulatorBooted, parseAndroidAvdList, + parseAndroidEmulatorAvdNameOutput, parseAndroidFeatureListForTv, parseAndroidTargetFromCharacteristics, resolveAndroidAvdName, @@ -31,6 +32,12 @@ test('parseAndroidAvdList drops empty lines', () => { assert.deepEqual(listed, ['Pixel_9_Pro_XL', 'Wear_OS']); }); +test('parseAndroidEmulatorAvdNameOutput drops trailing adb protocol status', () => { + assert.equal(parseAndroidEmulatorAvdNameOutput('Pixel_9_Pro_XL\r\nOK\r\n'), 'Pixel_9_Pro_XL'); + assert.equal(parseAndroidEmulatorAvdNameOutput('Pixel_9_Pro_XL\n'), 'Pixel_9_Pro_XL'); + assert.equal(parseAndroidEmulatorAvdNameOutput('\r\nOK\r\n'), undefined); +}); + test('resolveAndroidAvdName supports space vs underscore matching', () => { const avdNames = ['Pixel_9_Pro_XL', 'Medium_Tablet_API_35']; assert.equal(resolveAndroidAvdName(avdNames, 'Pixel_9_Pro_XL'), 'Pixel_9_Pro_XL'); diff --git a/src/platforms/android/devices.ts b/src/platforms/android/devices.ts index c518498b7..913036fe2 100644 --- a/src/platforms/android/devices.ts +++ b/src/platforms/android/devices.ts @@ -37,6 +37,18 @@ function normalizeAndroidName(value: string): string { return value.toLowerCase().replace(/_/g, ' ').replace(/\s+/g, ' ').trim(); } +export function parseAndroidEmulatorAvdNameOutput(rawOutput: string): string | undefined { + const lines = rawOutput + .split('\n') + .map((line) => line.trim()) + .filter((line) => line.length > 0); + if (lines.length === 0) return undefined; + if (lines.at(-1) === 'OK') { + lines.pop(); + } + return lines.join('\n').trim() || undefined; +} + async function readAndroidBootProp( serial: string, timeoutMs = TIMEOUT_PROFILES.android_boot.operationMs, @@ -71,8 +83,8 @@ async function resolveAndroidEmulatorAvdName(serial: string): Promise 0) { + const emuValue = parseAndroidEmulatorAvdNameOutput(emuResult.stdout); + if (emuResult.exitCode === 0 && emuValue) { return emuValue; } return undefined;