ppef 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/ppef.mjs +20 -0
- package/dist/__tests__/framework-pipeline.integration.test.js +13 -11
- package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
- package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
- package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
- package/dist/__tests__/index-exports.unit.test.js +127 -0
- package/dist/__tests__/index-exports.unit.test.js.map +1 -0
- package/dist/__tests__/registry-executor.integration.test.js +12 -9
- package/dist/__tests__/registry-executor.integration.test.js.map +1 -1
- package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
- package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
- package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
- package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
- package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
- package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
- package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
- package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
- package/dist/aggregation/aggregators.d.ts +9 -0
- package/dist/aggregation/aggregators.d.ts.map +1 -1
- package/dist/aggregation/aggregators.js +1 -1
- package/dist/aggregation/aggregators.js.map +1 -1
- package/dist/aggregation/index.d.ts +1 -1
- package/dist/aggregation/index.d.ts.map +1 -1
- package/dist/aggregation/index.js +1 -1
- package/dist/aggregation/index.js.map +1 -1
- package/dist/claims/__tests__/evaluator.unit.test.d.ts +12 -0
- package/dist/claims/__tests__/evaluator.unit.test.d.ts.map +1 -0
- package/dist/claims/__tests__/evaluator.unit.test.js +801 -0
- package/dist/claims/__tests__/evaluator.unit.test.js.map +1 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.js +396 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
- package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
- package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/commands.unit.test.js +217 -0
- package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
- package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
- package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/index.unit.test.js +65 -0
- package/dist/cli/__tests__/index.unit.test.js.map +1 -0
- package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
- package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/logger.unit.test.js +180 -0
- package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
- package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
- package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
- package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
- package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
- package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
- package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
- package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
- package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
- package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/run.command.unit.test.js +422 -0
- package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
- package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
- package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
- package/dist/cli/command-deps.d.ts +125 -0
- package/dist/cli/command-deps.d.ts.map +1 -0
- package/dist/cli/command-deps.js +7 -0
- package/dist/cli/command-deps.js.map +1 -0
- package/dist/cli/commands/aggregate.d.ts +35 -0
- package/dist/cli/commands/aggregate.d.ts.map +1 -0
- package/dist/cli/commands/aggregate.js +121 -0
- package/dist/cli/commands/aggregate.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +36 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +109 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/run.d.ts +33 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +185 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +27 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +88 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/config-loader.d.ts +30 -0
- package/dist/cli/config-loader.d.ts.map +1 -0
- package/dist/cli/config-loader.js +181 -0
- package/dist/cli/config-loader.js.map +1 -0
- package/dist/cli/index.d.ts +26 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +58 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/logger.d.ts +75 -0
- package/dist/cli/logger.d.ts.map +1 -0
- package/dist/cli/logger.js +131 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/cli/module-loader.d.ts +46 -0
- package/dist/cli/module-loader.d.ts.map +1 -0
- package/dist/cli/module-loader.js +116 -0
- package/dist/cli/module-loader.js.map +1 -0
- package/dist/cli/output-writer.d.ts +51 -0
- package/dist/cli/output-writer.d.ts.map +1 -0
- package/dist/cli/output-writer.js +65 -0
- package/dist/cli/output-writer.js.map +1 -0
- package/dist/cli/types.d.ts +174 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +7 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
- package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
- package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
- package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
- package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
- package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
- package/dist/collector/__tests__/schema.unit.test.js +360 -0
- package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-manager.unit.test.js +83 -1
- package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -1
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +3 -6
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -1
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +428 -159
- package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -1
- package/dist/executor/__tests__/checkpoint-storage.unit.test.js +105 -1
- package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
- package/dist/executor/__tests__/executor.unit.test.js +69 -1
- package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
- package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
- package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
- package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +2 -1
- package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -1
- package/dist/executor/__tests__/parallel-executor.unit.test.js +426 -156
- package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -1
- package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
- package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/run-id.unit.test.js +156 -0
- package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
- package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
- package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
- package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
- package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
- package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
- package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
- package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
- package/dist/executor/parallel-executor.d.ts +186 -0
- package/dist/executor/parallel-executor.d.ts.map +1 -1
- package/dist/executor/parallel-executor.js +218 -83
- package/dist/executor/parallel-executor.js.map +1 -1
- package/dist/executor/run-id.d.ts.map +1 -1
- package/dist/executor/run-id.js +8 -1
- package/dist/executor/run-id.js.map +1 -1
- package/dist/executor/worker-entry.d.ts +2 -0
- package/dist/executor/worker-entry.d.ts.map +1 -1
- package/dist/executor/worker-entry.js +29 -54
- package/dist/executor/worker-entry.js.map +1 -1
- package/dist/executor/worker-executor.d.ts +156 -0
- package/dist/executor/worker-executor.d.ts.map +1 -0
- package/dist/executor/worker-executor.js +88 -0
- package/dist/executor/worker-executor.js.map +1 -0
- package/dist/robustness/__tests__/analyzer.unit.test.d.ts +11 -0
- package/dist/robustness/__tests__/analyzer.unit.test.d.ts.map +1 -0
- package/dist/robustness/__tests__/analyzer.unit.test.js +455 -0
- package/dist/robustness/__tests__/analyzer.unit.test.js.map +1 -0
- package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
- package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
- package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
- package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
- package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
- package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
- package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
- package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
- package/package.json +8 -1
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for worker-entry.ts
|
|
3
|
+
*
|
|
4
|
+
* Tests WorkerExecutor with injected mock dependencies.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, mock, beforeEach } from "node:test";
|
|
7
|
+
import { strict as assert } from "node:assert";
|
|
8
|
+
import { WorkerExecutor, } from "../worker-executor.js";
|
|
9
|
+
describe("worker-entry", () => {
|
|
10
|
+
let mockParentPort;
|
|
11
|
+
let mockModuleLoader;
|
|
12
|
+
let mockExecutorInstance;
|
|
13
|
+
let postedMessages;
|
|
14
|
+
let onListeners;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
postedMessages = [];
|
|
17
|
+
onListeners = [];
|
|
18
|
+
// Mock parentPort
|
|
19
|
+
mockParentPort = {
|
|
20
|
+
on: mock.fn((event, listener) => {
|
|
21
|
+
onListeners.push({ event, listener });
|
|
22
|
+
}),
|
|
23
|
+
postMessage: mock.fn((message) => {
|
|
24
|
+
postedMessages.push(message);
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
// Mock executor instance
|
|
28
|
+
mockExecutorInstance = {
|
|
29
|
+
execute: mock.fn(async () => ({
|
|
30
|
+
results: [
|
|
31
|
+
{
|
|
32
|
+
run: {
|
|
33
|
+
runId: "test-1",
|
|
34
|
+
sut: "sut-1",
|
|
35
|
+
sutRole: "primary",
|
|
36
|
+
caseId: "case-1",
|
|
37
|
+
repetition: 0,
|
|
38
|
+
seed: 42,
|
|
39
|
+
},
|
|
40
|
+
correctness: {
|
|
41
|
+
expectedExists: true,
|
|
42
|
+
producedOutput: true,
|
|
43
|
+
valid: true,
|
|
44
|
+
matchesExpected: true,
|
|
45
|
+
},
|
|
46
|
+
outputs: {},
|
|
47
|
+
metrics: { numeric: {} },
|
|
48
|
+
provenance: {
|
|
49
|
+
runtime: {
|
|
50
|
+
platform: "test",
|
|
51
|
+
arch: "test",
|
|
52
|
+
nodeVersion: "test",
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
errors: [],
|
|
58
|
+
})),
|
|
59
|
+
};
|
|
60
|
+
// Mock Executor constructor
|
|
61
|
+
const MockExecutor = mock.fn(function () {
|
|
62
|
+
return mockExecutorInstance;
|
|
63
|
+
});
|
|
64
|
+
// Mock module loader
|
|
65
|
+
mockModuleLoader = {
|
|
66
|
+
loadExecutor: async () => {
|
|
67
|
+
return {
|
|
68
|
+
Executor: MockExecutor,
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
loadEvaluate: async () => {
|
|
72
|
+
return {
|
|
73
|
+
getSutDefinitions: () => ({}),
|
|
74
|
+
getCaseDefinitions: () => ({}),
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
loadRegistry: async () => {
|
|
78
|
+
return {
|
|
79
|
+
registerAllBenchmarkCases: async () => ({}),
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
loadSuts: async () => {
|
|
83
|
+
return {
|
|
84
|
+
registerAllSuts: () => ({}),
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
loadDatasets: async () => {
|
|
88
|
+
return {
|
|
89
|
+
registerBenchmarkDatasets: async () => {
|
|
90
|
+
return;
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
describe("WorkerExecutor", () => {
|
|
97
|
+
it("should register message listener on start", () => {
|
|
98
|
+
const executor = new WorkerExecutor(mockParentPort, mockModuleLoader, "/test/root");
|
|
99
|
+
executor.start();
|
|
100
|
+
assert.strictEqual(onListeners.length, 1);
|
|
101
|
+
assert.strictEqual(onListeners[0].event, "message");
|
|
102
|
+
assert.strictEqual(typeof onListeners[0].listener, "function");
|
|
103
|
+
});
|
|
104
|
+
it("should call module loader methods in order", async () => {
|
|
105
|
+
const callOrder = [];
|
|
106
|
+
// Wrap each loader method to track call order
|
|
107
|
+
const originalLoader = mockModuleLoader;
|
|
108
|
+
mockModuleLoader = {
|
|
109
|
+
loadExecutor: async () => {
|
|
110
|
+
callOrder.push("loadExecutor");
|
|
111
|
+
return originalLoader.loadExecutor();
|
|
112
|
+
},
|
|
113
|
+
loadEvaluate: async () => {
|
|
114
|
+
callOrder.push("loadEvaluate");
|
|
115
|
+
return originalLoader.loadEvaluate();
|
|
116
|
+
},
|
|
117
|
+
loadRegistry: async () => {
|
|
118
|
+
callOrder.push("loadRegistry");
|
|
119
|
+
return originalLoader.loadRegistry();
|
|
120
|
+
},
|
|
121
|
+
loadSuts: async () => {
|
|
122
|
+
callOrder.push("loadSuts");
|
|
123
|
+
return originalLoader.loadSuts();
|
|
124
|
+
},
|
|
125
|
+
loadDatasets: async () => {
|
|
126
|
+
callOrder.push("loadDatasets");
|
|
127
|
+
return originalLoader.loadDatasets();
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
const message = {
|
|
131
|
+
runs: [{ runId: "test-1", sutId: "sut-1", caseId: "case-1", repetition: 0, config: {} }],
|
|
132
|
+
config: {
|
|
133
|
+
repetitions: 1,
|
|
134
|
+
seedBase: 42,
|
|
135
|
+
continueOnError: true,
|
|
136
|
+
timeoutMs: 5000,
|
|
137
|
+
collectProvenance: false,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
const executor = new WorkerExecutor(mockParentPort, mockModuleLoader, "/test/root");
|
|
141
|
+
await executor.handleMessage(message);
|
|
142
|
+
// Verify all module loaders were called in the expected order
|
|
143
|
+
assert.strictEqual(callOrder.length, 5);
|
|
144
|
+
assert.strictEqual(callOrder[0], "loadExecutor");
|
|
145
|
+
assert.strictEqual(callOrder[1], "loadEvaluate");
|
|
146
|
+
assert.strictEqual(callOrder[2], "loadRegistry");
|
|
147
|
+
assert.strictEqual(callOrder[3], "loadSuts");
|
|
148
|
+
assert.strictEqual(callOrder[4], "loadDatasets");
|
|
149
|
+
});
|
|
150
|
+
it("should post done message on successful execution", async () => {
|
|
151
|
+
const message = {
|
|
152
|
+
runs: [{ runId: "test-1", sutId: "sut-1", caseId: "case-1", repetition: 0, config: {} }],
|
|
153
|
+
config: {
|
|
154
|
+
repetitions: 1,
|
|
155
|
+
seedBase: 42,
|
|
156
|
+
continueOnError: true,
|
|
157
|
+
timeoutMs: 5000,
|
|
158
|
+
collectProvenance: false,
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
const executor = new WorkerExecutor(mockParentPort, mockModuleLoader, "/test/root");
|
|
162
|
+
await executor.handleMessage(message);
|
|
163
|
+
assert.strictEqual(postedMessages.length, 1);
|
|
164
|
+
const posted = postedMessages[0];
|
|
165
|
+
assert.strictEqual(posted.type, "done");
|
|
166
|
+
assert.ok(Array.isArray(posted.results));
|
|
167
|
+
assert.strictEqual(posted.results.length, 1);
|
|
168
|
+
});
|
|
169
|
+
it("should post error message on exception", async () => {
|
|
170
|
+
// Make loadExecutor throw an error
|
|
171
|
+
mockModuleLoader.loadExecutor = async () => {
|
|
172
|
+
throw new Error("Module not found");
|
|
173
|
+
};
|
|
174
|
+
const message = {
|
|
175
|
+
runs: [{ runId: "test-1", sutId: "sut-1", caseId: "case-1", repetition: 0, config: {} }],
|
|
176
|
+
config: {
|
|
177
|
+
repetitions: 1,
|
|
178
|
+
seedBase: 42,
|
|
179
|
+
continueOnError: true,
|
|
180
|
+
timeoutMs: 5000,
|
|
181
|
+
collectProvenance: false,
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
const executor = new WorkerExecutor(mockParentPort, mockModuleLoader, "/test/root");
|
|
185
|
+
await executor.handleMessage(message);
|
|
186
|
+
assert.strictEqual(postedMessages.length, 1);
|
|
187
|
+
const posted = postedMessages[0];
|
|
188
|
+
assert.strictEqual(posted.type, "error");
|
|
189
|
+
assert.strictEqual(posted.error, "Module not found");
|
|
190
|
+
});
|
|
191
|
+
it("should post error message with string error", async () => {
|
|
192
|
+
mockModuleLoader.loadExecutor = async () => {
|
|
193
|
+
throw new Error("String error");
|
|
194
|
+
};
|
|
195
|
+
const message = {
|
|
196
|
+
runs: [{ runId: "test-1", sutId: "sut-1", caseId: "case-1", repetition: 0, config: {} }],
|
|
197
|
+
config: {
|
|
198
|
+
repetitions: 1,
|
|
199
|
+
seedBase: 42,
|
|
200
|
+
continueOnError: true,
|
|
201
|
+
timeoutMs: 5000,
|
|
202
|
+
collectProvenance: false,
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
const executor = new WorkerExecutor(mockParentPort, mockModuleLoader, "/test/root");
|
|
206
|
+
await executor.handleMessage(message);
|
|
207
|
+
assert.strictEqual(postedMessages.length, 1);
|
|
208
|
+
const posted = postedMessages[0];
|
|
209
|
+
assert.strictEqual(posted.type, "error");
|
|
210
|
+
assert.strictEqual(posted.error, "String error");
|
|
211
|
+
});
|
|
212
|
+
it("should pass executor config to Executor constructor", async () => {
|
|
213
|
+
const MockExecutor = mock.fn(function (_config) {
|
|
214
|
+
mockExecutorInstance.execute = mock.fn(async () => ({
|
|
215
|
+
results: [],
|
|
216
|
+
errors: [],
|
|
217
|
+
}));
|
|
218
|
+
return mockExecutorInstance;
|
|
219
|
+
});
|
|
220
|
+
mockModuleLoader.loadExecutor = async () => {
|
|
221
|
+
return {
|
|
222
|
+
Executor: MockExecutor,
|
|
223
|
+
};
|
|
224
|
+
};
|
|
225
|
+
const message = {
|
|
226
|
+
runs: [{ runId: "test-1", sutId: "sut-1", caseId: "case-1", repetition: 0, config: {} }],
|
|
227
|
+
config: {
|
|
228
|
+
repetitions: 5,
|
|
229
|
+
seedBase: 999,
|
|
230
|
+
continueOnError: false,
|
|
231
|
+
timeoutMs: 15000,
|
|
232
|
+
collectProvenance: true,
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
const executor = new WorkerExecutor(mockParentPort, mockModuleLoader, "/test/root");
|
|
236
|
+
await executor.handleMessage(message);
|
|
237
|
+
// Verify Executor was constructed with correct config
|
|
238
|
+
assert.strictEqual(MockExecutor.mock.calls.length, 1);
|
|
239
|
+
const executorConfig = MockExecutor.mock.calls[0].arguments[0];
|
|
240
|
+
assert.strictEqual(executorConfig.repetitions, 5);
|
|
241
|
+
assert.strictEqual(executorConfig.seedBase, 999);
|
|
242
|
+
assert.strictEqual(executorConfig.continueOnError, false);
|
|
243
|
+
assert.strictEqual(executorConfig.timeoutMs, 15000);
|
|
244
|
+
assert.strictEqual(executorConfig.collectProvenance, true);
|
|
245
|
+
});
|
|
246
|
+
it("should handle multiple runs in a batch", async () => {
|
|
247
|
+
const message = {
|
|
248
|
+
runs: [
|
|
249
|
+
{ runId: "test-1", sutId: "sut-1", caseId: "case-1", repetition: 0, config: {} },
|
|
250
|
+
{ runId: "test-2", sutId: "sut-2", caseId: "case-2", repetition: 1, config: {} },
|
|
251
|
+
{ runId: "test-3", sutId: "sut-1", caseId: "case-2", repetition: 0, config: {} },
|
|
252
|
+
],
|
|
253
|
+
config: {
|
|
254
|
+
repetitions: 3,
|
|
255
|
+
seedBase: 100,
|
|
256
|
+
continueOnError: true,
|
|
257
|
+
timeoutMs: 10000,
|
|
258
|
+
collectProvenance: false,
|
|
259
|
+
},
|
|
260
|
+
};
|
|
261
|
+
const executor = new WorkerExecutor(mockParentPort, mockModuleLoader, "/test/root");
|
|
262
|
+
await executor.handleMessage(message);
|
|
263
|
+
assert.strictEqual(postedMessages.length, 1);
|
|
264
|
+
const posted = postedMessages[0];
|
|
265
|
+
assert.strictEqual(posted.type, "done");
|
|
266
|
+
assert.ok(Array.isArray(posted.results));
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
describe("executeBatch", () => {
|
|
270
|
+
it("should call registerBenchmarkDatasets on datasets module", async () => {
|
|
271
|
+
const registerSpy = mock.fn(async () => {
|
|
272
|
+
return;
|
|
273
|
+
});
|
|
274
|
+
mockModuleLoader.loadDatasets = async () => {
|
|
275
|
+
return {
|
|
276
|
+
registerBenchmarkDatasets: registerSpy,
|
|
277
|
+
};
|
|
278
|
+
};
|
|
279
|
+
const message = {
|
|
280
|
+
runs: [{ runId: "test-1", sutId: "sut-1", caseId: "case-1", repetition: 0, config: {} }],
|
|
281
|
+
config: {
|
|
282
|
+
repetitions: 1,
|
|
283
|
+
seedBase: 42,
|
|
284
|
+
continueOnError: true,
|
|
285
|
+
timeoutMs: 5000,
|
|
286
|
+
collectProvenance: false,
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
const executor = new WorkerExecutor(mockParentPort, mockModuleLoader, "/test/root");
|
|
290
|
+
await executor.executeBatch(message);
|
|
291
|
+
assert.strictEqual(registerSpy.mock.calls.length, 1);
|
|
292
|
+
});
|
|
293
|
+
it("should call registerAllSuts on SUTs module", async () => {
|
|
294
|
+
const registerSpy = mock.fn(() => ({}));
|
|
295
|
+
mockModuleLoader.loadSuts = async () => {
|
|
296
|
+
return {
|
|
297
|
+
registerAllSuts: registerSpy,
|
|
298
|
+
};
|
|
299
|
+
};
|
|
300
|
+
const message = {
|
|
301
|
+
runs: [{ runId: "test-1", sutId: "sut-1", caseId: "case-1", repetition: 0, config: {} }],
|
|
302
|
+
config: {
|
|
303
|
+
repetitions: 1,
|
|
304
|
+
seedBase: 42,
|
|
305
|
+
continueOnError: true,
|
|
306
|
+
timeoutMs: 5000,
|
|
307
|
+
collectProvenance: false,
|
|
308
|
+
},
|
|
309
|
+
};
|
|
310
|
+
const executor = new WorkerExecutor(mockParentPort, mockModuleLoader, "/test/root");
|
|
311
|
+
await executor.executeBatch(message);
|
|
312
|
+
assert.strictEqual(registerSpy.mock.calls.length, 1);
|
|
313
|
+
});
|
|
314
|
+
it("should call registerAllBenchmarkCases on registry module", async () => {
|
|
315
|
+
const registerSpy = mock.fn(async () => ({}));
|
|
316
|
+
mockModuleLoader.loadRegistry = async () => {
|
|
317
|
+
return {
|
|
318
|
+
registerAllBenchmarkCases: registerSpy,
|
|
319
|
+
};
|
|
320
|
+
};
|
|
321
|
+
const message = {
|
|
322
|
+
runs: [{ runId: "test-1", sutId: "sut-1", caseId: "case-1", repetition: 0, config: {} }],
|
|
323
|
+
config: {
|
|
324
|
+
repetitions: 1,
|
|
325
|
+
seedBase: 42,
|
|
326
|
+
continueOnError: true,
|
|
327
|
+
timeoutMs: 5000,
|
|
328
|
+
collectProvenance: false,
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
const executor = new WorkerExecutor(mockParentPort, mockModuleLoader, "/test/root");
|
|
332
|
+
await executor.executeBatch(message);
|
|
333
|
+
assert.strictEqual(registerSpy.mock.calls.length, 1);
|
|
334
|
+
});
|
|
335
|
+
it("should create sutRegistry with list and getFactory methods", async () => {
|
|
336
|
+
let capturedSutRegistry;
|
|
337
|
+
mockModuleLoader.loadEvaluate = async () => {
|
|
338
|
+
return {
|
|
339
|
+
getSutDefinitions: (registry) => {
|
|
340
|
+
capturedSutRegistry = registry;
|
|
341
|
+
return {};
|
|
342
|
+
},
|
|
343
|
+
getCaseDefinitions: () => ({}),
|
|
344
|
+
};
|
|
345
|
+
};
|
|
346
|
+
const message = {
|
|
347
|
+
runs: [{ runId: "test-1", sutId: "sut-1", caseId: "case-1", repetition: 0, config: {} }],
|
|
348
|
+
config: {
|
|
349
|
+
repetitions: 1,
|
|
350
|
+
seedBase: 42,
|
|
351
|
+
continueOnError: true,
|
|
352
|
+
timeoutMs: 5000,
|
|
353
|
+
collectProvenance: false,
|
|
354
|
+
},
|
|
355
|
+
};
|
|
356
|
+
const executor = new WorkerExecutor(mockParentPort, mockModuleLoader, "/test/root");
|
|
357
|
+
await executor.executeBatch(message);
|
|
358
|
+
assert.ok(capturedSutRegistry);
|
|
359
|
+
assert.strictEqual(typeof capturedSutRegistry.list, "function");
|
|
360
|
+
assert.strictEqual(typeof capturedSutRegistry.getFactory, "function");
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
//# sourceMappingURL=worker-entry.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-entry.unit.test.js","sourceRoot":"","sources":["../../../src/executor/__tests__/worker-entry.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,9 +8,90 @@
|
|
|
8
8
|
* results/execute/checkpoint-worker-00.json
|
|
9
9
|
* results/execute/checkpoint-worker-01.json
|
|
10
10
|
* ...
|
|
11
|
+
*
|
|
12
|
+
* Dependency Injection:
|
|
13
|
+
* - Logger interface enables testing of log output
|
|
14
|
+
* - ProcessSpawner interface enables mocking spawn() calls
|
|
15
|
+
* - SystemInfo interface enables testing CPU count and node path logic
|
|
11
16
|
*/
|
|
12
17
|
import type { EvaluationResult } from "../types/result.js";
|
|
13
18
|
import type { ExecutorConfig, PlannedRun } from "./executor.js";
|
|
19
|
+
/**
|
|
20
|
+
* Logger interface for output handling.
|
|
21
|
+
* Enables testing of log messages.
|
|
22
|
+
*/
|
|
23
|
+
export interface ILogger {
|
|
24
|
+
log(message: string): void;
|
|
25
|
+
debug(message: string): void;
|
|
26
|
+
info(message: string): void;
|
|
27
|
+
warn(message: string): void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Production logger using console.
|
|
31
|
+
*/
|
|
32
|
+
export declare class ConsoleLogger implements ILogger {
|
|
33
|
+
log(message: string): void;
|
|
34
|
+
debug(message: string): void;
|
|
35
|
+
info(message: string): void;
|
|
36
|
+
warn(message: string): void;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Spawn options matching child_process.spawn signature.
|
|
40
|
+
*/
|
|
41
|
+
export interface SpawnOptions {
|
|
42
|
+
cwd?: string;
|
|
43
|
+
stdio?: "inherit" | "pipe" | "ignore";
|
|
44
|
+
env?: Record<string, string | undefined>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Child process interface.
|
|
48
|
+
* Abstraction over Node.js ChildProcess.
|
|
49
|
+
*/
|
|
50
|
+
export interface IChildProcess {
|
|
51
|
+
on(event: string, listener: (...args: unknown[]) => void): void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Process spawner interface.
|
|
55
|
+
* Enables mocking of spawn() for testing.
|
|
56
|
+
*/
|
|
57
|
+
export interface IProcessSpawner {
|
|
58
|
+
spawn(command: string, args: string[], options: SpawnOptions): IChildProcess;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Production process spawner using node:child_process.
|
|
62
|
+
*/
|
|
63
|
+
export declare class ProcessSpawner implements IProcessSpawner {
|
|
64
|
+
spawn(command: string, args: string[], options: SpawnOptions): IChildProcess;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* System information interface.
|
|
68
|
+
* Enables testing of CPU count and node path logic.
|
|
69
|
+
*/
|
|
70
|
+
export interface ISystemInfo {
|
|
71
|
+
/** Number of CPU cores available */
|
|
72
|
+
cpuCount: number;
|
|
73
|
+
/** Path to the Node.js executable */
|
|
74
|
+
nodePath: string;
|
|
75
|
+
/** Package root directory */
|
|
76
|
+
packageRoot: string;
|
|
77
|
+
/** Current process environment */
|
|
78
|
+
env: Record<string, string | undefined>;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Production system info using node:os and process.
|
|
82
|
+
*/
|
|
83
|
+
export declare class SystemInfo implements ISystemInfo {
|
|
84
|
+
cpuCount: number;
|
|
85
|
+
nodePath: string;
|
|
86
|
+
env: NodeJS.ProcessEnv;
|
|
87
|
+
readonly packageRoot: string;
|
|
88
|
+
constructor();
|
|
89
|
+
/**
|
|
90
|
+
* Get the package root directory by resolving from the entry point script.
|
|
91
|
+
* The CLI entry point is dist/cli.js, so we go up one level from there.
|
|
92
|
+
*/
|
|
93
|
+
private getPackageRoot;
|
|
94
|
+
}
|
|
14
95
|
export interface ParallelExecutorOptions {
|
|
15
96
|
/** Number of parallel processes (default: CPU count) */
|
|
16
97
|
workers?: number;
|
|
@@ -21,6 +102,12 @@ export interface ParallelExecutorOptions {
|
|
|
21
102
|
/** Per-run timeout in milliseconds (0 = no timeout) */
|
|
22
103
|
timeoutMs?: number;
|
|
23
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* Generate random worker names using tech-themed adjectives.
|
|
107
|
+
* Returns unique names for each worker.
|
|
108
|
+
* @param count
|
|
109
|
+
*/
|
|
110
|
+
export declare const generateWorkerNames: (count: number) => string[];
|
|
24
111
|
/**
|
|
25
112
|
* Generate sharded checkpoint path for a worker.
|
|
26
113
|
*
|
|
@@ -29,17 +116,116 @@ export interface ParallelExecutorOptions {
|
|
|
29
116
|
* @returns Path to the worker's checkpoint file
|
|
30
117
|
*/
|
|
31
118
|
export declare const shardPath: (checkpointDir: string, workerIndex: number) => string;
|
|
119
|
+
/**
|
|
120
|
+
* Batch of runs for a worker.
|
|
121
|
+
*/
|
|
122
|
+
export interface RunBatch {
|
|
123
|
+
/** Batch index */
|
|
124
|
+
index: number;
|
|
125
|
+
/** Run IDs in this batch */
|
|
126
|
+
runIds: string[];
|
|
127
|
+
/** JSON filter string for CLI */
|
|
128
|
+
filter: string;
|
|
129
|
+
/** First run ID in batch */
|
|
130
|
+
firstRunId: string;
|
|
131
|
+
/** Last run ID in batch */
|
|
132
|
+
lastRunId: string;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Worker configuration.
|
|
136
|
+
*/
|
|
137
|
+
export interface WorkerConfig {
|
|
138
|
+
/** Worker index */
|
|
139
|
+
index: number;
|
|
140
|
+
/** Worker name */
|
|
141
|
+
name: string;
|
|
142
|
+
/** Checkpoint path for this worker */
|
|
143
|
+
checkpointPath: string;
|
|
144
|
+
/** CLI arguments */
|
|
145
|
+
arguments: string[];
|
|
146
|
+
/** Environment variables */
|
|
147
|
+
env: Record<string, string | undefined>;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Parallel executor class with dependency injection.
|
|
151
|
+
*
|
|
152
|
+
* Spawns multiple Node.js processes, each executing a subset of runs.
|
|
153
|
+
* Each worker writes to its own sharded checkpoint file to avoid race conditions.
|
|
154
|
+
*/
|
|
155
|
+
export declare class ParallelExecutor {
|
|
156
|
+
private readonly logger;
|
|
157
|
+
private readonly spawner;
|
|
158
|
+
private readonly systemInfo;
|
|
159
|
+
constructor(logger?: ILogger, spawner?: IProcessSpawner, systemInfo?: ISystemInfo);
|
|
160
|
+
/**
|
|
161
|
+
* Split runs into batches for parallel processing.
|
|
162
|
+
* @param runs - Runs to distribute
|
|
163
|
+
* @param numberWorkers - Number of worker processes
|
|
164
|
+
* @returns Array of run batches
|
|
165
|
+
*/
|
|
166
|
+
_createBatches(runs: PlannedRun[], numberWorkers: number): RunBatch[];
|
|
167
|
+
/**
|
|
168
|
+
* Create worker configurations for all batches.
|
|
169
|
+
* @param batches - Run batches
|
|
170
|
+
* @param workerNames - Names for each worker
|
|
171
|
+
* @param cliPath - Path to CLI entry point
|
|
172
|
+
* @param checkpointDir - Base checkpoint directory
|
|
173
|
+
* @param timeoutMs - Per-run timeout in milliseconds
|
|
174
|
+
* @returns Array of worker configurations
|
|
175
|
+
*/
|
|
176
|
+
_createWorkerConfigs(batches: RunBatch[], workerNames: string[], cliPath: string, checkpointDir: string, timeoutMs: number): WorkerConfig[];
|
|
177
|
+
/**
|
|
178
|
+
* Spawn worker processes for all configurations.
|
|
179
|
+
* @param workerConfigs - Worker configurations
|
|
180
|
+
* @param nodePath - Path to node executable
|
|
181
|
+
* @param packageRoot - Package root directory
|
|
182
|
+
* @returns Array of child processes
|
|
183
|
+
*/
|
|
184
|
+
_spawnWorkers(workerConfigs: WorkerConfig[], nodePath: string, packageRoot: string): IChildProcess[];
|
|
185
|
+
/**
|
|
186
|
+
* Wait for all workers to complete.
|
|
187
|
+
* @param workers - Child processes
|
|
188
|
+
* @returns Promise that resolves when all workers exit
|
|
189
|
+
*/
|
|
190
|
+
_waitForWorkers(workers: IChildProcess[]): Promise<number[]>;
|
|
191
|
+
/**
|
|
192
|
+
* Execute runs using multiple parallel processes.
|
|
193
|
+
*
|
|
194
|
+
* Each worker writes to its own sharded checkpoint file to avoid race conditions.
|
|
195
|
+
* After all workers complete, the main process should merge the shards.
|
|
196
|
+
*
|
|
197
|
+
* @param runs - Planned runs to execute
|
|
198
|
+
* @param suts - SUT definitions (not used directly, passed to workers)
|
|
199
|
+
* @param cases - Case definitions (not used directly, passed to workers)
|
|
200
|
+
* @param config - Executor configuration
|
|
201
|
+
* @param options - Parallel executor options
|
|
202
|
+
* @returns Execution results (empty - CLI will load from shards)
|
|
203
|
+
*/
|
|
204
|
+
execute(runs: PlannedRun[], _suts: unknown, _cases: unknown[], config: ExecutorConfig & {
|
|
205
|
+
onResult?: (result: EvaluationResult) => void;
|
|
206
|
+
}, options?: ParallelExecutorOptions): Promise<{
|
|
207
|
+
results: EvaluationResult[];
|
|
208
|
+
errors: {
|
|
209
|
+
runId: string;
|
|
210
|
+
error: string;
|
|
211
|
+
}[];
|
|
212
|
+
}>;
|
|
213
|
+
}
|
|
32
214
|
/**
|
|
33
215
|
* Execute runs using multiple parallel processes.
|
|
34
216
|
*
|
|
35
217
|
* Each worker writes to its own sharded checkpoint file to avoid race conditions.
|
|
36
218
|
* After all workers complete, the main process should merge the shards.
|
|
37
219
|
*
|
|
220
|
+
* This is a convenience function that creates a ParallelExecutor with default dependencies.
|
|
221
|
+
* For testing or custom behavior, use the ParallelExecutor class directly.
|
|
222
|
+
*
|
|
38
223
|
* @param runs - Planned runs to execute
|
|
39
224
|
* @param suts - SUT definitions (not used directly, passed to workers)
|
|
40
225
|
* @param cases - Case definitions (not used directly, passed to workers)
|
|
41
226
|
* @param config - Executor configuration
|
|
42
227
|
* @param options - Parallel executor options
|
|
228
|
+
* @returns Execution results (empty - CLI will load from shards)
|
|
43
229
|
*/
|
|
44
230
|
export declare const executeParallel: (runs: PlannedRun[], suts: unknown, cases: unknown[], config: ExecutorConfig & {
|
|
45
231
|
onResult?: (result: EvaluationResult) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallel-executor.d.ts","sourceRoot":"","sources":["../../src/executor/parallel-executor.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"parallel-executor.d.ts","sourceRoot":"","sources":["../../src/executor/parallel-executor.ts"],"names":[],"mappings":"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"}
|