From f5e46c9bf2f50d66a953fa133161fc829cecff06 Mon Sep 17 00:00:00 2001 From: Matt Mastracci Date: Sat, 10 Feb 2024 13:22:13 -0700 Subject: chore: move cli/tests/ -> tests/ (#22369) This looks like a massive PR, but it's only a move from cli/tests -> tests, and updates of relative paths for files. This is the first step towards aggregate all of the integration test files under tests/, which will lead to a set of integration tests that can run without the CLI binary being built. While we could leave these tests under `cli`, it would require us to keep a more complex directory structure for the various test runners. In addition, we have a lot of complexity to ignore various test files in the `cli` project itself (cargo publish exclusion rules, autotests = false, etc). And finally, the `tests/` folder will eventually house the `test_ffi`, `test_napi` and other testing code, reducing the size of the root repo directory. For easier review, the extremely large and noisy "move" is in the first commit (with no changes -- just a move), while the remainder of the changes to actual files is in the second commit. --- tests/testdata/workers/bench_round_robin.ts | 65 +++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 tests/testdata/workers/bench_round_robin.ts (limited to 'tests/testdata/workers/bench_round_robin.ts') diff --git a/tests/testdata/workers/bench_round_robin.ts b/tests/testdata/workers/bench_round_robin.ts new file mode 100644 index 000000000..0380d7979 --- /dev/null +++ b/tests/testdata/workers/bench_round_robin.ts @@ -0,0 +1,65 @@ +// Benchmark measures time it takes to send a message to a group of workers one +// at a time and wait for a response from all of them. Just a general +// throughput and consistency benchmark. +const data = "HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World\n"; +const workerCount = 4; +const cmdsPerWorker = 400; + +function handleAsyncMsgFromWorker( + promiseTable: Map>>, + msg: { cmdId: number; data: string }, +) { + const promise = promiseTable.get(msg.cmdId); + if (promise === null) { + throw new Error(`Failed to find promise: cmdId: ${msg.cmdId}, msg: ${msg}`); + } + promise?.resolve(data); +} + +async function main() { + const workers: Array< + [Map>>, Worker] + > = []; + for (let i = 1; i <= workerCount; ++i) { + const worker = new Worker( + import.meta.resolve("./bench_worker.ts"), + { type: "module" }, + ); + const { promise, resolve } = Promise.withResolvers(); + worker.onmessage = (e) => { + if (e.data.cmdId === 0) resolve(); + }; + worker.postMessage({ cmdId: 0, action: 2 }); + await promise; + workers.push([new Map(), worker]); + } + // assign callback function + for (const [promiseTable, worker] of workers) { + worker.onmessage = (e) => { + handleAsyncMsgFromWorker(promiseTable, e.data); + }; + } + for (const cmdId of Array(cmdsPerWorker).keys()) { + const promises: Array> = []; + for (const [promiseTable, worker] of workers) { + const deferred = Promise.withResolvers(); + promiseTable.set(cmdId, deferred); + worker.postMessage({ cmdId: cmdId, action: 1, data }); + promises.push(deferred.promise); + } + for (const promise of promises) { + await promise; + } + } + for (const [, worker] of workers) { + const { promise, resolve } = Promise.withResolvers(); + worker.onmessage = (e) => { + if (e.data.cmdId === 3) resolve(); + }; + worker.postMessage({ action: 3 }); + await promise; + } + console.log("Finished!"); +} + +main(); -- cgit v1.2.3