@overkill-dev/engine 0.0.40 → 0.0.42

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 (59) hide show
  1. package/clock/overkill-clock.d.ts +30 -0
  2. package/clock/overkill-clock.d.ts.map +1 -0
  3. package/clock/overkill-clock.js +53 -0
  4. package/clock/overkill-clock.js.map +1 -0
  5. package/engine/async-leak-diagnostics.d.ts.map +1 -1
  6. package/engine/async-leak-diagnostics.js +10 -0
  7. package/engine/async-leak-diagnostics.js.map +1 -1
  8. package/engine/case-execution.d.ts +3 -3
  9. package/engine/case-execution.d.ts.map +1 -1
  10. package/engine/case-execution.js +22 -10
  11. package/engine/case-execution.js.map +1 -1
  12. package/engine/engine.d.ts +2 -2
  13. package/engine/engine.d.ts.map +1 -1
  14. package/engine/execution-async-leak-policy.d.ts.map +1 -1
  15. package/engine/execution-async-leak-policy.js +3 -2
  16. package/engine/execution-async-leak-policy.js.map +1 -1
  17. package/engine/execution-global-error-observer.d.ts +20 -0
  18. package/engine/execution-global-error-observer.d.ts.map +1 -0
  19. package/engine/execution-global-error-observer.js +342 -0
  20. package/engine/execution-global-error-observer.js.map +1 -0
  21. package/engine/execution-result.js +5 -1
  22. package/engine/execution-result.js.map +1 -1
  23. package/engine/execution-supervision.d.ts +7 -5
  24. package/engine/execution-supervision.d.ts.map +1 -1
  25. package/engine/execution-supervision.js +47 -29
  26. package/engine/execution-supervision.js.map +1 -1
  27. package/engine/execution-test-plan-cases.js +72 -14
  28. package/engine/execution-test-plan-cases.js.map +1 -1
  29. package/engine/execution.d.ts +2 -2
  30. package/engine/execution.d.ts.map +1 -1
  31. package/engine/execution.js +38 -20
  32. package/engine/execution.js.map +1 -1
  33. package/engine/reporter-dispatcher.d.ts +2 -2
  34. package/engine/reporter-dispatcher.d.ts.map +1 -1
  35. package/engine/reporter-dispatcher.js +1 -0
  36. package/engine/reporter-dispatcher.js.map +1 -1
  37. package/engine/reporter.d.ts +1 -1
  38. package/engine/reporter.d.ts.map +1 -1
  39. package/engine/resource-usage-growth.js +4 -4
  40. package/engine/resource-usage-growth.js.map +1 -1
  41. package/engine/run-result.d.ts +88 -7
  42. package/engine/run-result.d.ts.map +1 -1
  43. package/engine/run-result.js +114 -0
  44. package/engine/run-result.js.map +1 -1
  45. package/engine/run-timings.d.ts +68 -0
  46. package/engine/run-timings.d.ts.map +1 -0
  47. package/engine/run-timings.js +116 -0
  48. package/engine/run-timings.js.map +1 -0
  49. package/engine/test-data.d.ts +4 -0
  50. package/engine/test-data.d.ts.map +1 -1
  51. package/engine/test-data.js +14 -1
  52. package/engine/test-data.js.map +1 -1
  53. package/package.json +3 -2
  54. package/packages/engine/engine.entry-point.d.ts +5 -3
  55. package/packages/engine/engine.entry-point.d.ts.map +1 -1
  56. package/packages/engine/engine.entry-point.js +3 -3
  57. package/packages/engine/engine.entry-point.js.map +1 -1
  58. package/readme.md +3 -1
  59. package/sbom.cdx.json +4 -21
@@ -0,0 +1,342 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { caseIdentityKey } from "./identity.js";
3
+ import { permissionDeniedRunnerErrorFromThrown } from "./run-result.js";
4
+ function createStoredValue(initialValue) {
5
+ let currentValue = initialValue;
6
+ return {
7
+ read() {
8
+ return currentValue;
9
+ },
10
+ write(value) {
11
+ currentValue = value;
12
+ }
13
+ };
14
+ }
15
+ function createRunErrorScope(boundary) {
16
+ const activeCaseKeys = new Set();
17
+ const errors = [];
18
+ const fatal = createStoredValue(false);
19
+ const fatalHandlers = new Set();
20
+ const fatalSignal = createStoredValue(null);
21
+ const phase = createStoredValue('run');
22
+ const stopped = createStoredValue(false);
23
+ function notifyFatal(error) {
24
+ if (!fatal.read()) {
25
+ fatal.write(true);
26
+ fatalSignal.read()?.resolve(undefined);
27
+ }
28
+ for (const handler of fatalHandlers) {
29
+ handler(error);
30
+ }
31
+ }
32
+ return {
33
+ activeCaseStarted(key) {
34
+ activeCaseKeys.add(key);
35
+ },
36
+ activeCaseStopped(key) {
37
+ activeCaseKeys.delete(key);
38
+ },
39
+ boundary,
40
+ async fatalSignal() {
41
+ if (fatal.read()) {
42
+ return;
43
+ }
44
+ const currentFatalSignal = fatalSignal.read() ?? Promise.withResolvers();
45
+ fatalSignal.write(currentFatalSignal);
46
+ await currentFatalSignal.promise;
47
+ },
48
+ hasActiveCase(key) {
49
+ return activeCaseKeys.has(key);
50
+ },
51
+ hasFatalError() {
52
+ return fatal.read();
53
+ },
54
+ onFatalError(handler) {
55
+ fatalHandlers.add(handler);
56
+ return function removeFatalErrorHandler() {
57
+ fatalHandlers.delete(handler);
58
+ };
59
+ },
60
+ phase() {
61
+ return phase.read();
62
+ },
63
+ recordError(error) {
64
+ if (stopped.read()) {
65
+ return;
66
+ }
67
+ errors.push(error);
68
+ notifyFatal(error);
69
+ },
70
+ async runPhase(nextPhase, run) {
71
+ const previousPhase = phase.read();
72
+ phase.write(nextPhase);
73
+ try {
74
+ return await run();
75
+ }
76
+ finally {
77
+ phase.write(previousPhase);
78
+ }
79
+ },
80
+ stop() {
81
+ stopped.write(true);
82
+ fatalHandlers.clear();
83
+ },
84
+ takeErrors() {
85
+ const currentErrors = Array.from(errors);
86
+ errors.length = 0;
87
+ return currentErrors;
88
+ }
89
+ };
90
+ }
91
+ function createActiveScopes() {
92
+ const scopes = [];
93
+ return {
94
+ add(scope) {
95
+ scopes.push(scope);
96
+ },
97
+ all() {
98
+ return Array.from(scopes);
99
+ },
100
+ includes(scope) {
101
+ return scopes.includes(scope);
102
+ },
103
+ remove(scope) {
104
+ const index = scopes.lastIndexOf(scope);
105
+ if (index !== -1) {
106
+ scopes.splice(index, 1);
107
+ }
108
+ },
109
+ size() {
110
+ return scopes.length;
111
+ }
112
+ };
113
+ }
114
+ export function createDisabledExecutionGlobalErrorObserver() {
115
+ const neverFatal = Promise.race([]);
116
+ return {
117
+ async fatalSignal() {
118
+ await neverFatal;
119
+ },
120
+ hasFatalError() {
121
+ return false;
122
+ },
123
+ onFatalError() {
124
+ return function removeDisabledFatalHandler() {
125
+ return undefined;
126
+ };
127
+ },
128
+ async runBoundary(run) {
129
+ return await run();
130
+ },
131
+ async runCase(_testCase, run) {
132
+ return await run();
133
+ },
134
+ async runPhase(_phase, run) {
135
+ return await run();
136
+ },
137
+ stop() {
138
+ return undefined;
139
+ },
140
+ takeErrors() {
141
+ return [];
142
+ }
143
+ };
144
+ }
145
+ const runScopeStorage = new AsyncLocalStorage();
146
+ const activeCaseStorage = new AsyncLocalStorage();
147
+ const activeScopes = createActiveScopes();
148
+ const listenersInstalled = createStoredValue(false);
149
+ function serializedReason(reason) {
150
+ if (reason instanceof Error) {
151
+ return {
152
+ message: reason.message,
153
+ name: reason.name,
154
+ stack: reason.stack ?? null
155
+ };
156
+ }
157
+ return {
158
+ message: String(reason),
159
+ name: 'Error',
160
+ stack: null
161
+ };
162
+ }
163
+ function hookSubtype(hook) {
164
+ return hook === 'uncaughtException' ? 'uncaught-exception' : 'unhandled-rejection';
165
+ }
166
+ function hookMessage(hook, reason) {
167
+ const label = hook === 'uncaughtException' ? 'Uncaught exception' : 'Unhandled rejection';
168
+ return `${label}: ${reason.message}`;
169
+ }
170
+ function hookCause(scope, hook, reason, activeCase) {
171
+ return {
172
+ boundary: scope.boundary,
173
+ hook,
174
+ origin: {
175
+ case: activeCase?.id ?? null,
176
+ work: activeCase?.workId ?? null
177
+ },
178
+ phase: activeCase === null ? scope.phase() : 'body',
179
+ reason: serializedReason(reason)
180
+ };
181
+ }
182
+ function attributedError(scope, hook, reason, activeCase) {
183
+ const cause = hookCause(scope, hook, reason, activeCase);
184
+ return {
185
+ attributedTo: activeCase.id,
186
+ attributedToWork: activeCase.workId,
187
+ cause,
188
+ diagnostics: [],
189
+ message: hookMessage(hook, cause.reason),
190
+ subtype: hookSubtype(hook)
191
+ };
192
+ }
193
+ function runLevelHookError(scope, hook, reason) {
194
+ const cause = hookCause(scope, hook, reason, null);
195
+ return {
196
+ attributedTo: null,
197
+ attributedToWork: null,
198
+ cause,
199
+ diagnostics: [],
200
+ message: hookMessage(hook, cause.reason),
201
+ subtype: hookSubtype(hook)
202
+ };
203
+ }
204
+ function attributionDriftError(scope, hook, reason, activeCase) {
205
+ const cause = hookCause(scope, hook, reason, activeCase);
206
+ return {
207
+ attributedTo: null,
208
+ attributedToWork: null,
209
+ cause,
210
+ diagnostics: [],
211
+ message: `Async failure could not be attributed safely: ${cause.reason.message}`,
212
+ subtype: 'attribution-drift'
213
+ };
214
+ }
215
+ function scopeIncludesCase(scope, activeCase) {
216
+ return activeCase !== null && activeCase.scope === scope;
217
+ }
218
+ function activePermissionCase(input) {
219
+ if (!scopeIncludesCase(input.scope, input.activeCase)) {
220
+ return null;
221
+ }
222
+ return input.scope.hasActiveCase(input.activeCase.key) ? input.activeCase : null;
223
+ }
224
+ function permissionErrorForScope(input) {
225
+ const activeCase = activePermissionCase(input);
226
+ return permissionDeniedRunnerErrorFromThrown(input.reason, {
227
+ attributedTo: activeCase?.id ?? null,
228
+ attributedToWork: activeCase?.workId ?? null,
229
+ boundary: input.scope.boundary,
230
+ diagnosticChannel: null,
231
+ hook: input.hook,
232
+ phase: activeCase === null ? input.scope.phase() : 'body'
233
+ });
234
+ }
235
+ function errorForScope(input) {
236
+ const permissionError = permissionErrorForScope(input);
237
+ if (permissionError !== null) {
238
+ return permissionError;
239
+ }
240
+ if (input.ambiguousScope) {
241
+ return attributionDriftError(input.scope, input.hook, input.reason, scopeIncludesCase(input.scope, input.activeCase) ? input.activeCase : null);
242
+ }
243
+ if (!scopeIncludesCase(input.scope, input.activeCase)) {
244
+ return runLevelHookError(input.scope, input.hook, input.reason);
245
+ }
246
+ if (input.scope.hasActiveCase(input.activeCase.key)) {
247
+ return attributedError(input.scope, input.hook, input.reason, input.activeCase);
248
+ }
249
+ return attributionDriftError(input.scope, input.hook, input.reason, input.activeCase);
250
+ }
251
+ function currentTargetScopes() {
252
+ const currentScope = runScopeStorage.getStore();
253
+ if (currentScope !== undefined && activeScopes.includes(currentScope)) {
254
+ return [currentScope];
255
+ }
256
+ return activeScopes.all();
257
+ }
258
+ function receiveHookFailure(hook, reason) {
259
+ const activeCase = activeCaseStorage.getStore() ?? null;
260
+ const ambiguousScope = runScopeStorage.getStore() === undefined && activeScopes.size() > 1;
261
+ for (const scope of currentTargetScopes()) {
262
+ scope.recordError(errorForScope({ activeCase, ambiguousScope, hook, reason, scope }));
263
+ }
264
+ }
265
+ function receiveUnhandledRejection(reason) {
266
+ receiveHookFailure('unhandledRejection', reason);
267
+ }
268
+ function receiveUncaughtException(error) {
269
+ receiveHookFailure('uncaughtException', error);
270
+ }
271
+ function createProcessHookListeners() {
272
+ return {
273
+ install() {
274
+ if (listenersInstalled.read()) {
275
+ return;
276
+ }
277
+ process.prependListener('unhandledRejection', receiveUnhandledRejection);
278
+ process.prependListener('uncaughtException', receiveUncaughtException);
279
+ listenersInstalled.write(true);
280
+ },
281
+ removeWhenIdle() {
282
+ if (listenersInstalled.read() && activeScopes.size() === 0) {
283
+ process.removeListener('unhandledRejection', receiveUnhandledRejection);
284
+ process.removeListener('uncaughtException', receiveUncaughtException);
285
+ listenersInstalled.write(false);
286
+ }
287
+ }
288
+ };
289
+ }
290
+ const processHookListeners = createProcessHookListeners();
291
+ export function createExecutionGlobalErrorObserver(boundary) {
292
+ const scope = createRunErrorScope(boundary);
293
+ return {
294
+ async fatalSignal() {
295
+ await scope.fatalSignal();
296
+ },
297
+ hasFatalError() {
298
+ return scope.hasFatalError();
299
+ },
300
+ onFatalError(handler) {
301
+ return scope.onFatalError(handler);
302
+ },
303
+ async runBoundary(run) {
304
+ processHookListeners.install();
305
+ activeScopes.add(scope);
306
+ try {
307
+ return await runScopeStorage.run(scope, run);
308
+ }
309
+ finally {
310
+ activeScopes.remove(scope);
311
+ processHookListeners.removeWhenIdle();
312
+ }
313
+ },
314
+ async runCase(testCase, run) {
315
+ const activeCase = {
316
+ id: testCase.id,
317
+ key: caseIdentityKey(testCase.id),
318
+ scope,
319
+ workId: testCase.workId
320
+ };
321
+ scope.activeCaseStarted(activeCase.key);
322
+ try {
323
+ return await activeCaseStorage.run(activeCase, run);
324
+ }
325
+ finally {
326
+ scope.activeCaseStopped(activeCase.key);
327
+ }
328
+ },
329
+ async runPhase(phase, run) {
330
+ return await scope.runPhase(phase, run);
331
+ },
332
+ stop() {
333
+ scope.stop();
334
+ activeScopes.remove(scope);
335
+ processHookListeners.removeWhenIdle();
336
+ },
337
+ takeErrors() {
338
+ return scope.takeErrors();
339
+ }
340
+ };
341
+ }
342
+ //# sourceMappingURL=execution-global-error-observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-global-error-observer.js","sourceRoot":"","sources":["../../../../source/engine/execution-global-error-observer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAA4B,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,qCAAqC,EAAoB,MAAM,iBAAiB,CAAC;AAsF1F,SAAS,iBAAiB,CAAQ,YAAmB;IACjD,IAAI,YAAY,GAAG,YAAY,CAAC;IAEhC,OAAO;QACH,IAAI;YACA,OAAO,YAAY,CAAC;QACxB,CAAC;QACD,KAAK,CAAC,KAAK;YACP,YAAY,GAAG,KAAK,CAAC;QACzB,CAAC;KACJ,CAAC;AACN,CAAC;AAED,SAAS,mBAAmB,CAAC,QAA2B;IACpD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAqB,CAAC;IACnD,MAAM,WAAW,GAAG,iBAAiB,CAAyC,IAAI,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,iBAAiB,CAAiB,KAAK,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAEzC,SAAS,WAAW,CAAC,KAAkB;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,WAAW,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACL,CAAC;IAED,OAAO;QACH,iBAAiB,CAAC,GAAG;YACjB,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,iBAAiB,CAAC,GAAG;YACjB,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,QAAQ;QACR,KAAK,CAAC,WAAW;YACb,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBACf,OAAO;YACX,CAAC;YAED,MAAM,kBAAkB,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,aAAa,EAAa,CAAC;YAEpF,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,MAAM,kBAAkB,CAAC,OAAO,CAAC;QACrC,CAAC;QACD,aAAa,CAAC,GAAG;YACb,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,aAAa;YACT,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QACD,YAAY,CAAC,OAAO;YAChB,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAE3B,OAAO,SAAS,uBAAuB;gBACnC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClC,CAAC,CAAC;QACN,CAAC;QACD,KAAK;YACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QACD,WAAW,CAAC,KAAK;YACb,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjB,OAAO;YACX,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,WAAW,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,QAAQ,CAAQ,SAAyB,EAAE,GAAyB;YACtE,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAEnC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAEvB,IAAI,CAAC;gBACD,OAAO,MAAM,GAAG,EAAE,CAAC;YACvB,CAAC;oBAAS,CAAC;gBACP,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC;QACD,IAAI;YACA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpB,aAAa,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;QACD,UAAU;YACN,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEzC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAElB,OAAO,aAAa,CAAC;QACzB,CAAC;KACJ,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB;IACvB,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,OAAO;QACH,GAAG,CAAC,KAAK;YACL,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,GAAG;YACC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QACD,QAAQ,CAAC,KAAK;YACV,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,CAAC,KAAK;YACR,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAExC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC;QACD,IAAI;YACA,OAAO,MAAM,CAAC,MAAM,CAAC;QACzB,CAAC;KACJ,CAAC;AACN,CAAC;AAED,MAAM,UAAU,0CAA0C;IACtD,MAAM,UAAU,GAAkB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEnD,OAAO;QACH,KAAK,CAAC,WAAW;YACb,MAAM,UAAU,CAAC;QACrB,CAAC;QACD,aAAa;YACT,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,YAAY;YACR,OAAO,SAAS,0BAA0B;gBACtC,OAAO,SAAS,CAAC;YACrB,CAAC,CAAC;QACN,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,GAAG;YACjB,OAAO,MAAM,GAAG,EAAE,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG;YACxB,OAAO,MAAM,GAAG,EAAE,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG;YACtB,OAAO,MAAM,GAAG,EAAE,CAAC;QACvB,CAAC;QACD,IAAI;YACA,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,UAAU;YACN,OAAO,EAAE,CAAC;QACd,CAAC;KACJ,CAAC;AACN,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,iBAAiB,EAAiB,CAAC;AAC/D,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAqB,CAAC;AACrE,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;AAC1C,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAEpD,SAAS,gBAAgB,CAAC,MAAe;IACrC,IAAI,MAAM,YAAY,KAAK,EAAE,CAAC;QAC1B,OAAO;YACH,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI;SAC9B,CAAC;IACN,CAAC;IAED,OAAO;QACH,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QACvB,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,IAAI;KACd,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAAC,IAAc;IAC/B,OAAO,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,qBAAqB,CAAC;AACvF,CAAC;AAED,SAAS,WAAW,CAAC,IAAc,EAAE,MAA4B;IAC7D,MAAM,KAAK,GAAG,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,qBAAqB,CAAC;IAE1F,OAAO,GAAG,KAAK,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,SAAS,CACd,KAAoB,EACpB,IAAc,EACd,MAAe,EACf,UAAoC;IAEpC,OAAO;QACH,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI;QACJ,MAAM,EAAE;YACJ,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,IAAI;YAC5B,IAAI,EAAE,UAAU,EAAE,MAAM,IAAI,IAAI;SACnC;QACD,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM;QACnD,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC;KACnC,CAAC;AACN,CAAC;AAED,SAAS,eAAe,CACpB,KAAoB,EACpB,IAAc,EACd,MAAe,EACf,UAA6B;IAE7B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAEzD,OAAO;QACH,YAAY,EAAE,UAAU,CAAC,EAAE;QAC3B,gBAAgB,EAAE,UAAU,CAAC,MAAM;QACnC,KAAK;QACL,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;QACxC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC;KAC7B,CAAC;AACN,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAoB,EAAE,IAAc,EAAE,MAAe;IAC5E,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAEnD,OAAO;QACH,YAAY,EAAE,IAAI;QAClB,gBAAgB,EAAE,IAAI;QACtB,KAAK;QACL,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;QACxC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC;KAC7B,CAAC;AACN,CAAC;AAED,SAAS,qBAAqB,CAC1B,KAAoB,EACpB,IAAc,EACd,MAAe,EACf,UAAoC;IAEpC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAEzD,OAAO;QACH,YAAY,EAAE,IAAI;QAClB,gBAAgB,EAAE,IAAI;QACtB,KAAK;QACL,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,iDAAiD,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;QAChF,OAAO,EAAE,mBAAmB;KAC/B,CAAC;AACN,CAAC;AAED,SAAS,iBAAiB,CACtB,KAAoB,EACpB,UAAoC;IAEpC,OAAO,UAAU,KAAK,IAAI,IAAI,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC;AAC7D,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAuB;IACjD,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AACrF,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAuB;IACpD,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAE/C,OAAO,qCAAqC,CAAC,KAAK,CAAC,MAAM,EAAE;QACvD,YAAY,EAAE,UAAU,EAAE,EAAE,IAAI,IAAI;QACpC,gBAAgB,EAAE,UAAU,EAAE,MAAM,IAAI,IAAI;QAC5C,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ;QAC9B,iBAAiB,EAAE,IAAI;QACvB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM;KAC5D,CAAC,CAAC;AACP,CAAC;AAED,SAAS,aAAa,CAAC,KAAuB;IAC1C,MAAM,eAAe,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAEvD,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,eAAe,CAAC;IAC3B,CAAC;IAED,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,OAAO,qBAAqB,CACxB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,MAAM,EACZ,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAC7E,CAAC;IACN,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACpD,OAAO,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACpF,CAAC;IAED,OAAO,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,mBAAmB;IACxB,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC;IAEhD,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACpE,OAAO,CAAE,YAAY,CAAE,CAAC;IAC5B,CAAC;IAED,OAAO,YAAY,CAAC,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAc,EAAE,MAAe;IACvD,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;IACxD,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,EAAE,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAE3F,KAAK,MAAM,KAAK,IAAI,mBAAmB,EAAE,EAAE,CAAC;QACxC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAe;IAC9C,kBAAkB,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAY;IAC1C,kBAAkB,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,0BAA0B;IAC/B,OAAO;QACH,OAAO;YACH,IAAI,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC5B,OAAO;YACX,CAAC;YAED,OAAO,CAAC,eAAe,CAAC,oBAAoB,EAAE,yBAAyB,CAAC,CAAC;YACzE,OAAO,CAAC,eAAe,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,CAAC;YACvE,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,cAAc;YACV,IAAI,kBAAkB,CAAC,IAAI,EAAE,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,cAAc,CAAC,oBAAoB,EAAE,yBAAyB,CAAC,CAAC;gBACxE,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,CAAC;gBACtE,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;KACJ,CAAC;AACN,CAAC;AAED,MAAM,oBAAoB,GAAG,0BAA0B,EAAE,CAAC;AAE1D,MAAM,UAAU,kCAAkC,CAAC,QAA2B;IAC1E,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAE5C,OAAO;QACH,KAAK,CAAC,WAAW;YACb,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC;QAC9B,CAAC;QACD,aAAa;YACT,OAAO,KAAK,CAAC,aAAa,EAAE,CAAC;QACjC,CAAC;QACD,YAAY,CAAC,OAAO;YAChB,OAAO,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,GAAG;YACjB,oBAAoB,CAAC,OAAO,EAAE,CAAC;YAC/B,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAExB,IAAI,CAAC;gBACD,OAAO,MAAM,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACjD,CAAC;oBAAS,CAAC;gBACP,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC3B,oBAAoB,CAAC,cAAc,EAAE,CAAC;YAC1C,CAAC;QACL,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG;YACvB,MAAM,UAAU,GAAG;gBACf,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,GAAG,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,KAAK;gBACL,MAAM,EAAE,QAAQ,CAAC,MAAM;aAC1B,CAAC;YAEF,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAExC,IAAI,CAAC;gBACD,OAAO,MAAM,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YACxD,CAAC;oBAAS,CAAC;gBACP,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC5C,CAAC;QACL,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG;YACrB,OAAO,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI;YACA,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,oBAAoB,CAAC,cAAc,EAAE,CAAC;QAC1C,CAAC;QACD,UAAU;YACN,OAAO,KAAK,CAAC,UAAU,EAAE,CAAC;QAC9B,CAAC;KACJ,CAAC;AACN,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { workIdentityKey } from "./identity.js";
2
2
  import { runStatusFromPlan, runStatusFromSummary } from "./run-result.js";
3
+ import { summaryRunTimings } from "./run-timings.js";
3
4
  export function appendRunnerErrors(result, runnerErrors) {
4
5
  if (runnerErrors.length === 0) {
5
6
  return result;
@@ -110,7 +111,10 @@ export function createRunResult(testPlan, perTest, reporterErrors, timing) {
110
111
  runnerErrors: reporterErrors,
111
112
  status: runStatusFromPlan(summary, reporterErrors, timing.planStatus),
112
113
  summary,
113
- wallTimeMs: timing.wallClock.currentTimestampInMilliseconds - timing.startedAtMs
114
+ timings: summaryRunTimings({
115
+ testExecutionWallTimeMicroseconds: timing.testExecutionWallTimeMicroseconds,
116
+ totalWallTimeMicroseconds: timing.completedAtMicroseconds - timing.startedAtMicroseconds
117
+ })
114
118
  };
115
119
  }
116
120
  //# sourceMappingURL=execution-result.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"execution-result.js","sourceRoot":"","sources":["../../../../source/engine/execution-result.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"execution-result.js","sourceRoot":"","sources":["../../../../source/engine/execution-result.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- import type { WallClock } from '@enormora/wall-clock';
1
+ import type { OverkillClock } from '../clock/overkill-clock.ts';
2
2
  import { type TestRuntimePolicy } from './case-execution.ts';
3
3
  import { type PerTestResult, type ResourceUsageSnapshot, type RunnerError } from './run-result.ts';
4
4
  import type { TestPlanCase } from './test-plan.ts';
5
5
  import { type ExecuteResourceBudgets } from './execution-resource-budget-breach.ts';
6
+ import type { ExecutionGlobalErrorObserver } from './execution-global-error-observer.ts';
6
7
  export type ExecuteTimeoutPolicy = {
7
8
  readonly hardTimeoutMilliseconds: number;
8
9
  readonly timeoutMilliseconds: number;
@@ -10,11 +11,12 @@ export type ExecuteTimeoutPolicy = {
10
11
  export type ConcurrentCase = {
11
12
  readonly result: PerTestResult;
12
13
  readonly runnerErrors: readonly RunnerError[];
13
- readonly wallTimeMs: number;
14
+ readonly durationMicroseconds: number;
14
15
  };
15
16
  export type ExecutionSupervisionDependencies = {
17
+ readonly globalErrorObserver: ExecutionGlobalErrorObserver;
16
18
  readonly runtimePolicy?: TestRuntimePolicy | null;
17
- readonly wallClock: WallClock;
19
+ readonly wallClock: OverkillClock;
18
20
  };
19
21
  type CaseCompletion = {
20
22
  readonly complete: (executedCase: ConcurrentCase) => void;
@@ -23,8 +25,8 @@ type CaseCompletion = {
23
25
  type ActiveCase = {
24
26
  readonly abort: () => void;
25
27
  readonly completion: CaseCompletion;
26
- readonly hardTimeout: ReturnType<WallClock['setTimeout']> | null;
27
- readonly startedAtMilliseconds: number;
28
+ readonly hardTimeout: ReturnType<OverkillClock['setTimeout']> | null;
29
+ readonly startedAtMicroseconds: number;
28
30
  readonly testCase: TestPlanCase;
29
31
  };
30
32
  export type ExecutionSupervision = {
@@ -1 +1 @@
1
- {"version":3,"file":"execution-supervision.d.ts","sourceRoot":"","sources":["../../../../source/engine/execution-supervision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAIH,KAAK,iBAAiB,EACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEH,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAEnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAEH,KAAK,sBAAsB,EAE9B,MAAM,uCAAuC,CAAC;AAE/C,MAAM,MAAM,oBAAoB,GAAG;IAC/B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACxC,CAAC;AACF,MAAM,MAAM,cAAc,GAAG;IACzB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC/B,CAAC;AACF,MAAM,MAAM,gCAAgC,GAAG;IAC3C,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CACjC,CAAC;AACF,KAAK,cAAc,GAAG;IAClB,QAAQ,CAAC,QAAQ,EAAE,CAAC,YAAY,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CAC7C,CAAC;AACF,KAAK,UAAU,GAAG;IACd,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC;IACjE,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACnC,CAAC;AAeF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACtD,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IACtE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,YAAY,EAAE,SAAS,WAAW,EAAE,CAAC;CACjD,CAAC;AAwBF,KAAK,wBAAwB,GAAG;IAC5B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,YAAY,EAAE,gCAAgC,CAAC;IACxD,QAAQ,CAAC,cAAc,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACtD,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;CAC9C,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,oBAAoB,CAiBjE;AA0YD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAUlF;AAED,wBAAsB,eAAe,CACjC,QAAQ,EAAE,YAAY,EACtB,aAAa,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,EACtD,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,gCAAgC,GAC/C,OAAO,CAAC,cAAc,CAAC,CAezB"}
1
+ {"version":3,"file":"execution-supervision.d.ts","sourceRoot":"","sources":["../../../../source/engine/execution-supervision.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { invalidTimeoutControlFailure, runTestCase, timeoutFailure } from "./case-execution.js";
2
2
  import { workIdentityKey } from "./identity.js";
3
- import { verdictFromOutcome } from "./run-result.js";
3
+ import { isPermissionDeniedRunnerError, verdictFromOutcome } from "./run-result.js";
4
4
  import { findResourceBudgetBreach } from "./execution-resource-budget-breach.js";
5
5
  export function createExecutionSupervision() {
6
6
  const activeCases = new Map();
@@ -26,30 +26,32 @@ function createCaseCompletion() {
26
26
  promise
27
27
  };
28
28
  }
29
- function createTerminalCase(testCase, verdict, wallTimeMs) {
29
+ function createTerminalCase(testCase, verdict, durationMicroseconds) {
30
30
  return {
31
31
  result: {
32
+ definitionLocations: testCase.definitionLocations,
32
33
  id: testCase.id,
33
34
  outcome: null,
34
35
  verdict,
35
36
  workId: testCase.workId,
36
- wallTimeMs
37
+ durationMicroseconds
37
38
  },
38
39
  runnerErrors: [],
39
- wallTimeMs
40
+ durationMicroseconds
40
41
  };
41
42
  }
42
- function failCase(testCase, failures, wallTimeMs) {
43
+ function failCase(testCase, failures, durationMicroseconds) {
43
44
  const outcome = {
44
45
  failures,
45
46
  kind: 'fail'
46
47
  };
47
48
  return {
49
+ definitionLocations: testCase.definitionLocations,
48
50
  id: testCase.id,
49
51
  outcome,
50
52
  verdict: verdictFromOutcome(outcome),
51
53
  workId: testCase.workId,
52
- wallTimeMs
54
+ durationMicroseconds
53
55
  };
54
56
  }
55
57
  function timeoutControlValue(testCase) {
@@ -92,7 +94,7 @@ function resultWithTimeoutFailure(executedCase, deadlineMilliseconds, elapsedMil
92
94
  }
93
95
  return {
94
96
  ...executedCase,
95
- result: failCase(executedCase.result, [failure], executedCase.wallTimeMs)
97
+ result: failCase(executedCase.result, [failure], executedCase.durationMicroseconds)
96
98
  };
97
99
  }
98
100
  function clearTimer(wallClock, timer) {
@@ -102,14 +104,15 @@ function clearTimer(wallClock, timer) {
102
104
  }
103
105
  function policyCheckedCase(testCase, executedCase, supervision, dependencies) {
104
106
  const errors = dependencies.runtimePolicy?.takeCaseErrors(testCase) ?? [];
105
- if (errors.length === 0) {
107
+ const hasCasePermissionError = executedCase.runnerErrors.some(isPermissionDeniedRunnerError);
108
+ if (errors.length === 0 && !hasCasePermissionError) {
106
109
  return executedCase;
107
110
  }
108
111
  for (const error of errors) {
109
112
  supervision.recordRunnerError(error);
110
113
  }
111
114
  return {
112
- ...createTerminalCase(testCase, 'runtime-policy', executedCase.wallTimeMs),
115
+ ...createTerminalCase(testCase, 'runtime-policy', executedCase.durationMicroseconds),
113
116
  runnerErrors: executedCase.runnerErrors
114
117
  };
115
118
  }
@@ -137,6 +140,11 @@ function resourceExhaustionError(cause) {
137
140
  attributedTo: cause.activeCases.length === 1 ? activeCase : null,
138
141
  attributedToWork: cause.activeWork.length === 1 ? activeWork : null,
139
142
  cause,
143
+ diagnostics: [
144
+ { label: 'metric', value: cause.metric },
145
+ { label: 'observed', value: String(cause.observed) },
146
+ { label: 'budget', value: String(cause.budget) }
147
+ ],
140
148
  message: `Resource budget exceeded: ${cause.metric} observed ${cause.observed}, budget ${cause.budget}.`,
141
149
  subtype: 'resource-exhaustion'
142
150
  };
@@ -148,6 +156,7 @@ function crashError(cause) {
148
156
  attributedTo: cause.activeCases.length === 1 ? activeCase : null,
149
157
  attributedToWork: cause.activeWork.length === 1 ? activeWork : null,
150
158
  cause,
159
+ diagnostics: [{ label: 'reason', value: cause.reason }],
151
160
  message: 'Test execution exceeded hard timeout.',
152
161
  subtype: 'crash'
153
162
  };
@@ -157,7 +166,7 @@ function completeActiveCasesAs(supervision, verdict, dependencies) {
157
166
  supervision.removeActiveCase(key);
158
167
  activeCase.abort();
159
168
  clearTimer(dependencies.wallClock, activeCase.hardTimeout);
160
- activeCase.completion.complete(createTerminalCase(activeCase.testCase, verdict, dependencies.wallClock.currentTimestampInMilliseconds - activeCase.startedAtMilliseconds));
169
+ activeCase.completion.complete(createTerminalCase(activeCase.testCase, verdict, dependencies.wallClock.currentMonotonicMicroseconds - activeCase.startedAtMicroseconds));
161
170
  }
162
171
  }
163
172
  function completeActiveCasesWithCrash(supervision, dependencies) {
@@ -171,6 +180,11 @@ function completeActiveCasesWithCrash(supervision, dependencies) {
171
180
  completeActiveCasesAs(supervision, 'crashed', dependencies);
172
181
  }
173
182
  }
183
+ function completeActiveCasesAfterGlobalError(supervision, dependencies) {
184
+ if (supervision.activeCases.size > 0) {
185
+ completeActiveCasesAs(supervision, 'crashed', dependencies);
186
+ }
187
+ }
174
188
  function completeActiveCasesWithResourceExhaustion(breach, supervision, dependencies) {
175
189
  const cause = {
176
190
  ...breach,
@@ -200,7 +214,7 @@ async function runCaseWithSoftTimeout(input) {
200
214
  const executedCase = await runTestCaseWithPolicy(input.testCase, input.controller, input.supervision, input.dependencies);
201
215
  clearTimer(input.dependencies.wallClock, softTimeout);
202
216
  if (timing.timedOut) {
203
- return resultWithTimeoutFailure(executedCase, input.timeoutMilliseconds, executedCase.wallTimeMs);
217
+ return resultWithTimeoutFailure(executedCase, input.timeoutMilliseconds, executedCase.durationMicroseconds);
204
218
  }
205
219
  return executedCase;
206
220
  }
@@ -208,12 +222,12 @@ function invalidTimeoutCase(testCase, failure) {
208
222
  return {
209
223
  result: failCase(testCase, [failure], 0),
210
224
  runnerErrors: [],
211
- wallTimeMs: 0
225
+ durationMicroseconds: 0
212
226
  };
213
227
  }
214
228
  function registerActiveCase(input) {
215
229
  const key = workIdentityKey(input.testCase.workId);
216
- const startedAtMilliseconds = input.dependencies.wallClock.currentTimestampInMilliseconds;
230
+ const startedAtMicroseconds = input.dependencies.wallClock.currentMonotonicMicroseconds;
217
231
  const hardTimeout = input.timeoutPolicy === null || input.timeoutPolicy === undefined
218
232
  ? null
219
233
  : input.dependencies.wallClock.setTimeout(function hardTimeoutActiveCases() {
@@ -225,7 +239,7 @@ function registerActiveCase(input) {
225
239
  },
226
240
  completion: input.completion,
227
241
  hardTimeout,
228
- startedAtMilliseconds,
242
+ startedAtMicroseconds,
229
243
  testCase: input.testCase
230
244
  };
231
245
  input.supervision.addActiveCase(key, activeCase);
@@ -239,30 +253,34 @@ function completeFinishedActiveCase(input, executedCase) {
239
253
  input.completion.complete(executedCase);
240
254
  }
241
255
  }
242
- function createInconclusiveCaseResult(testCase, error, wallTimeMs) {
256
+ function createInconclusiveCaseResult(testCase, error, durationMicroseconds) {
243
257
  const reason = error instanceof Error ? error.message : 'Unknown test execution error.';
244
258
  const outcome = {
245
259
  kind: 'inconclusive',
246
260
  reason: `Test execution failed before producing a result: ${reason}`
247
261
  };
248
262
  return {
263
+ definitionLocations: testCase.definitionLocations,
249
264
  id: testCase.id,
250
265
  outcome,
251
266
  verdict: verdictFromOutcome(outcome),
252
267
  workId: testCase.workId,
253
- wallTimeMs
268
+ durationMicroseconds
254
269
  };
255
270
  }
256
271
  function completeUnexpectedBodyError(input, error) {
257
- const wallTimeMs = input.dependencies.wallClock.currentTimestampInMilliseconds -
258
- input.activeCase.startedAtMilliseconds;
272
+ const durationMicroseconds = input.dependencies.wallClock.currentMonotonicMicroseconds -
273
+ input.activeCase.startedAtMicroseconds;
259
274
  completeFinishedActiveCase(input, {
260
- result: createInconclusiveCaseResult(input.testCase, error, wallTimeMs),
275
+ result: createInconclusiveCaseResult(input.testCase, error, durationMicroseconds),
261
276
  runnerErrors: [],
262
- wallTimeMs
277
+ durationMicroseconds
263
278
  });
264
279
  }
265
280
  async function runCaseBodyUnderSupervision(input) {
281
+ const removeFatalHandler = input.dependencies.globalErrorObserver.onFatalError(function completeCrashedCases() {
282
+ completeActiveCasesAfterGlobalError(input.supervision, input.dependencies);
283
+ });
266
284
  try {
267
285
  const executedCase = await Promise.race([
268
286
  runCaseWithSoftTimeout(input),
@@ -272,27 +290,27 @@ async function runCaseBodyUnderSupervision(input) {
272
290
  return executedCase;
273
291
  }
274
292
  catch (error) {
275
- const wallTimeMs = input.dependencies.wallClock.currentTimestampInMilliseconds -
276
- input.activeCase.startedAtMilliseconds;
293
+ const durationMicroseconds = input.dependencies.wallClock.currentMonotonicMicroseconds -
294
+ input.activeCase.startedAtMicroseconds;
277
295
  const fallbackCase = {
278
- result: createInconclusiveCaseResult(input.testCase, error, wallTimeMs),
296
+ result: createInconclusiveCaseResult(input.testCase, error, durationMicroseconds),
279
297
  runnerErrors: [],
280
- wallTimeMs
298
+ durationMicroseconds
281
299
  };
282
300
  completeUnexpectedBodyError(input, error);
283
301
  return fallbackCase;
284
302
  }
303
+ finally {
304
+ removeFatalHandler();
305
+ }
285
306
  }
286
- function createCaseBodyInput(input, activeCase, timeoutMilliseconds) {
307
+ function registerCaseBodyInput(input, timeoutMilliseconds) {
287
308
  return {
288
309
  ...input,
289
- activeCase,
310
+ activeCase: registerActiveCase(input),
290
311
  timeoutMilliseconds
291
312
  };
292
313
  }
293
- function registerCaseBodyInput(input, timeoutMilliseconds) {
294
- return createCaseBodyInput(input, registerActiveCase(input), timeoutMilliseconds);
295
- }
296
314
  function createActiveCaseInput(testCase, timeoutPolicy, supervision, dependencies) {
297
315
  return {
298
316
  completion: createCaseCompletion(),