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.
Files changed (175) hide show
  1. package/bin/ppef.mjs +20 -0
  2. package/dist/__tests__/framework-pipeline.integration.test.js +13 -11
  3. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
  4. package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
  5. package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/index-exports.unit.test.js +127 -0
  7. package/dist/__tests__/index-exports.unit.test.js.map +1 -0
  8. package/dist/__tests__/registry-executor.integration.test.js +12 -9
  9. package/dist/__tests__/registry-executor.integration.test.js.map +1 -1
  10. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
  11. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
  12. package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
  13. package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
  14. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
  15. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
  16. package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
  17. package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
  18. package/dist/aggregation/aggregators.d.ts +9 -0
  19. package/dist/aggregation/aggregators.d.ts.map +1 -1
  20. package/dist/aggregation/aggregators.js +1 -1
  21. package/dist/aggregation/aggregators.js.map +1 -1
  22. package/dist/aggregation/index.d.ts +1 -1
  23. package/dist/aggregation/index.d.ts.map +1 -1
  24. package/dist/aggregation/index.js +1 -1
  25. package/dist/aggregation/index.js.map +1 -1
  26. package/dist/claims/__tests__/evaluator.unit.test.d.ts +12 -0
  27. package/dist/claims/__tests__/evaluator.unit.test.d.ts.map +1 -0
  28. package/dist/claims/__tests__/evaluator.unit.test.js +801 -0
  29. package/dist/claims/__tests__/evaluator.unit.test.js.map +1 -0
  30. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
  31. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
  32. package/dist/cli/__tests__/aggregate.command.unit.test.js +396 -0
  33. package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
  34. package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
  35. package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
  36. package/dist/cli/__tests__/commands.unit.test.js +217 -0
  37. package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
  38. package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
  39. package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
  40. package/dist/cli/__tests__/index.unit.test.js +65 -0
  41. package/dist/cli/__tests__/index.unit.test.js.map +1 -0
  42. package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
  43. package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
  44. package/dist/cli/__tests__/logger.unit.test.js +180 -0
  45. package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
  46. package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
  47. package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
  48. package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
  49. package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
  50. package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
  51. package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
  52. package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
  53. package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
  54. package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
  55. package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
  56. package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
  57. package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
  58. package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
  59. package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
  60. package/dist/cli/__tests__/run.command.unit.test.js +422 -0
  61. package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
  62. package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
  63. package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
  64. package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
  65. package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
  66. package/dist/cli/command-deps.d.ts +125 -0
  67. package/dist/cli/command-deps.d.ts.map +1 -0
  68. package/dist/cli/command-deps.js +7 -0
  69. package/dist/cli/command-deps.js.map +1 -0
  70. package/dist/cli/commands/aggregate.d.ts +35 -0
  71. package/dist/cli/commands/aggregate.d.ts.map +1 -0
  72. package/dist/cli/commands/aggregate.js +121 -0
  73. package/dist/cli/commands/aggregate.js.map +1 -0
  74. package/dist/cli/commands/plan.d.ts +36 -0
  75. package/dist/cli/commands/plan.d.ts.map +1 -0
  76. package/dist/cli/commands/plan.js +109 -0
  77. package/dist/cli/commands/plan.js.map +1 -0
  78. package/dist/cli/commands/run.d.ts +33 -0
  79. package/dist/cli/commands/run.d.ts.map +1 -0
  80. package/dist/cli/commands/run.js +185 -0
  81. package/dist/cli/commands/run.js.map +1 -0
  82. package/dist/cli/commands/validate.d.ts +27 -0
  83. package/dist/cli/commands/validate.d.ts.map +1 -0
  84. package/dist/cli/commands/validate.js +88 -0
  85. package/dist/cli/commands/validate.js.map +1 -0
  86. package/dist/cli/config-loader.d.ts +30 -0
  87. package/dist/cli/config-loader.d.ts.map +1 -0
  88. package/dist/cli/config-loader.js +181 -0
  89. package/dist/cli/config-loader.js.map +1 -0
  90. package/dist/cli/index.d.ts +26 -0
  91. package/dist/cli/index.d.ts.map +1 -0
  92. package/dist/cli/index.js +58 -0
  93. package/dist/cli/index.js.map +1 -0
  94. package/dist/cli/logger.d.ts +75 -0
  95. package/dist/cli/logger.d.ts.map +1 -0
  96. package/dist/cli/logger.js +131 -0
  97. package/dist/cli/logger.js.map +1 -0
  98. package/dist/cli/module-loader.d.ts +46 -0
  99. package/dist/cli/module-loader.d.ts.map +1 -0
  100. package/dist/cli/module-loader.js +116 -0
  101. package/dist/cli/module-loader.js.map +1 -0
  102. package/dist/cli/output-writer.d.ts +51 -0
  103. package/dist/cli/output-writer.d.ts.map +1 -0
  104. package/dist/cli/output-writer.js +65 -0
  105. package/dist/cli/output-writer.js.map +1 -0
  106. package/dist/cli/types.d.ts +174 -0
  107. package/dist/cli/types.d.ts.map +1 -0
  108. package/dist/cli/types.js +7 -0
  109. package/dist/cli/types.js.map +1 -0
  110. package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
  111. package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
  112. package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
  113. package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
  114. package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
  115. package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
  116. package/dist/collector/__tests__/schema.unit.test.js +360 -0
  117. package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
  118. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +83 -1
  119. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -1
  120. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +3 -6
  121. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -1
  122. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +428 -159
  123. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -1
  124. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +105 -1
  125. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
  126. package/dist/executor/__tests__/executor.unit.test.js +69 -1
  127. package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
  128. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
  129. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
  130. package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
  131. package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
  132. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +2 -1
  133. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -1
  134. package/dist/executor/__tests__/parallel-executor.unit.test.js +426 -156
  135. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -1
  136. package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
  137. package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
  138. package/dist/executor/__tests__/run-id.unit.test.js +156 -0
  139. package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
  140. package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
  141. package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
  142. package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
  143. package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
  144. package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
  145. package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
  146. package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
  147. package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
  148. package/dist/executor/parallel-executor.d.ts +186 -0
  149. package/dist/executor/parallel-executor.d.ts.map +1 -1
  150. package/dist/executor/parallel-executor.js +218 -83
  151. package/dist/executor/parallel-executor.js.map +1 -1
  152. package/dist/executor/run-id.d.ts.map +1 -1
  153. package/dist/executor/run-id.js +8 -1
  154. package/dist/executor/run-id.js.map +1 -1
  155. package/dist/executor/worker-entry.d.ts +2 -0
  156. package/dist/executor/worker-entry.d.ts.map +1 -1
  157. package/dist/executor/worker-entry.js +29 -54
  158. package/dist/executor/worker-entry.js.map +1 -1
  159. package/dist/executor/worker-executor.d.ts +156 -0
  160. package/dist/executor/worker-executor.d.ts.map +1 -0
  161. package/dist/executor/worker-executor.js +88 -0
  162. package/dist/executor/worker-executor.js.map +1 -0
  163. package/dist/robustness/__tests__/analyzer.unit.test.d.ts +11 -0
  164. package/dist/robustness/__tests__/analyzer.unit.test.d.ts.map +1 -0
  165. package/dist/robustness/__tests__/analyzer.unit.test.js +455 -0
  166. package/dist/robustness/__tests__/analyzer.unit.test.js.map +1 -0
  167. package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
  168. package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
  169. package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
  170. package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
  171. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
  172. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
  173. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
  174. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
  175. 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;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA0BhE,MAAM,WAAW,uBAAuB;IACvC,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AA8ED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,eAAe,MAAM,EAAE,aAAa,MAAM,KAAG,MACkB,CAAC;AAE1F;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,GAC3B,MAAM,UAAU,EAAE,EAClB,MAAM,OAAO,EACb,OAAO,OAAO,EAAE,EAChB,QAAQ,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAAE,EAC1E,UAAS,uBAA4B,KACnC,OAAO,CAAC;IAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAkFrF,CAAC"}
1
+ {"version":3,"file":"parallel-executor.d.ts","sourceRoot":"","sources":["../../src/executor/parallel-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,OAAO;IACvB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,OAAO;IAC5C,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI1B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAG3B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAChE;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,aAAa,CAAC;CAC7E;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,eAAe;IACrD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,aAAa;CAG5E;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC3B,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IAEjB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IAEjB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IAEpB,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACxC;AAED;;GAEG;AACH,qBAAa,UAAW,YAAW,WAAW;IAC7C,QAAQ,SAAiB;IACzB,QAAQ,SAAoB;IAC5B,GAAG,oBAAe;IAClB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;;IAM7B;;;OAGG;IACH,OAAO,CAAC,cAAc;CAiBtB;AAED,MAAM,WAAW,uBAAuB;IACvC,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,KAAG,MAAM,EAqEzD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,eAAe,MAAM,EAAE,aAAa,MAAM,KAAG,MACkB,CAAC;AAE1F;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IAEd,4BAA4B;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IAEf,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IAEnB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IAEd,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IAEb,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IAEvB,oBAAoB;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACxC;AAED;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;gBAE7B,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,WAAW;IAMjF;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,QAAQ,EAAE;IAqBrE;;;;;;;;OAQG;IACH,oBAAoB,CACnB,OAAO,EAAE,QAAQ,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,GACf,YAAY,EAAE;IAoCjB;;;;;;OAMG;IACH,aAAa,CACZ,aAAa,EAAE,YAAY,EAAE,EAC7B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GACjB,aAAa,EAAE;IAclB;;;;OAIG;IACG,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAalE;;;;;;;;;;;;OAYG;IACG,OAAO,CACZ,IAAI,EAAE,UAAU,EAAE,EAClB,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,OAAO,EAAE,EACjB,MAAM,EAAE,cAAc,GAAG;QAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;KAAE,EAC1E,OAAO,GAAE,uBAA4B,GACnC,OAAO,CAAC;QAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAAC,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;CAsDvF;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,eAAe,GAC3B,MAAM,UAAU,EAAE,EAClB,MAAM,OAAO,EACb,OAAO,OAAO,EAAE,EAChB,QAAQ,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAAE,EAC1E,UAAS,uBAA4B,KACnC,OAAO,CAAC;IAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAGrF,CAAC"}