@react-native-harness/platform-android 1.1.0-rc.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,6 +5,7 @@ import { SubprocessError } from '@react-native-harness/tools';
5
5
  import { createAvd, deleteAvd, emulatorProcess, getAppUid, getLogcatTimestamp, getStartAppArgs, hasAvd, installApp, startEmulator, waitForBoot, waitForEmulatorDisconnect, } from '../adb.js';
6
6
  import * as tools from '@react-native-harness/tools';
7
7
  import * as environment from '../environment.js';
8
+ import * as avdConfig from '../avd-config.js';
8
9
  const createAbortError = () => new DOMException('The operation was aborted', 'AbortError');
9
10
  const createMockChildProcess = () => {
10
11
  const process = new EventEmitter();
@@ -101,9 +102,13 @@ describe('getStartAppArgs', () => {
101
102
  ]);
102
103
  });
103
104
  it('creates an AVD and appends config overrides', async () => {
105
+ vi.spyOn(avdConfig, 'readAvdConfig').mockResolvedValue({});
104
106
  const spawnSpy = vi
105
107
  .spyOn(tools, 'spawn')
106
- .mockResolvedValue({});
108
+ .mockResolvedValue({})
109
+ .mockResolvedValueOnce({
110
+ stdout: 'id: 0 or "pixel_8"\n Name: Pixel 8\nid: 1 or "pixel_6"\n Name: Pixel 6\n',
111
+ });
107
112
  const verifyAndroidEmulatorSdk = vi
108
113
  .spyOn(environment, 'ensureAndroidSdkPackages')
109
114
  .mockResolvedValue('/tmp/android-sdk');
@@ -121,17 +126,84 @@ describe('getStartAppArgs', () => {
121
126
  'platforms;android-35',
122
127
  'system-images;android-35;default;x86_64',
123
128
  ]);
124
- expect(spawnSpy).toHaveBeenNthCalledWith(1, 'bash', [
129
+ expect(spawnSpy).toHaveBeenNthCalledWith(1, expect.stringMatching(/avdmanager$/), ['list', 'device']);
130
+ expect(spawnSpy).toHaveBeenNthCalledWith(2, 'bash', [
125
131
  '-lc',
126
- expect.stringContaining('create avd --force --name "Pixel_8_API_35" --package "system-images;android-35;default;x86_64" --device "pixel_8"'),
132
+ expect.stringContaining('create avd --force --name "Pixel_8_API_35" --package "system-images;android-35;default;x86_64" --device "pixel_8" -p '),
127
133
  ]);
128
- expect(spawnSpy).toHaveBeenNthCalledWith(2, 'bash', [
134
+ expect(spawnSpy).toHaveBeenNthCalledWith(3, 'bash', [
135
+ '-lc',
136
+ expect.stringContaining(`'avd.ini.encoding=UTF-8' 'path=`),
137
+ ]);
138
+ expect(spawnSpy).toHaveBeenNthCalledWith(4, 'bash', [
139
+ '-lc',
140
+ expect.stringContaining(`'disk.dataPartition.size=1G' 'vm.heapSize=1G' >> `),
141
+ ]);
142
+ });
143
+ it('recreates the companion ini file when avdmanager leaves it missing', async () => {
144
+ vi.spyOn(avdConfig, 'readAvdConfig').mockResolvedValue({});
145
+ const spawnSpy = vi
146
+ .spyOn(tools, 'spawn')
147
+ .mockResolvedValue({})
148
+ .mockResolvedValueOnce({
149
+ stdout: 'id: 0 or "pixel_6"\n Name: Pixel 6\n',
150
+ });
151
+ vi.spyOn(environment, 'ensureAndroidSdkPackages').mockResolvedValue('/tmp/android-sdk');
152
+ vi.spyOn(environment, 'getHostAndroidSystemImageArch').mockReturnValue('x86_64');
153
+ await createAvd({
154
+ name: 'Pixel_6_API_35',
155
+ apiLevel: 35,
156
+ profile: 'pixel_6',
157
+ diskSize: '1G',
158
+ heapSize: '1G',
159
+ });
160
+ expect(spawnSpy).toHaveBeenNthCalledWith(3, 'bash', [
161
+ '-lc',
162
+ expect.stringContaining(`'avd.ini.encoding=UTF-8' 'path=`),
163
+ ]);
164
+ expect(spawnSpy).toHaveBeenNthCalledWith(4, 'bash', [
129
165
  '-lc',
130
166
  expect.stringContaining(`'disk.dataPartition.size=1G' 'vm.heapSize=1G' >> `),
131
167
  ]);
132
168
  });
169
+ it('throws an actionable error when the requested AVD profile is unavailable', async () => {
170
+ vi.spyOn(tools, 'spawn').mockResolvedValueOnce({
171
+ stdout: 'id: 0 or "pixel_8"\n Name: Pixel 8\nid: 1 or "pixel_6"\n Name: Pixel 6\n',
172
+ });
173
+ vi.spyOn(environment, 'ensureAndroidSdkPackages').mockResolvedValue('/tmp/android-sdk');
174
+ vi.spyOn(environment, 'getHostAndroidSystemImageArch').mockReturnValue('x86_64');
175
+ await expect(createAvd({
176
+ name: 'Pixel_8_Pro_API_35',
177
+ apiLevel: 35,
178
+ profile: 'pixel_8_pro',
179
+ diskSize: '1G',
180
+ heapSize: '1G',
181
+ })).rejects.toThrow('Android AVD profile "pixel_8_pro" is not available on this machine. Available profiles: pixel_8, pixel_6');
182
+ });
183
+ it('throws a clear error when avdmanager does not create config.ini', async () => {
184
+ vi.spyOn(avdConfig, 'readAvdConfig').mockResolvedValue(null);
185
+ vi.spyOn(tools, 'spawn')
186
+ .mockResolvedValue({})
187
+ .mockResolvedValueOnce({
188
+ stdout: 'id: 0 or "pixel_6"\n Name: Pixel 6\n',
189
+ });
190
+ vi.spyOn(environment, 'ensureAndroidSdkPackages').mockResolvedValue('/tmp/android-sdk');
191
+ vi.spyOn(environment, 'getHostAndroidSystemImageArch').mockReturnValue('x86_64');
192
+ await expect(createAvd({
193
+ name: 'Pixel_6_API_35',
194
+ apiLevel: 35,
195
+ profile: 'pixel_6',
196
+ diskSize: '1G',
197
+ heapSize: '1G',
198
+ })).rejects.toThrow('Android AVD "Pixel_6_API_35" was created, but config.ini was not found at ');
199
+ });
133
200
  it('creates an AVD with arm64 system image packages on arm64 hosts', async () => {
134
- vi.spyOn(tools, 'spawn').mockResolvedValue({});
201
+ vi.spyOn(avdConfig, 'readAvdConfig').mockResolvedValue({});
202
+ vi.spyOn(tools, 'spawn')
203
+ .mockResolvedValue({})
204
+ .mockResolvedValueOnce({
205
+ stdout: 'id: 0 or "pixel_8"\n Name: Pixel 8\n',
206
+ });
135
207
  const ensureAndroidSdkPackages = vi
136
208
  .spyOn(environment, 'ensureAndroidSdkPackages')
137
209
  .mockResolvedValue('/tmp/android-sdk');
package/dist/adb.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"adb.d.ts","sourceRoot":"","sources":["../src/adb.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adb.d.ts","sourceRoot":"","sources":["../src/adb.ts"],"names":[],"mappings":"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"}
package/dist/adb.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { spawn, SubprocessError } from '@react-native-harness/tools';
2
2
  import { spawn as nodeSpawn } from 'node:child_process';
3
3
  import { access, rm } from 'node:fs/promises';
4
+ import { getAvdConfigPath, getAvdDirectory, readAvdConfig, } from './avd-config.js';
4
5
  import { ensureAndroidEmulatorAvailable, ensureAndroidSdkPackages, getAdbBinaryPath, getAndroidSystemImagePackage, getAvdManagerBinaryPath, getEmulatorBinaryPath, getHostAndroidSystemImageArch, getRequiredAndroidSdkPackages, } from './environment.js';
5
6
  import { getEmulatorStartupArgs, } from './emulator-startup.js';
6
7
  const wait = async (ms) => {
@@ -24,7 +25,6 @@ const waitWithSignal = async (ms, signal) => {
24
25
  }
25
26
  await Promise.race([wait(ms), waitForAbort(signal)]);
26
27
  };
27
- const getAvdConfigPath = (name) => `${process.env.ANDROID_AVD_HOME ?? `${process.env.HOME}/.android/avd`}/${name}.avd/config.ini`;
28
28
  const EMULATOR_STARTUP_OBSERVATION_TIMEOUT_MS = 5000;
29
29
  const EMULATOR_OUTPUT_BUFFER_LIMIT = 16 * 1024;
30
30
  export const emulatorProcess = {
@@ -79,6 +79,43 @@ export const getRequiredEmulatorPackages = (apiLevel) => {
79
79
  export const verifyAndroidEmulatorSdk = async (apiLevel) => {
80
80
  await ensureAndroidSdkPackages(getRequiredEmulatorPackages(apiLevel));
81
81
  };
82
+ const listAvdProfiles = async () => {
83
+ const { stdout } = await spawn(getAvdManagerBinaryPath(), ['list', 'device']);
84
+ return stdout
85
+ .split('\n')
86
+ .map((line) => line.match(/^id:\s+\d+\s+or\s+"([^"]+)"/i)?.[1]?.trim())
87
+ .filter((profile) => profile != null && profile !== '');
88
+ };
89
+ const ensureAvdProfileAvailable = async (profile) => {
90
+ const availableProfiles = await listAvdProfiles();
91
+ if (availableProfiles.includes(profile)) {
92
+ return;
93
+ }
94
+ const availableProfilesList = availableProfiles.length > 0
95
+ ? availableProfiles.join(', ')
96
+ : 'None reported by avdmanager.';
97
+ throw new Error(`Android AVD profile "${profile}" is not available on this machine. Available profiles: ${availableProfilesList}`);
98
+ };
99
+ const ensureAvdConfigExists = async (name) => {
100
+ const configPath = getAvdConfigPath(name);
101
+ if ((await readAvdConfig(name)) == null) {
102
+ throw new Error(`Android AVD "${name}" was created, but config.ini was not found at ${configPath}.`);
103
+ }
104
+ return configPath;
105
+ };
106
+ const getAvdIniPath = (name) => {
107
+ const avdHome = process.env.ANDROID_AVD_HOME ?? `${process.env.HOME}/.android/avd`;
108
+ return `${avdHome}/${name}.ini`;
109
+ };
110
+ const ensureAvdIniExists = async ({ name, apiLevel, }) => {
111
+ const iniPath = getAvdIniPath(name);
112
+ const avdDirectory = getAvdDirectory(name);
113
+ await spawn('bash', [
114
+ '-lc',
115
+ `printf '%s\n%s\n%s\n%s\n' 'avd.ini.encoding=UTF-8' 'path=${avdDirectory}' 'path.rel=avd/${name}.avd' 'target=android-${apiLevel}' > "${iniPath}"`,
116
+ ]);
117
+ return iniPath;
118
+ };
82
119
  export const getStartAppArgs = (bundleId, activityName, options) => {
83
120
  const args = [
84
121
  'shell',
@@ -207,13 +244,16 @@ export const hasAvd = async (name) => {
207
244
  export const createAvd = async ({ name, apiLevel, profile, diskSize, heapSize, }) => {
208
245
  const systemImagePackage = getAndroidSystemImagePackage(apiLevel, getHostAndroidSystemImageArch());
209
246
  await verifyAndroidEmulatorSdk(apiLevel);
247
+ await ensureAvdProfileAvailable(profile);
210
248
  await spawn('bash', [
211
249
  '-lc',
212
- `printf 'no\n' | "${getAvdManagerBinaryPath()}" create avd --force --name "${name}" --package "${systemImagePackage}" --device "${profile}"`,
250
+ `printf 'no\n' | "${getAvdManagerBinaryPath()}" create avd --force --name "${name}" --package "${systemImagePackage}" --device "${profile}" -p "${getAvdDirectory(name)}"`,
213
251
  ]);
252
+ await ensureAvdIniExists({ name, apiLevel });
253
+ const configPath = await ensureAvdConfigExists(name);
214
254
  await spawn('bash', [
215
255
  '-lc',
216
- `printf '%s\n%s\n' 'disk.dataPartition.size=${diskSize}' 'vm.heapSize=${heapSize}' >> "${getAvdConfigPath(name)}"`,
256
+ `printf '%s\n%s\n' 'disk.dataPartition.size=${diskSize}' 'vm.heapSize=${heapSize}' >> "${configPath}"`,
217
257
  ]);
218
258
  };
219
259
  export const deleteAvd = async (name) => {
package/dist/config.d.ts CHANGED
@@ -68,8 +68,8 @@ export declare const AndroidEmulatorSchema: z.ZodObject<{
68
68
  } | undefined;
69
69
  }>>;
70
70
  }, "strip", z.ZodTypeAny, {
71
- name: string;
72
71
  type: "emulator";
72
+ name: string;
73
73
  avd?: {
74
74
  apiLevel: number;
75
75
  profile: string;
@@ -80,8 +80,8 @@ export declare const AndroidEmulatorSchema: z.ZodObject<{
80
80
  } | undefined;
81
81
  } | undefined;
82
82
  }, {
83
- name: string;
84
83
  type: "emulator";
84
+ name: string;
85
85
  avd?: {
86
86
  apiLevel: number;
87
87
  profile: string;
@@ -97,13 +97,13 @@ export declare const PhysicalAndroidDeviceSchema: z.ZodObject<{
97
97
  manufacturer: z.ZodString;
98
98
  model: z.ZodString;
99
99
  }, "strip", z.ZodTypeAny, {
100
+ type: "physical";
100
101
  manufacturer: string;
101
102
  model: string;
102
- type: "physical";
103
103
  }, {
104
+ type: "physical";
104
105
  manufacturer: string;
105
106
  model: string;
106
- type: "physical";
107
107
  }>;
108
108
  export declare const AndroidDeviceSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
109
109
  type: z.ZodLiteral<"emulator">;
@@ -138,8 +138,8 @@ export declare const AndroidDeviceSchema: z.ZodDiscriminatedUnion<"type", [z.Zod
138
138
  } | undefined;
139
139
  }>>;
140
140
  }, "strip", z.ZodTypeAny, {
141
- name: string;
142
141
  type: "emulator";
142
+ name: string;
143
143
  avd?: {
144
144
  apiLevel: number;
145
145
  profile: string;
@@ -150,8 +150,8 @@ export declare const AndroidDeviceSchema: z.ZodDiscriminatedUnion<"type", [z.Zod
150
150
  } | undefined;
151
151
  } | undefined;
152
152
  }, {
153
- name: string;
154
153
  type: "emulator";
154
+ name: string;
155
155
  avd?: {
156
156
  apiLevel: number;
157
157
  profile: string;
@@ -166,13 +166,13 @@ export declare const AndroidDeviceSchema: z.ZodDiscriminatedUnion<"type", [z.Zod
166
166
  manufacturer: z.ZodString;
167
167
  model: z.ZodString;
168
168
  }, "strip", z.ZodTypeAny, {
169
+ type: "physical";
169
170
  manufacturer: string;
170
171
  model: string;
171
- type: "physical";
172
172
  }, {
173
+ type: "physical";
173
174
  manufacturer: string;
174
175
  model: string;
175
- type: "physical";
176
176
  }>]>;
177
177
  export declare const AndroidPlatformConfigSchema: z.ZodObject<{
178
178
  name: z.ZodString;
@@ -209,8 +209,8 @@ export declare const AndroidPlatformConfigSchema: z.ZodObject<{
209
209
  } | undefined;
210
210
  }>>;
211
211
  }, "strip", z.ZodTypeAny, {
212
- name: string;
213
212
  type: "emulator";
213
+ name: string;
214
214
  avd?: {
215
215
  apiLevel: number;
216
216
  profile: string;
@@ -221,8 +221,8 @@ export declare const AndroidPlatformConfigSchema: z.ZodObject<{
221
221
  } | undefined;
222
222
  } | undefined;
223
223
  }, {
224
- name: string;
225
224
  type: "emulator";
225
+ name: string;
226
226
  avd?: {
227
227
  apiLevel: number;
228
228
  profile: string;
@@ -237,13 +237,13 @@ export declare const AndroidPlatformConfigSchema: z.ZodObject<{
237
237
  manufacturer: z.ZodString;
238
238
  model: z.ZodString;
239
239
  }, "strip", z.ZodTypeAny, {
240
+ type: "physical";
240
241
  manufacturer: string;
241
242
  model: string;
242
- type: "physical";
243
243
  }, {
244
+ type: "physical";
244
245
  manufacturer: string;
245
246
  model: string;
246
- type: "physical";
247
247
  }>]>;
248
248
  bundleId: z.ZodString;
249
249
  activityName: z.ZodDefault<z.ZodString>;
@@ -257,8 +257,8 @@ export declare const AndroidPlatformConfigSchema: z.ZodObject<{
257
257
  }, "strip", z.ZodTypeAny, {
258
258
  name: string;
259
259
  device: {
260
- name: string;
261
260
  type: "emulator";
261
+ name: string;
262
262
  avd?: {
263
263
  apiLevel: number;
264
264
  profile: string;
@@ -269,9 +269,9 @@ export declare const AndroidPlatformConfigSchema: z.ZodObject<{
269
269
  } | undefined;
270
270
  } | undefined;
271
271
  } | {
272
+ type: "physical";
272
273
  manufacturer: string;
273
274
  model: string;
274
- type: "physical";
275
275
  };
276
276
  bundleId: string;
277
277
  activityName: string;
@@ -281,8 +281,8 @@ export declare const AndroidPlatformConfigSchema: z.ZodObject<{
281
281
  }, {
282
282
  name: string;
283
283
  device: {
284
- name: string;
285
284
  type: "emulator";
285
+ name: string;
286
286
  avd?: {
287
287
  apiLevel: number;
288
288
  profile: string;
@@ -293,9 +293,9 @@ export declare const AndroidPlatformConfigSchema: z.ZodObject<{
293
293
  } | undefined;
294
294
  } | undefined;
295
295
  } | {
296
+ type: "physical";
296
297
  manufacturer: string;
297
298
  model: string;
298
- type: "physical";
299
299
  };
300
300
  bundleId: string;
301
301
  activityName?: string | undefined;