@react-native-harness/jest 1.3.0 → 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 (98) hide show
  1. package/dist/__tests__/bridge.test.js +29 -4
  2. package/dist/__tests__/crash-monitor.test.js +194 -176
  3. package/dist/__tests__/environment-reset.test.d.ts +2 -0
  4. package/dist/__tests__/environment-reset.test.d.ts.map +1 -0
  5. package/dist/__tests__/environment-reset.test.js +238 -0
  6. package/dist/__tests__/errors.test.js +39 -0
  7. package/dist/__tests__/execute-run.test.js +439 -29
  8. package/dist/__tests__/format-harness-error.test.d.ts +2 -0
  9. package/dist/__tests__/format-harness-error.test.d.ts.map +1 -0
  10. package/dist/__tests__/format-harness-error.test.js +27 -0
  11. package/dist/__tests__/harness-cache.test.js +62 -41
  12. package/dist/__tests__/harness-session-signal.test.d.ts +2 -0
  13. package/dist/__tests__/harness-session-signal.test.d.ts.map +1 -0
  14. package/dist/__tests__/harness-session-signal.test.js +298 -0
  15. package/dist/__tests__/harness-session.test.js +217 -234
  16. package/dist/__tests__/index.test.js +62 -11
  17. package/dist/__tests__/metro-port.test.js +2 -0
  18. package/dist/__tests__/run.test.d.ts +2 -0
  19. package/dist/__tests__/run.test.d.ts.map +1 -0
  20. package/dist/__tests__/run.test.js +48 -0
  21. package/dist/__tests__/test-file-platform-filter.test.d.ts +2 -0
  22. package/dist/__tests__/test-file-platform-filter.test.d.ts.map +1 -0
  23. package/dist/__tests__/test-file-platform-filter.test.js +47 -0
  24. package/dist/crash-monitor.d.ts +12 -4
  25. package/dist/crash-monitor.d.ts.map +1 -1
  26. package/dist/crash-monitor.js +135 -102
  27. package/dist/diagnostics/__tests__/derivers.test.d.ts +2 -0
  28. package/dist/diagnostics/__tests__/derivers.test.d.ts.map +1 -0
  29. package/dist/diagnostics/__tests__/derivers.test.js +248 -0
  30. package/dist/diagnostics/__tests__/report.test.d.ts +2 -0
  31. package/dist/diagnostics/__tests__/report.test.d.ts.map +1 -0
  32. package/dist/diagnostics/__tests__/report.test.js +97 -0
  33. package/dist/diagnostics/derivers.d.ts +24 -0
  34. package/dist/diagnostics/derivers.d.ts.map +1 -0
  35. package/dist/diagnostics/derivers.js +146 -0
  36. package/dist/diagnostics/index.d.ts +3 -0
  37. package/dist/diagnostics/index.d.ts.map +1 -0
  38. package/dist/diagnostics/index.js +2 -0
  39. package/dist/diagnostics/report.d.ts +7 -0
  40. package/dist/diagnostics/report.d.ts.map +1 -0
  41. package/dist/diagnostics/report.js +84 -0
  42. package/dist/environment-reset.d.ts +51 -0
  43. package/dist/environment-reset.d.ts.map +1 -0
  44. package/dist/environment-reset.js +83 -0
  45. package/dist/errors.d.ts +10 -0
  46. package/dist/errors.d.ts.map +1 -1
  47. package/dist/errors.js +41 -2
  48. package/dist/execute-run.d.ts +4 -2
  49. package/dist/execute-run.d.ts.map +1 -1
  50. package/dist/execute-run.js +179 -49
  51. package/dist/format-harness-error.d.ts +5 -0
  52. package/dist/format-harness-error.d.ts.map +1 -0
  53. package/dist/format-harness-error.js +43 -0
  54. package/dist/harness-session.d.ts +46 -1
  55. package/dist/harness-session.d.ts.map +1 -1
  56. package/dist/harness-session.js +386 -118
  57. package/dist/index.d.ts +7 -3
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +24 -2
  60. package/dist/run.d.ts.map +1 -1
  61. package/dist/run.js +22 -4
  62. package/dist/test-file-platform-filter.d.ts +5 -0
  63. package/dist/test-file-platform-filter.d.ts.map +1 -0
  64. package/dist/test-file-platform-filter.js +40 -0
  65. package/dist/toTestResult.d.ts +1 -0
  66. package/dist/toTestResult.d.ts.map +1 -1
  67. package/dist/toTestResult.js +2 -2
  68. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  69. package/package.json +8 -7
  70. package/src/__tests__/bridge.test.ts +45 -5
  71. package/src/__tests__/crash-monitor.test.ts +234 -199
  72. package/src/__tests__/environment-reset.test.ts +308 -0
  73. package/src/__tests__/errors.test.ts +75 -0
  74. package/src/__tests__/execute-run.test.ts +561 -37
  75. package/src/__tests__/format-harness-error.test.ts +32 -0
  76. package/src/__tests__/harness-cache.test.ts +91 -0
  77. package/src/__tests__/harness-session.test.ts +303 -0
  78. package/src/__tests__/index.test.ts +92 -12
  79. package/src/__tests__/metro-port.test.ts +2 -0
  80. package/src/__tests__/run.test.ts +74 -0
  81. package/src/__tests__/test-file-platform-filter.test.ts +83 -0
  82. package/src/crash-monitor.ts +220 -131
  83. package/src/diagnostics/__tests__/derivers.test.ts +300 -0
  84. package/src/diagnostics/__tests__/report.test.ts +128 -0
  85. package/src/diagnostics/derivers.ts +170 -0
  86. package/src/diagnostics/index.ts +2 -0
  87. package/src/diagnostics/report.ts +124 -0
  88. package/src/environment-reset.ts +138 -0
  89. package/src/errors.ts +62 -1
  90. package/src/execute-run.ts +230 -57
  91. package/src/format-harness-error.ts +73 -0
  92. package/src/harness-session.ts +535 -162
  93. package/src/index.ts +40 -11
  94. package/src/run.ts +24 -4
  95. package/src/test-file-platform-filter.ts +57 -0
  96. package/src/toTestResult.ts +3 -2
  97. package/tsconfig.json +3 -0
  98. package/tsconfig.lib.json +3 -0
@@ -1,51 +1,72 @@
1
1
  import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- const mocks = vi.hoisted(() => ({
3
- isMetroCacheReusable: vi.fn(),
4
- logMetroCacheReused: vi.fn(),
5
- logMetroPrewarmCompleted: vi.fn(),
6
- }));
7
- vi.mock('@react-native-harness/bundler-metro', () => ({
8
- isMetroCacheReusable: mocks.isMetroCacheReusable,
2
+ import { maybeLogMetroCacheReused } from '../harness-session.js';
3
+ const { createHarnessCache, isWarm, logMetroCacheReused } = vi.hoisted(() => {
4
+ const isWarm = vi.fn();
5
+ return {
6
+ isWarm,
7
+ createHarnessCache: vi.fn((options) => ({
8
+ paths: {
9
+ root: `${options.projectRoot}/.harness/cache`,
10
+ metroTransform: `${options.projectRoot}/.harness/cache/metro`,
11
+ metroFileMap: `${options.projectRoot}/.harness/cache/metro-file-map`,
12
+ },
13
+ isWarm,
14
+ ensureDomainDirectories: vi.fn(),
15
+ })),
16
+ logMetroCacheReused: vi.fn(),
17
+ };
18
+ });
19
+ vi.mock('@react-native-harness/cache', () => ({
20
+ createHarnessCache,
9
21
  }));
10
- vi.mock('../logs.js', () => ({
11
- logMetroCacheReused: mocks.logMetroCacheReused,
12
- logMetroPrewarmCompleted: mocks.logMetroPrewarmCompleted,
22
+ vi.mock('../logs.js', async (importOriginal) => ({
23
+ ...(await importOriginal()),
24
+ logMetroCacheReused,
13
25
  }));
14
- import { maybeLogMetroCacheReuse } from '../harness.js';
15
- const platform = {
16
- name: 'ios',
17
- platformId: 'ios',
18
- runner: '/virtual/platform-runner.js',
19
- config: {},
20
- getResourceLockKey: () => 'ios:simulator:iPhone 17 Pro:26.2',
21
- };
22
- const createHarnessConfig = (overrides = {}) => ({
23
- appRegistryComponentName: 'App',
24
- disableViewFlattening: false,
25
- bridgeTimeout: 5000,
26
- entryPoint: 'index.js',
27
- unstable__enableMetroCache: true,
28
- forwardClientLogs: false,
29
- ...overrides,
30
- });
31
- describe('maybeLogMetroCacheReuse', () => {
26
+ const platform = { name: 'test-runner' };
27
+ describe('maybeLogMetroCacheReused', () => {
32
28
  beforeEach(() => {
33
29
  vi.clearAllMocks();
34
- mocks.isMetroCacheReusable.mockReturnValue(false);
35
30
  });
36
- it('logs when an existing metro cache will be reused', () => {
37
- mocks.isMetroCacheReusable.mockReturnValue(true);
38
- maybeLogMetroCacheReuse(createHarnessConfig(), platform, '/tmp/project');
39
- expect(mocks.isMetroCacheReusable).toHaveBeenCalledWith('/tmp/project');
40
- expect(mocks.logMetroCacheReused).toHaveBeenCalledWith(platform);
31
+ it('logs the reuse message when caching is enabled and the cache is warm', () => {
32
+ isWarm.mockReturnValue(true);
33
+ maybeLogMetroCacheReused({
34
+ config: { cache: { metro: true } },
35
+ projectRoot: '/tmp/app',
36
+ platform,
37
+ });
38
+ expect(createHarnessCache).toHaveBeenCalledWith({
39
+ projectRoot: '/tmp/app',
40
+ });
41
+ expect(isWarm).toHaveBeenCalledWith('metro');
42
+ expect(logMetroCacheReused).toHaveBeenCalledWith(platform);
43
+ });
44
+ it('logs the reuse message with a warm cache when caching is on by default', () => {
45
+ isWarm.mockReturnValue(true);
46
+ maybeLogMetroCacheReused({
47
+ config: {},
48
+ projectRoot: '/tmp/app',
49
+ platform,
50
+ });
51
+ expect(logMetroCacheReused).toHaveBeenCalledWith(platform);
41
52
  });
42
- it('does not log when metro cache reuse is disabled', () => {
43
- maybeLogMetroCacheReuse(createHarnessConfig({ unstable__enableMetroCache: false }), platform, '/tmp/project');
44
- expect(mocks.isMetroCacheReusable).not.toHaveBeenCalled();
45
- expect(mocks.logMetroCacheReused).not.toHaveBeenCalled();
53
+ it('does not log when caching is enabled but the cache is cold', () => {
54
+ isWarm.mockReturnValue(false);
55
+ maybeLogMetroCacheReused({
56
+ config: { cache: { metro: true } },
57
+ projectRoot: '/tmp/app',
58
+ platform,
59
+ });
60
+ expect(logMetroCacheReused).not.toHaveBeenCalled();
46
61
  });
47
- it('does not log when the metro cache is absent', () => {
48
- maybeLogMetroCacheReuse(createHarnessConfig(), platform, '/tmp/project');
49
- expect(mocks.logMetroCacheReused).not.toHaveBeenCalled();
62
+ it('does not log when caching is disabled, regardless of cache state', () => {
63
+ isWarm.mockReturnValue(true);
64
+ maybeLogMetroCacheReused({
65
+ config: { cache: { metro: false } },
66
+ projectRoot: '/tmp/app',
67
+ platform,
68
+ });
69
+ expect(createHarnessCache).not.toHaveBeenCalled();
70
+ expect(logMetroCacheReused).not.toHaveBeenCalled();
50
71
  });
51
72
  });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=harness-session-signal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-session-signal.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/harness-session-signal.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,298 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
6
+ const toolMocks = vi.hoisted(() => ({
7
+ createCrashArtifactWriter: vi.fn(() => ({
8
+ persistArtifact: vi.fn(() => '/tmp/harness-artifact'),
9
+ })),
10
+ createHarnessBridge: vi.fn(),
11
+ createHarnessPluginManager: vi.fn(),
12
+ createHookQueue: vi.fn(),
13
+ createClientLogCollector: vi.fn(),
14
+ createCrashMonitor: vi.fn(),
15
+ getConfig: vi.fn(),
16
+ getMetroInstance: vi.fn(),
17
+ getAdditionalCliArgs: vi.fn(),
18
+ logNoop: vi.fn(),
19
+ lockAcquire: vi.fn(),
20
+ processExit: vi.fn(),
21
+ processOff: vi.fn(),
22
+ processOnce: vi.fn(),
23
+ resolveHarnessMetroPort: vi.fn(),
24
+ runnerFactory: vi.fn(),
25
+ }));
26
+ vi.mock('@react-native-harness/config', () => ({
27
+ ConfigSchema: {
28
+ parse: vi.fn((value) => value),
29
+ },
30
+ getConfig: toolMocks.getConfig,
31
+ }));
32
+ vi.mock('@react-native-harness/bundler-metro', () => ({
33
+ getMetroInstance: toolMocks.getMetroInstance,
34
+ isMetroCacheReusable: vi.fn(() => false),
35
+ waitForMetroBackedAppReady: vi.fn(),
36
+ }));
37
+ vi.mock('@react-native-harness/bridge/server', () => ({
38
+ createHarnessBridge: toolMocks.createHarnessBridge,
39
+ }));
40
+ vi.mock('@react-native-harness/plugins', () => ({
41
+ createHarnessPluginManager: toolMocks.createHarnessPluginManager,
42
+ }));
43
+ vi.mock('@react-native-harness/tools', async () => {
44
+ const actual = await vi.importActual('@react-native-harness/tools');
45
+ return {
46
+ ...actual,
47
+ createCrashArtifactWriter: toolMocks.createCrashArtifactWriter,
48
+ };
49
+ });
50
+ vi.mock('jest-util', () => ({
51
+ preRunMessage: {
52
+ remove: vi.fn(),
53
+ },
54
+ }));
55
+ vi.mock('../action-hooks.js', () => ({
56
+ createActionHooksPlugin: vi.fn(() => ({})),
57
+ }));
58
+ vi.mock('../client-log-handler.js', () => ({
59
+ createClientLogCollector: toolMocks.createClientLogCollector,
60
+ }));
61
+ vi.mock('../crash-monitor.js', () => ({
62
+ createCrashMonitor: toolMocks.createCrashMonitor,
63
+ }));
64
+ vi.mock('../hook-queue.js', () => ({
65
+ createHookQueue: toolMocks.createHookQueue,
66
+ }));
67
+ vi.mock('../cli-args.js', () => ({
68
+ getAdditionalCliArgs: toolMocks.getAdditionalCliArgs,
69
+ }));
70
+ vi.mock('../logs.js', () => ({
71
+ logMetroCacheReused: toolMocks.logNoop,
72
+ logMetroPortFallback: toolMocks.logNoop,
73
+ logNativeCoverageCollected: toolMocks.logNoop,
74
+ logRunnerStarting: toolMocks.logNoop,
75
+ logRunnerStillWaitingInQueue: toolMocks.logNoop,
76
+ logRunnerWaitingInQueue: toolMocks.logNoop,
77
+ logTestEnvironmentReady: toolMocks.logNoop,
78
+ logTestRunHeader: toolMocks.logNoop,
79
+ }));
80
+ vi.mock('../metro-port.js', () => ({
81
+ resolveHarnessMetroPort: toolMocks.resolveHarnessMetroPort,
82
+ }));
83
+ vi.mock('../resource-lock.js', () => ({
84
+ createResourceLockManager: vi.fn(() => ({
85
+ acquire: toolMocks.lockAcquire,
86
+ })),
87
+ }));
88
+ import { createHarnessSession, getSignalExitCodeForRunState, handleHarnessSignal, } from '../harness-session.js';
89
+ const signalListeners = new Map();
90
+ const createTempRunnerModule = () => {
91
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'rn-harness-session-'));
92
+ const runnerPath = path.join(root, 'runner.mjs');
93
+ fs.writeFileSync(runnerPath, [
94
+ 'export default async function runner(config, harnessConfig, init) {',
95
+ ' return globalThis.__RN_HARNESS_TEST_RUNNER__(config, harnessConfig, init);',
96
+ '}',
97
+ ].join('\n'));
98
+ return {
99
+ root,
100
+ runnerUrl: pathToFileURL(runnerPath).href,
101
+ };
102
+ };
103
+ const createHarnessConfig = (runnerUrl) => {
104
+ const runnerConfig = {
105
+ name: 'ios',
106
+ platformId: 'ios',
107
+ runner: runnerUrl,
108
+ config: {},
109
+ getResourceLockKey: () => 'test-lock',
110
+ };
111
+ return {
112
+ bridgeTimeout: 1000,
113
+ bundleStartTimeout: 1000,
114
+ defaultRunner: 'ios',
115
+ detectNativeCrashes: true,
116
+ forwardClientLogs: false,
117
+ maxAppRestarts: 1,
118
+ metroPort: 8081,
119
+ permissions: false,
120
+ platformReadyTimeout: 1000,
121
+ plugins: [],
122
+ runners: [runnerConfig],
123
+ unstable__enableMetroCache: false,
124
+ };
125
+ };
126
+ const createAppSession = () => ({
127
+ addListener: vi.fn(),
128
+ dispose: vi.fn(async () => undefined),
129
+ getCrashDetails: vi.fn(async () => null),
130
+ getLogs: vi.fn(() => []),
131
+ getState: vi.fn(async () => ({ status: 'running' })),
132
+ removeListener: vi.fn(),
133
+ });
134
+ beforeEach(() => {
135
+ signalListeners.clear();
136
+ vi.spyOn(process, 'once').mockImplementation((event, listener) => {
137
+ signalListeners.set(String(event), listener);
138
+ return process;
139
+ });
140
+ vi.spyOn(process, 'off').mockImplementation((event, listener) => {
141
+ if (signalListeners.get(String(event)) === listener) {
142
+ signalListeners.delete(String(event));
143
+ }
144
+ return process;
145
+ });
146
+ toolMocks.getAdditionalCliArgs.mockReturnValue({});
147
+ toolMocks.lockAcquire.mockResolvedValue({ release: vi.fn(async () => undefined) });
148
+ toolMocks.resolveHarnessMetroPort.mockImplementation(async ({ config }) => ({
149
+ config,
150
+ didFallback: false,
151
+ initialMetroPort: config.metroPort,
152
+ metroPortLease: {
153
+ release: vi.fn(async () => undefined),
154
+ },
155
+ }));
156
+ toolMocks.createHarnessBridge.mockResolvedValue({
157
+ connection: null,
158
+ dispose: vi.fn(async () => undefined),
159
+ off: vi.fn(),
160
+ on: vi.fn(),
161
+ ws: {},
162
+ });
163
+ toolMocks.getMetroInstance.mockResolvedValue({
164
+ dispose: vi.fn(async () => undefined),
165
+ events: {
166
+ addListener: vi.fn(),
167
+ removeListener: vi.fn(),
168
+ },
169
+ });
170
+ toolMocks.createHarnessPluginManager.mockReturnValue({
171
+ hasPlugins: () => false,
172
+ callHook: vi.fn(async () => undefined),
173
+ });
174
+ toolMocks.createHookQueue.mockReturnValue({
175
+ drain: vi.fn(async () => undefined),
176
+ schedule: vi.fn((task) => task()),
177
+ });
178
+ toolMocks.createClientLogCollector.mockReturnValue({
179
+ flush: vi.fn(() => []),
180
+ handleEvent: vi.fn(),
181
+ });
182
+ toolMocks.createCrashMonitor.mockReturnValue({
183
+ dispose: vi.fn(async () => undefined),
184
+ handleBridgeDisconnect: vi.fn(),
185
+ isAlive: vi.fn(() => false),
186
+ reset: vi.fn(),
187
+ setAppSession: vi.fn(),
188
+ start: vi.fn(async () => undefined),
189
+ stop: vi.fn(async () => undefined),
190
+ watch: vi.fn(() => ({
191
+ cancel: vi.fn(),
192
+ promise: Promise.resolve({}),
193
+ })),
194
+ });
195
+ toolMocks.runnerFactory.mockReset();
196
+ toolMocks.getConfig.mockResolvedValue({ config: {} });
197
+ });
198
+ afterEach(() => {
199
+ vi.restoreAllMocks();
200
+ delete globalThis.__RN_HARNESS_TEST_RUNNER__;
201
+ });
202
+ describe('createHarnessSession signal flow', () => {
203
+ it('passes session signal into createAppSession and aborts it on dispose', async () => {
204
+ const { root, runnerUrl } = createTempRunnerModule();
205
+ const appSession = createAppSession();
206
+ const createAppSessionMock = vi.fn(async (_options, _context) => {
207
+ void _options;
208
+ void _context;
209
+ return appSession;
210
+ });
211
+ globalThis.__RN_HARNESS_TEST_RUNNER__ = toolMocks.runnerFactory.mockImplementation(async () => ({
212
+ createAppSession: createAppSessionMock,
213
+ dispose: vi.fn(async () => undefined),
214
+ }));
215
+ toolMocks.getConfig.mockResolvedValue({
216
+ config: createHarnessConfig(runnerUrl),
217
+ });
218
+ try {
219
+ const session = await createHarnessSession({ rootDir: root }, {
220
+ lockManager: {
221
+ acquire: toolMocks.lockAcquire,
222
+ },
223
+ });
224
+ await session.restartApp();
225
+ const runState = {
226
+ coverageEnabled: false,
227
+ runId: 'run-1',
228
+ startTime: Date.now(),
229
+ status: 'passed',
230
+ summary: {
231
+ failed: 0,
232
+ passed: 1,
233
+ skipped: 0,
234
+ todo: 0,
235
+ },
236
+ testFiles: ['foo.test.ts'],
237
+ watchMode: false,
238
+ };
239
+ session.setRunState(runState);
240
+ expect(createAppSessionMock).toHaveBeenCalledWith(undefined, expect.objectContaining({
241
+ signal: expect.any(AbortSignal),
242
+ }));
243
+ const context = createAppSessionMock.mock.calls[0]?.[1];
244
+ expect(context?.signal).toBeInstanceOf(AbortSignal);
245
+ expect(context?.signal?.aborted).toBe(false);
246
+ await session.dispose();
247
+ expect(context?.signal?.aborted).toBe(true);
248
+ }
249
+ finally {
250
+ fs.rmSync(root, { recursive: true, force: true });
251
+ }
252
+ });
253
+ it('maps run state to exit code and aborts controller', async () => {
254
+ const controller = new AbortController();
255
+ const dispose = vi.fn(async () => undefined);
256
+ const exit = vi.fn();
257
+ const failedRun = {
258
+ coverageEnabled: false,
259
+ error: new Error('failed'),
260
+ runId: 'run-2',
261
+ startTime: Date.now(),
262
+ status: 'failed',
263
+ summary: {
264
+ failed: 1,
265
+ passed: 0,
266
+ skipped: 0,
267
+ todo: 0,
268
+ },
269
+ testFiles: ['foo.test.ts'],
270
+ watchMode: false,
271
+ };
272
+ await handleHarnessSignal({
273
+ currentRun: {
274
+ coverageEnabled: false,
275
+ completed: true,
276
+ runId: 'run-2',
277
+ startTime: Date.now(),
278
+ status: 'passed',
279
+ summary: {
280
+ failed: 0,
281
+ passed: 1,
282
+ skipped: 0,
283
+ todo: 0,
284
+ },
285
+ testFiles: ['foo.test.ts'],
286
+ watchMode: false,
287
+ },
288
+ dispose,
289
+ exit,
290
+ sessionController: controller,
291
+ });
292
+ expect(controller.signal.aborted).toBe(true);
293
+ expect(dispose).toHaveBeenCalledTimes(1);
294
+ expect(exit).toHaveBeenCalledWith(0);
295
+ expect(getSignalExitCodeForRunState(failedRun)).toBe(1);
296
+ expect(getSignalExitCodeForRunState(null)).toBe(1);
297
+ });
298
+ });