@react-native-harness/platform-android 1.4.0-rc.1 → 1.4.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.
Files changed (42) hide show
  1. package/dist/__tests__/adb-wait.test.d.ts +2 -0
  2. package/dist/__tests__/adb-wait.test.d.ts.map +1 -0
  3. package/dist/__tests__/adb-wait.test.js +69 -0
  4. package/dist/__tests__/app-session.test.d.ts +2 -0
  5. package/dist/__tests__/app-session.test.d.ts.map +1 -0
  6. package/dist/__tests__/app-session.test.js +57 -0
  7. package/dist/__tests__/avd-config.test.js +58 -0
  8. package/dist/__tests__/emulator-startup.test.js +30 -3
  9. package/dist/__tests__/instance.test.js +10 -4
  10. package/dist/adb.d.ts +3 -1
  11. package/dist/adb.d.ts.map +1 -1
  12. package/dist/adb.js +30 -21
  13. package/dist/app-session.d.ts +11 -2
  14. package/dist/app-session.d.ts.map +1 -1
  15. package/dist/app-session.js +17 -12
  16. package/dist/avd-config.d.ts +1 -0
  17. package/dist/avd-config.d.ts.map +1 -1
  18. package/dist/avd-config.js +11 -0
  19. package/dist/emulator-startup.d.ts +23 -0
  20. package/dist/emulator-startup.d.ts.map +1 -1
  21. package/dist/emulator-startup.js +58 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -0
  25. package/dist/instance.d.ts.map +1 -1
  26. package/dist/instance.js +21 -15
  27. package/dist/runner.d.ts +2 -2
  28. package/dist/runner.d.ts.map +1 -1
  29. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  30. package/package.json +4 -4
  31. package/src/__tests__/adb-wait.test.ts +95 -0
  32. package/src/__tests__/app-session.test.ts +76 -0
  33. package/src/__tests__/avd-config.test.ts +70 -0
  34. package/src/__tests__/emulator-startup.test.ts +53 -6
  35. package/src/__tests__/instance.test.ts +107 -108
  36. package/src/adb.ts +72 -65
  37. package/src/app-session.ts +28 -12
  38. package/src/avd-config.ts +17 -0
  39. package/src/emulator-startup.ts +74 -0
  40. package/src/index.ts +1 -0
  41. package/src/instance.ts +30 -16
  42. package/src/runner.ts +5 -9
@@ -12,9 +12,13 @@ import * as adb from '../adb.js';
12
12
  import * as avdConfig from '../avd-config.js';
13
13
  import * as sharedPrefs from '../shared-prefs.js';
14
14
  import { HarnessAppPathError, HarnessEmulatorConfigError } from '../errors.js';
15
+ import * as emulatorStartup from '../emulator-startup.js';
16
+ const { getEmulatorCpuCores } = emulatorStartup;
15
17
 
16
18
  const createLogcatProcess = (lines: string[] = []): Subprocess => {
17
- const process = {
19
+ // Mirrors nano-spawn's real Subprocess, which is both a Promise and an
20
+ // async iterable, since app-session.ts relies on it being thenable.
21
+ const process = Object.assign(Promise.resolve(undefined), {
18
22
  nodeChildProcess: Promise.resolve({
19
23
  kill: vi.fn(),
20
24
  }),
@@ -23,7 +27,7 @@ const createLogcatProcess = (lines: string[] = []): Subprocess => {
23
27
  yield line;
24
28
  }
25
29
  },
26
- };
30
+ });
27
31
 
28
32
  return process as unknown as Subprocess;
29
33
  };
@@ -46,15 +50,19 @@ describe('Android platform instance', () => {
46
50
  vi.useRealTimers();
47
51
  vi.spyOn(
48
52
  await import('../environment.js'),
49
- 'ensureAndroidEmulatorAvailable',
53
+ 'ensureAndroidEmulatorAvailable'
50
54
  ).mockResolvedValue('/tmp/android-sdk');
55
+ vi.spyOn(
56
+ emulatorStartup,
57
+ 'warnIfEmulatorAccelerationUnavailable'
58
+ ).mockResolvedValue(undefined);
51
59
  });
52
60
 
53
61
  it('reuses a running emulator and does not shut it down on dispose', async () => {
54
62
  const ensureAndroidEmulatorEnvironment = vi
55
63
  .spyOn(
56
64
  await import('../environment.js'),
57
- 'ensureAndroidEmulatorEnvironment',
65
+ 'ensureAndroidEmulatorEnvironment'
58
66
  )
59
67
  .mockResolvedValue('/tmp/android-sdk');
60
68
  vi.spyOn(adb, 'getDeviceIds').mockResolvedValue(['emulator-5554']);
@@ -64,14 +72,12 @@ describe('Android platform instance', () => {
64
72
  vi.spyOn(adb, 'reversePort').mockResolvedValue(undefined);
65
73
  vi.spyOn(adb, 'setHideErrorDialogs').mockResolvedValue(undefined);
66
74
  vi.spyOn(adb, 'getAppUid').mockResolvedValue(10234);
67
- vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue(
68
- '01-01 00:00:00.000',
69
- );
75
+ vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue('01-01 00:00:00.000');
70
76
  vi.spyOn(sharedPrefs, 'applyHarnessDebugHttpHost').mockResolvedValue(
71
- undefined,
77
+ undefined
72
78
  );
73
79
  vi.spyOn(sharedPrefs, 'clearHarnessDebugHttpHost').mockResolvedValue(
74
- undefined,
80
+ undefined
75
81
  );
76
82
  vi.spyOn(adb, 'stopApp').mockResolvedValue(undefined);
77
83
  const stopEmulator = vi.spyOn(adb, 'stopEmulator').mockResolvedValue();
@@ -93,7 +99,7 @@ describe('Android platform instance', () => {
93
99
  activityName: '.MainActivity',
94
100
  },
95
101
  harnessConfig,
96
- init,
102
+ init
97
103
  );
98
104
 
99
105
  await instance.dispose();
@@ -105,7 +111,7 @@ describe('Android platform instance', () => {
105
111
  it('creates and boots an emulator when missing and shuts it down on dispose', async () => {
106
112
  vi.spyOn(
107
113
  await import('../environment.js'),
108
- 'ensureAndroidEmulatorEnvironment',
114
+ 'ensureAndroidEmulatorEnvironment'
109
115
  ).mockResolvedValue('/tmp/android-sdk');
110
116
  vi.spyOn(adb, 'getDeviceIds').mockResolvedValue([]);
111
117
  vi.spyOn(adb, 'hasAvd').mockResolvedValue(false);
@@ -118,14 +124,12 @@ describe('Android platform instance', () => {
118
124
  vi.spyOn(adb, 'reversePort').mockResolvedValue(undefined);
119
125
  vi.spyOn(adb, 'setHideErrorDialogs').mockResolvedValue(undefined);
120
126
  vi.spyOn(adb, 'getAppUid').mockResolvedValue(10234);
121
- vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue(
122
- '01-01 00:00:00.000',
123
- );
127
+ vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue('01-01 00:00:00.000');
124
128
  vi.spyOn(sharedPrefs, 'applyHarnessDebugHttpHost').mockResolvedValue(
125
- undefined,
129
+ undefined
126
130
  );
127
131
  vi.spyOn(sharedPrefs, 'clearHarnessDebugHttpHost').mockResolvedValue(
128
- undefined,
132
+ undefined
129
133
  );
130
134
  vi.spyOn(adb, 'stopApp').mockResolvedValue(undefined);
131
135
  const stopEmulator = vi.spyOn(adb, 'stopEmulator').mockResolvedValue();
@@ -147,7 +151,7 @@ describe('Android platform instance', () => {
147
151
  activityName: '.MainActivity',
148
152
  },
149
153
  harnessConfig,
150
- init,
154
+ init
151
155
  );
152
156
 
153
157
  expect(createAvd).toHaveBeenCalledWith({
@@ -168,7 +172,7 @@ describe('Android platform instance', () => {
168
172
  const ensureAndroidEmulatorEnvironment = vi
169
173
  .spyOn(
170
174
  await import('../environment.js'),
171
- 'ensureAndroidEmulatorEnvironment',
175
+ 'ensureAndroidEmulatorEnvironment'
172
176
  )
173
177
  .mockResolvedValue('/tmp/android-sdk');
174
178
  vi.spyOn(adb, 'getDeviceIds').mockResolvedValue([]);
@@ -182,11 +186,9 @@ describe('Android platform instance', () => {
182
186
  vi.spyOn(adb, 'reversePort').mockResolvedValue(undefined);
183
187
  vi.spyOn(adb, 'setHideErrorDialogs').mockResolvedValue(undefined);
184
188
  vi.spyOn(adb, 'getAppUid').mockResolvedValue(10234);
185
- vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue(
186
- '01-01 00:00:00.000',
187
- );
189
+ vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue('01-01 00:00:00.000');
188
190
  vi.spyOn(sharedPrefs, 'applyHarnessDebugHttpHost').mockResolvedValue(
189
- undefined,
191
+ undefined
190
192
  );
191
193
 
192
194
  await expect(
@@ -207,8 +209,8 @@ describe('Android platform instance', () => {
207
209
  activityName: '.MainActivity',
208
210
  },
209
211
  harnessConfig,
210
- init,
211
- ),
212
+ init
213
+ )
212
214
  ).resolves.toBeDefined();
213
215
 
214
216
  expect(ensureAndroidEmulatorEnvironment).toHaveBeenCalledWith(35);
@@ -220,11 +222,11 @@ describe('Android platform instance', () => {
220
222
  vi.stubEnv('HARNESS_AVD_CACHING', 'true');
221
223
  vi.spyOn(
222
224
  await import('../environment.js'),
223
- 'getHostAndroidSystemImageArch',
225
+ 'getHostAndroidSystemImageArch'
224
226
  ).mockReturnValue('arm64-v8a');
225
227
  vi.spyOn(
226
228
  await import('../environment.js'),
227
- 'ensureAndroidEmulatorEnvironment',
229
+ 'ensureAndroidEmulatorEnvironment'
228
230
  ).mockResolvedValue('/tmp/android-sdk');
229
231
  vi.spyOn(adb, 'getDeviceIds').mockResolvedValue([]);
230
232
  vi.spyOn(adb, 'hasAvd').mockResolvedValue(true);
@@ -234,6 +236,7 @@ describe('Android platform instance', () => {
234
236
  hwDeviceName: 'pixel_8',
235
237
  diskDataPartitionSize: '1G',
236
238
  vmHeapSize: '1G',
239
+ hwCpuNcore: String(getEmulatorCpuCores()),
237
240
  });
238
241
  vi.spyOn(adb, 'startEmulator').mockResolvedValue(undefined);
239
242
  vi.spyOn(adb, 'waitForBoot').mockResolvedValue('emulator-5554');
@@ -241,11 +244,9 @@ describe('Android platform instance', () => {
241
244
  vi.spyOn(adb, 'reversePort').mockResolvedValue(undefined);
242
245
  vi.spyOn(adb, 'setHideErrorDialogs').mockResolvedValue(undefined);
243
246
  vi.spyOn(adb, 'getAppUid').mockResolvedValue(10234);
244
- vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue(
245
- '01-01 00:00:00.000',
246
- );
247
+ vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue('01-01 00:00:00.000');
247
248
  vi.spyOn(sharedPrefs, 'applyHarnessDebugHttpHost').mockResolvedValue(
248
- undefined,
249
+ undefined
249
250
  );
250
251
 
251
252
  await expect(
@@ -267,14 +268,14 @@ describe('Android platform instance', () => {
267
268
  activityName: '.MainActivity',
268
269
  },
269
270
  harnessConfig,
270
- init,
271
- ),
271
+ init
272
+ )
272
273
  ).resolves.toBeDefined();
273
274
 
274
275
  expect(adb.startEmulator).toHaveBeenCalledTimes(1);
275
276
  expect(adb.startEmulator).toHaveBeenCalledWith(
276
277
  'Pixel_8_API_35',
277
- 'snapshot-reuse',
278
+ 'snapshot-reuse'
278
279
  );
279
280
  });
280
281
 
@@ -282,7 +283,7 @@ describe('Android platform instance', () => {
282
283
  vi.stubEnv('HARNESS_AVD_CACHING', 'true');
283
284
  vi.spyOn(
284
285
  await import('../environment.js'),
285
- 'ensureAndroidEmulatorEnvironment',
286
+ 'ensureAndroidEmulatorEnvironment'
286
287
  ).mockResolvedValue('/tmp/android-sdk');
287
288
  vi.spyOn(adb, 'getDeviceIds').mockResolvedValue([]);
288
289
  vi.spyOn(adb, 'hasAvd').mockResolvedValue(true);
@@ -305,11 +306,9 @@ describe('Android platform instance', () => {
305
306
  vi.spyOn(adb, 'reversePort').mockResolvedValue(undefined);
306
307
  vi.spyOn(adb, 'setHideErrorDialogs').mockResolvedValue(undefined);
307
308
  vi.spyOn(adb, 'getAppUid').mockResolvedValue(10234);
308
- vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue(
309
- '01-01 00:00:00.000',
310
- );
309
+ vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue('01-01 00:00:00.000');
311
310
  vi.spyOn(sharedPrefs, 'applyHarnessDebugHttpHost').mockResolvedValue(
312
- undefined,
311
+ undefined
313
312
  );
314
313
 
315
314
  await expect(
@@ -331,8 +330,8 @@ describe('Android platform instance', () => {
331
330
  activityName: '.MainActivity',
332
331
  },
333
332
  harnessConfig,
334
- init,
335
- ),
333
+ init
334
+ )
336
335
  ).resolves.toBeDefined();
337
336
 
338
337
  expect(deleteAvd).toHaveBeenCalledWith('Pixel_8_API_35');
@@ -340,17 +339,17 @@ describe('Android platform instance', () => {
340
339
  expect(stopEmulator).toHaveBeenCalledWith('emulator-5554');
341
340
  expect(waitForEmulatorDisconnect).toHaveBeenCalledWith(
342
341
  'emulator-5554',
343
- init.signal,
342
+ init.signal
344
343
  );
345
344
  expect(adb.startEmulator).toHaveBeenNthCalledWith(
346
345
  1,
347
346
  'Pixel_8_API_35',
348
- 'clean-snapshot-generation',
347
+ 'clean-snapshot-generation'
349
348
  );
350
349
  expect(adb.startEmulator).toHaveBeenNthCalledWith(
351
350
  2,
352
351
  'Pixel_8_API_35',
353
- 'snapshot-reuse',
352
+ 'snapshot-reuse'
354
353
  );
355
354
  });
356
355
 
@@ -358,7 +357,7 @@ describe('Android platform instance', () => {
358
357
  vi.stubEnv('HARNESS_AVD_CACHING', 'true');
359
358
  vi.spyOn(
360
359
  await import('../environment.js'),
361
- 'ensureAndroidEmulatorEnvironment',
360
+ 'ensureAndroidEmulatorEnvironment'
362
361
  ).mockResolvedValue('/tmp/android-sdk');
363
362
  vi.spyOn(adb, 'getDeviceIds').mockResolvedValue([]);
364
363
  vi.spyOn(adb, 'hasAvd').mockResolvedValue(false);
@@ -375,11 +374,9 @@ describe('Android platform instance', () => {
375
374
  vi.spyOn(adb, 'reversePort').mockResolvedValue(undefined);
376
375
  vi.spyOn(adb, 'setHideErrorDialogs').mockResolvedValue(undefined);
377
376
  vi.spyOn(adb, 'getAppUid').mockResolvedValue(10234);
378
- vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue(
379
- '01-01 00:00:00.000',
380
- );
377
+ vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue('01-01 00:00:00.000');
381
378
  vi.spyOn(sharedPrefs, 'applyHarnessDebugHttpHost').mockResolvedValue(
382
- undefined,
379
+ undefined
383
380
  );
384
381
 
385
382
  await expect(
@@ -401,24 +398,24 @@ describe('Android platform instance', () => {
401
398
  activityName: '.MainActivity',
402
399
  },
403
400
  harnessConfig,
404
- init,
405
- ),
401
+ init
402
+ )
406
403
  ).resolves.toBeDefined();
407
404
 
408
405
  expect(startEmulator).toHaveBeenNthCalledWith(
409
406
  1,
410
407
  'Pixel_8_API_35',
411
- 'clean-snapshot-generation',
408
+ 'clean-snapshot-generation'
412
409
  );
413
410
  expect(stopEmulator).toHaveBeenCalledWith('emulator-5554');
414
411
  expect(waitForEmulatorDisconnect).toHaveBeenCalledWith(
415
412
  'emulator-5554',
416
- init.signal,
413
+ init.signal
417
414
  );
418
415
  expect(startEmulator).toHaveBeenNthCalledWith(
419
416
  2,
420
417
  'Pixel_8_API_35',
421
- 'snapshot-reuse',
418
+ 'snapshot-reuse'
422
419
  );
423
420
  });
424
421
 
@@ -446,8 +443,8 @@ describe('Android platform instance', () => {
446
443
  activityName: '.MainActivity',
447
444
  },
448
445
  harnessConfig,
449
- init,
450
- ),
446
+ init
447
+ )
451
448
  ).rejects.toBeInstanceOf(HarnessAppPathError);
452
449
  });
453
450
 
@@ -476,8 +473,8 @@ describe('Android platform instance', () => {
476
473
  activityName: '.MainActivity',
477
474
  },
478
475
  harnessConfig,
479
- init,
480
- ),
476
+ init
477
+ )
481
478
  ).rejects.toBeInstanceOf(HarnessAppPathError);
482
479
  });
483
480
 
@@ -496,8 +493,8 @@ describe('Android platform instance', () => {
496
493
  activityName: '.MainActivity',
497
494
  },
498
495
  harnessConfig,
499
- init,
500
- ),
496
+ init
497
+ )
501
498
  ).rejects.toBeInstanceOf(HarnessEmulatorConfigError);
502
499
  });
503
500
 
@@ -505,7 +502,7 @@ describe('Android platform instance', () => {
505
502
  vi.useFakeTimers();
506
503
  vi.spyOn(
507
504
  await import('../environment.js'),
508
- 'ensureAndroidEmulatorEnvironment',
505
+ 'ensureAndroidEmulatorEnvironment'
509
506
  ).mockResolvedValue('/tmp/android-sdk');
510
507
  vi.spyOn(adb, 'getDeviceIds').mockResolvedValue(['emulator-5554']);
511
508
  vi.spyOn(adb, 'getEmulatorName').mockResolvedValue('Pixel_8_API_35');
@@ -514,11 +511,9 @@ describe('Android platform instance', () => {
514
511
  vi.spyOn(adb, 'reversePort').mockResolvedValue(undefined);
515
512
  vi.spyOn(adb, 'setHideErrorDialogs').mockResolvedValue(undefined);
516
513
  vi.spyOn(adb, 'getAppUid').mockResolvedValue(10234);
517
- vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue(
518
- '01-01 00:00:00.000',
519
- );
514
+ vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue('01-01 00:00:00.000');
520
515
  vi.spyOn(sharedPrefs, 'applyHarnessDebugHttpHost').mockResolvedValue(
521
- undefined,
516
+ undefined
522
517
  );
523
518
  const stopApp = vi.spyOn(adb, 'stopApp').mockResolvedValue(undefined);
524
519
  const startApp = vi.spyOn(adb, 'startApp').mockResolvedValue(undefined);
@@ -544,7 +539,7 @@ describe('Android platform instance', () => {
544
539
  activityName: '.MainActivity',
545
540
  },
546
541
  harnessConfigWithoutNativeCrashDetection,
547
- init,
542
+ init
548
543
  );
549
544
 
550
545
  const listener = vi.fn();
@@ -552,18 +547,22 @@ describe('Android platform instance', () => {
552
547
  appSession.addListener(listener);
553
548
  await vi.advanceTimersByTimeAsync(0);
554
549
 
555
- expect(startLogcat).toHaveBeenCalledWith('emulator-5554', [
556
- 'logcat',
557
- '-v',
558
- 'threadtime',
559
- '-b',
560
- 'crash',
561
- '--uid=10234',
562
- '-T',
563
- '01-01 00:00:00.000',
564
- ]);
550
+ expect(startLogcat).toHaveBeenCalledWith(
551
+ 'emulator-5554',
552
+ [
553
+ 'logcat',
554
+ '-v',
555
+ 'threadtime',
556
+ '-b',
557
+ 'crash',
558
+ '--uid=10234',
559
+ '-T',
560
+ '01-01 00:00:00.000',
561
+ ],
562
+ { signal: expect.any(AbortSignal) }
563
+ );
565
564
  expect(startLogcat.mock.invocationCallOrder[0]).toBeLessThan(
566
- startApp.mock.invocationCallOrder[0],
565
+ startApp.mock.invocationCallOrder[0]
567
566
  );
568
567
  await expect(appSession.getState()).resolves.toEqual({
569
568
  status: 'running',
@@ -580,7 +579,7 @@ describe('Android platform instance', () => {
580
579
  vi.useFakeTimers();
581
580
  vi.spyOn(
582
581
  await import('../environment.js'),
583
- 'ensureAndroidEmulatorEnvironment',
582
+ 'ensureAndroidEmulatorEnvironment'
584
583
  ).mockResolvedValue('/tmp/android-sdk');
585
584
  vi.spyOn(adb, 'getDeviceIds').mockResolvedValue(['emulator-5554']);
586
585
  vi.spyOn(adb, 'getEmulatorName').mockResolvedValue('Pixel_8_API_35');
@@ -589,11 +588,9 @@ describe('Android platform instance', () => {
589
588
  vi.spyOn(adb, 'reversePort').mockResolvedValue(undefined);
590
589
  vi.spyOn(adb, 'setHideErrorDialogs').mockResolvedValue(undefined);
591
590
  vi.spyOn(adb, 'getAppUid').mockResolvedValue(10234);
592
- vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue(
593
- '01-01 00:00:00.000',
594
- );
591
+ vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue('01-01 00:00:00.000');
595
592
  vi.spyOn(sharedPrefs, 'applyHarnessDebugHttpHost').mockResolvedValue(
596
- undefined,
593
+ undefined
597
594
  );
598
595
  vi.spyOn(adb, 'stopApp').mockResolvedValue(undefined);
599
596
  vi.spyOn(adb, 'startApp').mockResolvedValue(undefined);
@@ -603,7 +600,7 @@ describe('Android platform instance', () => {
603
600
  '--------- beginning of crash',
604
601
  'Process: com.harnessplayground, PID: 7777',
605
602
  'FATAL EXCEPTION: main',
606
- ]),
603
+ ])
607
604
  );
608
605
 
609
606
  const instance = await getAndroidEmulatorPlatformInstance(
@@ -623,7 +620,7 @@ describe('Android platform instance', () => {
623
620
  activityName: '.MainActivity',
624
621
  },
625
622
  harnessConfig,
626
- init,
623
+ init
627
624
  );
628
625
 
629
626
  const listener = vi.fn();
@@ -658,11 +655,9 @@ describe('Android platform instance', () => {
658
655
  vi.spyOn(adb, 'reversePort').mockResolvedValue(undefined);
659
656
  vi.spyOn(adb, 'setHideErrorDialogs').mockResolvedValue(undefined);
660
657
  vi.spyOn(adb, 'getAppUid').mockResolvedValue(10234);
661
- vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue(
662
- '01-01 00:00:00.000',
663
- );
658
+ vi.spyOn(adb, 'getLogcatTimestamp').mockResolvedValue('01-01 00:00:00.000');
664
659
  vi.spyOn(sharedPrefs, 'applyHarnessDebugHttpHost').mockResolvedValue(
665
- undefined,
660
+ undefined
666
661
  );
667
662
  vi.spyOn(adb, 'stopApp').mockResolvedValue(undefined);
668
663
  vi.spyOn(adb, 'startApp').mockResolvedValue(undefined);
@@ -682,7 +677,7 @@ describe('Android platform instance', () => {
682
677
  bundleId: 'com.harnessplayground',
683
678
  activityName: '.MainActivity',
684
679
  },
685
- harnessConfigWithoutNativeCrashDetection,
680
+ harnessConfigWithoutNativeCrashDetection
686
681
  );
687
682
 
688
683
  const listener = vi.fn();
@@ -690,16 +685,20 @@ describe('Android platform instance', () => {
690
685
  appSession.addListener(listener);
691
686
  await vi.advanceTimersByTimeAsync(0);
692
687
 
693
- expect(startLogcat).toHaveBeenCalledWith('012345', [
694
- 'logcat',
695
- '-v',
696
- 'threadtime',
697
- '-b',
698
- 'crash',
699
- '--uid=10234',
700
- '-T',
701
- '01-01 00:00:00.000',
702
- ]);
688
+ expect(startLogcat).toHaveBeenCalledWith(
689
+ '012345',
690
+ [
691
+ 'logcat',
692
+ '-v',
693
+ 'threadtime',
694
+ '-b',
695
+ 'crash',
696
+ '--uid=10234',
697
+ '-T',
698
+ '01-01 00:00:00.000',
699
+ ],
700
+ { signal: expect.any(AbortSignal) }
701
+ );
703
702
  await expect(appSession.getState()).resolves.toEqual({
704
703
  status: 'running',
705
704
  pid: 8765,
@@ -712,7 +711,7 @@ describe('Android platform instance', () => {
712
711
  it('grants permissions when permissions are enabled for emulator', async () => {
713
712
  vi.spyOn(
714
713
  await import('../environment.js'),
715
- 'ensureAndroidEmulatorEnvironment',
714
+ 'ensureAndroidEmulatorEnvironment'
716
715
  ).mockResolvedValue('/tmp/android-sdk');
717
716
  vi.spyOn(adb, 'getDeviceIds').mockResolvedValue(['emulator-5554']);
718
717
  vi.spyOn(adb, 'getEmulatorName').mockResolvedValue('Pixel_8_API_35');
@@ -722,7 +721,7 @@ describe('Android platform instance', () => {
722
721
  vi.spyOn(adb, 'setHideErrorDialogs').mockResolvedValue(undefined);
723
722
  vi.spyOn(adb, 'getAppUid').mockResolvedValue(10234);
724
723
  vi.spyOn(sharedPrefs, 'applyHarnessDebugHttpHost').mockResolvedValue(
725
- undefined,
724
+ undefined
726
725
  );
727
726
  const grantPermissions = vi
728
727
  .spyOn(adb, 'grantPermissions')
@@ -750,19 +749,19 @@ describe('Android platform instance', () => {
750
749
  activityName: '.MainActivity',
751
750
  },
752
751
  harnessConfigWithPermissions,
753
- init,
752
+ init
754
753
  );
755
754
 
756
755
  expect(grantPermissions).toHaveBeenCalledWith(
757
756
  'emulator-5554',
758
- 'com.harnessplayground',
757
+ 'com.harnessplayground'
759
758
  );
760
759
  });
761
760
 
762
761
  it('does not grant permissions when permissions are disabled for emulator', async () => {
763
762
  vi.spyOn(
764
763
  await import('../environment.js'),
765
- 'ensureAndroidEmulatorEnvironment',
764
+ 'ensureAndroidEmulatorEnvironment'
766
765
  ).mockResolvedValue('/tmp/android-sdk');
767
766
  vi.spyOn(adb, 'getDeviceIds').mockResolvedValue(['emulator-5554']);
768
767
  vi.spyOn(adb, 'getEmulatorName').mockResolvedValue('Pixel_8_API_35');
@@ -772,7 +771,7 @@ describe('Android platform instance', () => {
772
771
  vi.spyOn(adb, 'setHideErrorDialogs').mockResolvedValue(undefined);
773
772
  vi.spyOn(adb, 'getAppUid').mockResolvedValue(10234);
774
773
  vi.spyOn(sharedPrefs, 'applyHarnessDebugHttpHost').mockResolvedValue(
775
- undefined,
774
+ undefined
776
775
  );
777
776
  const grantPermissions = vi
778
777
  .spyOn(adb, 'grantPermissions')
@@ -795,7 +794,7 @@ describe('Android platform instance', () => {
795
794
  activityName: '.MainActivity',
796
795
  },
797
796
  harnessConfig,
798
- init,
797
+ init
799
798
  );
800
799
 
801
800
  expect(grantPermissions).not.toHaveBeenCalled();
@@ -812,7 +811,7 @@ describe('Android platform instance', () => {
812
811
  vi.spyOn(adb, 'setHideErrorDialogs').mockResolvedValue(undefined);
813
812
  vi.spyOn(adb, 'getAppUid').mockResolvedValue(10234);
814
813
  vi.spyOn(sharedPrefs, 'applyHarnessDebugHttpHost').mockResolvedValue(
815
- undefined,
814
+ undefined
816
815
  );
817
816
  const grantPermissions = vi
818
817
  .spyOn(adb, 'grantPermissions')
@@ -834,12 +833,12 @@ describe('Android platform instance', () => {
834
833
  bundleId: 'com.harnessplayground',
835
834
  activityName: '.MainActivity',
836
835
  },
837
- harnessConfigWithPermissions,
836
+ harnessConfigWithPermissions
838
837
  );
839
838
 
840
839
  expect(grantPermissions).toHaveBeenCalledWith(
841
840
  '012345',
842
- 'com.harnessplayground',
841
+ 'com.harnessplayground'
843
842
  );
844
843
  });
845
844
  });