@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.
- package/clock/overkill-clock.d.ts +30 -0
- package/clock/overkill-clock.d.ts.map +1 -0
- package/clock/overkill-clock.js +53 -0
- package/clock/overkill-clock.js.map +1 -0
- package/engine/async-leak-diagnostics.d.ts.map +1 -1
- package/engine/async-leak-diagnostics.js +10 -0
- package/engine/async-leak-diagnostics.js.map +1 -1
- package/engine/case-execution.d.ts +3 -3
- package/engine/case-execution.d.ts.map +1 -1
- package/engine/case-execution.js +22 -10
- package/engine/case-execution.js.map +1 -1
- package/engine/engine.d.ts +2 -2
- package/engine/engine.d.ts.map +1 -1
- package/engine/execution-async-leak-policy.d.ts.map +1 -1
- package/engine/execution-async-leak-policy.js +3 -2
- package/engine/execution-async-leak-policy.js.map +1 -1
- package/engine/execution-global-error-observer.d.ts +20 -0
- package/engine/execution-global-error-observer.d.ts.map +1 -0
- package/engine/execution-global-error-observer.js +342 -0
- package/engine/execution-global-error-observer.js.map +1 -0
- package/engine/execution-result.js +5 -1
- package/engine/execution-result.js.map +1 -1
- package/engine/execution-supervision.d.ts +7 -5
- package/engine/execution-supervision.d.ts.map +1 -1
- package/engine/execution-supervision.js +47 -29
- package/engine/execution-supervision.js.map +1 -1
- package/engine/execution-test-plan-cases.js +72 -14
- package/engine/execution-test-plan-cases.js.map +1 -1
- package/engine/execution.d.ts +2 -2
- package/engine/execution.d.ts.map +1 -1
- package/engine/execution.js +38 -20
- package/engine/execution.js.map +1 -1
- package/engine/reporter-dispatcher.d.ts +2 -2
- package/engine/reporter-dispatcher.d.ts.map +1 -1
- package/engine/reporter-dispatcher.js +1 -0
- package/engine/reporter-dispatcher.js.map +1 -1
- package/engine/reporter.d.ts +1 -1
- package/engine/reporter.d.ts.map +1 -1
- package/engine/resource-usage-growth.js +4 -4
- package/engine/resource-usage-growth.js.map +1 -1
- package/engine/run-result.d.ts +88 -7
- package/engine/run-result.d.ts.map +1 -1
- package/engine/run-result.js +114 -0
- package/engine/run-result.js.map +1 -1
- package/engine/run-timings.d.ts +68 -0
- package/engine/run-timings.d.ts.map +1 -0
- package/engine/run-timings.js +116 -0
- package/engine/run-timings.js.map +1 -0
- package/engine/test-data.d.ts +4 -0
- package/engine/test-data.d.ts.map +1 -1
- package/engine/test-data.js +14 -1
- package/engine/test-data.js.map +1 -1
- package/package.json +3 -2
- package/packages/engine/engine.entry-point.d.ts +5 -3
- package/packages/engine/engine.entry-point.d.ts.map +1 -1
- package/packages/engine/engine.entry-point.js +3 -3
- package/packages/engine/engine.entry-point.js.map +1 -1
- package/readme.md +3 -1
- 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":"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"}
|
|
@@ -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
|
-
|
|
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":"
|
|
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 {
|
|
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
|
|
14
|
+
readonly durationMicroseconds: number;
|
|
14
15
|
};
|
|
15
16
|
export type ExecutionSupervisionDependencies = {
|
|
17
|
+
readonly globalErrorObserver: ExecutionGlobalErrorObserver;
|
|
16
18
|
readonly runtimePolicy?: TestRuntimePolicy | null;
|
|
17
|
-
readonly 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<
|
|
27
|
-
readonly
|
|
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,
|
|
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,
|
|
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
|
-
|
|
37
|
+
durationMicroseconds
|
|
37
38
|
},
|
|
38
39
|
runnerErrors: [],
|
|
39
|
-
|
|
40
|
+
durationMicroseconds
|
|
40
41
|
};
|
|
41
42
|
}
|
|
42
|
-
function failCase(testCase, failures,
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
225
|
+
durationMicroseconds: 0
|
|
212
226
|
};
|
|
213
227
|
}
|
|
214
228
|
function registerActiveCase(input) {
|
|
215
229
|
const key = workIdentityKey(input.testCase.workId);
|
|
216
|
-
const
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
268
|
+
durationMicroseconds
|
|
254
269
|
};
|
|
255
270
|
}
|
|
256
271
|
function completeUnexpectedBodyError(input, error) {
|
|
257
|
-
const
|
|
258
|
-
input.activeCase.
|
|
272
|
+
const durationMicroseconds = input.dependencies.wallClock.currentMonotonicMicroseconds -
|
|
273
|
+
input.activeCase.startedAtMicroseconds;
|
|
259
274
|
completeFinishedActiveCase(input, {
|
|
260
|
-
result: createInconclusiveCaseResult(input.testCase, error,
|
|
275
|
+
result: createInconclusiveCaseResult(input.testCase, error, durationMicroseconds),
|
|
261
276
|
runnerErrors: [],
|
|
262
|
-
|
|
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
|
|
276
|
-
input.activeCase.
|
|
293
|
+
const durationMicroseconds = input.dependencies.wallClock.currentMonotonicMicroseconds -
|
|
294
|
+
input.activeCase.startedAtMicroseconds;
|
|
277
295
|
const fallbackCase = {
|
|
278
|
-
result: createInconclusiveCaseResult(input.testCase, error,
|
|
296
|
+
result: createInconclusiveCaseResult(input.testCase, error, durationMicroseconds),
|
|
279
297
|
runnerErrors: [],
|
|
280
|
-
|
|
298
|
+
durationMicroseconds
|
|
281
299
|
};
|
|
282
300
|
completeUnexpectedBodyError(input, error);
|
|
283
301
|
return fallbackCase;
|
|
284
302
|
}
|
|
303
|
+
finally {
|
|
304
|
+
removeFatalHandler();
|
|
305
|
+
}
|
|
285
306
|
}
|
|
286
|
-
function
|
|
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(),
|