Add deterministic tests
This commit is contained in:
parent
6fbbd1e12f
commit
0ce82353e0
20 changed files with 1780 additions and 0 deletions
5
frontend/deterministic-tests/src/utils/assert.ts
Normal file
5
frontend/deterministic-tests/src/utils/assert.ts
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
export function assert(value: boolean, message: string): asserts value {
|
||||
if (!value) {
|
||||
throw new Error(message);
|
||||
}
|
||||
}
|
||||
29
frontend/deterministic-tests/src/utils/find-free-port.ts
Normal file
29
frontend/deterministic-tests/src/utils/find-free-port.ts
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
import * as net from "node:net";
|
||||
|
||||
export interface PortReservation {
|
||||
port: number;
|
||||
release: () => void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a free port and keep it reserved until the caller explicitly releases it.
|
||||
*/
|
||||
export async function findFreePort(): Promise<PortReservation> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const server = net.createServer();
|
||||
server.listen(0, "127.0.0.1", () => {
|
||||
const addr = server.address();
|
||||
if (addr === null || typeof addr === "string") {
|
||||
server.close();
|
||||
reject(new Error("Failed to get port from server"));
|
||||
return;
|
||||
}
|
||||
const { port } = addr;
|
||||
resolve({
|
||||
port,
|
||||
release: () => server.close()
|
||||
});
|
||||
});
|
||||
server.on("error", reject);
|
||||
});
|
||||
}
|
||||
3
frontend/deterministic-tests/src/utils/sleep.ts
Normal file
3
frontend/deterministic-tests/src/utils/sleep.ts
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
export async function sleep(ms: number): Promise<void> {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
}
|
||||
15
frontend/deterministic-tests/src/utils/with-timeout.ts
Normal file
15
frontend/deterministic-tests/src/utils/with-timeout.ts
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
export async function withTimeout<T>(
|
||||
promise: Promise<T>,
|
||||
timeoutMs: number,
|
||||
message: string
|
||||
): Promise<T> {
|
||||
let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined;
|
||||
const timeoutPromise = new Promise<never>((_resolve, reject) => {
|
||||
timeoutId = setTimeout(() => {
|
||||
reject(new Error(message));
|
||||
}, timeoutMs);
|
||||
});
|
||||
return Promise.race([promise, timeoutPromise]).finally(() => {
|
||||
clearTimeout(timeoutId);
|
||||
});
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue