mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-10 17:02:22 +03:00
* test(infra): retry recursive temp-dir removal instead of failing a shard on ENOTEMPTY (#11966) Two shards on release/v3.8.51 went red in one day with the same signature — "ENOTEMPTY, Directory not empty: /tmp/omniroute-<test>-XXXXXX" — from combo-same-provider-cascade (Unit Tests fast-path 4/4, on a PR that touches only .github/) and auth-policy-embeddings-webfetch-7785 (the 20k-test TIA step). Both pass alone and on re-run: the cleanup races something still writing into the directory (SQLite WAL/-shm checkpoint, a worker, the backup) and under a loaded hosted runner the window opens. 1154 test files do their own cleanup with fs.rmSync(dir, { recursive: true, force: true }); 57 already asked for retries. One-shot codemod (scripts/ad-hoc/codemod-rm-maxretries.mjs, kept for the record): every rm / rmSync / rmdirSync option object with `recursive: true` and no `maxRetries` gains `maxRetries: 5, retryDelay: 100` — Node itself then retries ENOTEMPTY/EBUSY/EPERM for up to ~0.5 s before giving up. 2243 call sites in 1292 files under tests/, the shared tests/_setup/isolateDataDir.ts exit hook included. Only the option object changes: no call site, assertion or import is touched. Validation: prettier and ESLint (with the frozen suppressions) clean on all 1292 files; a random 20-file sample runs green (quota-redis-store hangs identically on the untouched tree — it needs a Redis on localhost, an environment matter). The four unit shards on this PR are the full run. * fix(quality): let check-forgotten-sibling-tests read a 1,000-file diff The gate shells out to `git diff` through execFileSync with Node's default 1 MB maxBuffer; the 1,292-file codemod in this PR is the first diff large enough to overflow it, and the gate died with `spawnSync git ENOBUFS` before comparing anything. 64 MB is far above any real PR and costs nothing when unused.
87 lines
3.7 KiB
TypeScript
87 lines
3.7 KiB
TypeScript
import { test } from "node:test";
|
||
import assert from "node:assert/strict";
|
||
import fs from "node:fs";
|
||
import os from "node:os";
|
||
import path from "node:path";
|
||
import * as prebuildPlan from "../../scripts/build/electronRebuildPlan.mjs";
|
||
|
||
const {
|
||
SQLITE_PREBUILD_ARCHS,
|
||
SQLITE_PREBUILD_PLATFORMS,
|
||
isSqlitePrebuildSupported,
|
||
sqlitePrebuildFileName,
|
||
} = prebuildPlan;
|
||
|
||
// Since better-sqlite3 v13 (issue #10321 Stage 6) the Electron packaging no
|
||
// longer compiles the addon from source against the Electron headers: v13
|
||
// ships Node-API prebuilds for every packaged platform, and Node-API addons
|
||
// are ABI-independent (verified under electron 43 / NODE_MODULE_VERSION 148).
|
||
// These tests pin the prebuild selection logic that replaced the historical
|
||
// `npx node-gyp rebuild` spawn plan (whose win32 .cmd/shell quirk broke the
|
||
// v3.8.47 tag build — that entire code path is now gone).
|
||
|
||
test("prebuild file name mirrors better-sqlite3 lib/binding.js selection", () => {
|
||
assert.equal(sqlitePrebuildFileName("darwin", "arm64"), "darwin-arm64.node");
|
||
assert.equal(sqlitePrebuildFileName("darwin", "x64"), "darwin-x64.node");
|
||
assert.equal(sqlitePrebuildFileName("win32", "x64"), "win32-x64.node");
|
||
assert.equal(sqlitePrebuildFileName("win32", "arm64"), "win32-arm64.node");
|
||
});
|
||
|
||
test("linux resolves to the musl prebuild when glibcVersionRuntime is absent", () => {
|
||
// glibc build (GitHub ubuntu runner): header carries the runtime glibc version
|
||
assert.equal(
|
||
sqlitePrebuildFileName("linux", "x64", { glibcVersionRuntime: "2.39" }),
|
||
"linux-x64.node"
|
||
);
|
||
// musl build (Alpine): no glibcVersionRuntime -> linuxmusl prebuild
|
||
assert.equal(sqlitePrebuildFileName("linux", "x64", {}), "linuxmusl-x64.node");
|
||
assert.equal(sqlitePrebuildFileName("linux", "arm64", undefined), "linuxmusl-arm64.node");
|
||
});
|
||
|
||
test("prebuild support covers exactly the packaged platform/arch matrix", () => {
|
||
for (const platform of ["darwin", "linux", "win32"]) {
|
||
for (const arch of ["x64", "arm64"]) {
|
||
assert.equal(isSqlitePrebuildSupported(platform, arch), true);
|
||
}
|
||
}
|
||
assert.equal(isSqlitePrebuildSupported("freebsd", "x64"), false);
|
||
assert.equal(isSqlitePrebuildSupported("darwin", "ia32"), false);
|
||
});
|
||
|
||
test("packaged platform matrix matches the shipped prebuild inventory", () => {
|
||
// better-sqlite3 v13 prebuilds/: darwin/linux/linuxmusl/win32 × x64/arm64.
|
||
// The build fails fast when the prebuild for the CURRENT platform is missing,
|
||
// so this matrix must stay in sync with the npm tarball contents.
|
||
assert.deepEqual(SQLITE_PREBUILD_PLATFORMS, ["darwin", "linux", "linuxmusl", "win32"]);
|
||
assert.deepEqual(SQLITE_PREBUILD_ARCHS, ["x64", "arm64"]);
|
||
});
|
||
|
||
test("prebuild verification fails fast when the selected binary is missing", () => {
|
||
const assertSqlitePrebuildExists = (
|
||
prebuildPlan as typeof prebuildPlan & {
|
||
assertSqlitePrebuildExists?: (
|
||
moduleDir: string,
|
||
platform: string,
|
||
arch: string,
|
||
reportHeader?: { glibcVersionRuntime?: string | null }
|
||
) => string | null;
|
||
}
|
||
).assertSqlitePrebuildExists;
|
||
assert.equal(typeof assertSqlitePrebuildExists, "function");
|
||
|
||
const moduleDir = fs.mkdtempSync(path.join(os.tmpdir(), "sqlite-prebuild-"));
|
||
try {
|
||
assert.throws(
|
||
() => assertSqlitePrebuildExists?.(moduleDir, "darwin", "arm64"),
|
||
/better-sqlite3 prebuild missing for darwin-arm64/
|
||
);
|
||
|
||
const expected = path.join(moduleDir, "prebuilds", "darwin-arm64.node");
|
||
fs.mkdirSync(path.dirname(expected), { recursive: true });
|
||
fs.writeFileSync(expected, "napi");
|
||
assert.equal(assertSqlitePrebuildExists?.(moduleDir, "darwin", "arm64"), expected);
|
||
} finally {
|
||
fs.rmSync(moduleDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });
|
||
}
|
||
});
|