mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-22 06:42:19 +03:00
fix(release): the packaged-app smoke verifies the database opened, not a driver line the primary path never prints (twin of #12032) (#12047)
* fix(release): the packaged-app smoke verifies the database opened, not a driver line the primary path never prints (release/v3.8.51 twin of #12032) Same change as #12032 on main: the packaged app opens SQLite during the smoke but its primary open path prints no "[DB] Driver: …" line (only the recovery path and the sql.js fallback do), so the #7592 assertion failed every Linux release leg. The guard rejects the sql.js fallback line, accepts a native driver line, and otherwise accepts demonstrable database activity; after readiness the smoke requests /api/monitoring/health and waits for that activity outside the readiness loop. electron-smoke-script suite 10/10. * fix(release): reapply the smoke rework on top of release/v3.8.51's own copy of the script The previous commit copied main's file wholesale and dropped this branch's ensureSmokeEnvDirs(currentPlatform) fix and its tests; this reapplies only the DB-open evidence change as a patch. electron-smoke-script suite green.
This commit is contained in:
committed by
GitHub
parent
38e2616464
commit
47f7e5a306
@@ -123,6 +123,48 @@ function discoverPackagedExecutable() {
|
||||
throw new Error(`Packaged Electron smoke check does not support ${platform()}.`);
|
||||
}
|
||||
|
||||
/**
|
||||
* The packaged app opens SQLite lazily: `/login` (the readiness URL) never touches the
|
||||
* database, so a smoke that only waits for readiness sees no `[DB]` line at all. After
|
||||
* readiness the smoke requests a DB-backed endpoint and waits for evidence that the
|
||||
* database opened. The primary open path does NOT print "[DB] Driver: ..." (only the
|
||||
* recovery path and the sql.js fallback do), so the evidence is any `[DB]`/`[Migration]`
|
||||
* startup line — and the #7592 guard below rejects the fallback's own line explicitly.
|
||||
*/
|
||||
export const DB_TOUCH_PATH = "/api/monitoring/health";
|
||||
export const DB_OPEN_EVIDENCE_PATTERN =
|
||||
/\[DB\] (Driver: |SQLite database ready|Added [^\n]* column|Changing cache_size|cache_size changed)|\[Migration\] (Applied|Pre-migration backup)/;
|
||||
|
||||
export async function waitForDatabaseOpen(getLogs, { timeoutMs = 15_000, pollMs = 250 } = {}) {
|
||||
const startedAt = Date.now();
|
||||
while (Date.now() - startedAt < timeoutMs) {
|
||||
const logs = getLogs();
|
||||
assertNoFatalLogs(logs);
|
||||
if (DB_OPEN_EVIDENCE_PATTERN.test(logs)) return logs;
|
||||
await sleep(pollMs);
|
||||
}
|
||||
throw new Error(
|
||||
`Packaged Electron app logged no [DB]/[Migration] startup line within ${timeoutMs}ms of ` +
|
||||
`touching ${DB_TOUCH_PATH} — the database never opened, so the SQLite driver cannot be verified.`
|
||||
);
|
||||
}
|
||||
|
||||
async function openDatabaseForSmoke({ logs, smokeUrl }) {
|
||||
const touchUrl = new URL(DB_TOUCH_PATH, smokeUrl).toString();
|
||||
try {
|
||||
const response = await fetchWithTimeout(touchUrl, 5_000);
|
||||
console.log(
|
||||
`[electron-smoke] touched ${touchUrl} (HTTP ${response.status}) to open the database`
|
||||
);
|
||||
} catch (error) {
|
||||
console.log(
|
||||
`[electron-smoke] touching ${touchUrl} failed (${error instanceof Error ? error.message : String(error)}) — waiting for the database anyway`
|
||||
);
|
||||
}
|
||||
await waitForDatabaseOpen(() => logs.value);
|
||||
console.log("[electron-smoke] database opened");
|
||||
}
|
||||
|
||||
async function fetchWithTimeout(url, timeoutMs) {
|
||||
const controller = new AbortController();
|
||||
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
||||
@@ -465,8 +507,13 @@ export function assertNativeDriverSelected(logs) {
|
||||
);
|
||||
}
|
||||
|
||||
// The primary open path prints no "[DB] Driver: ..." line at all (only the recovery path and
|
||||
// the sql.js fallback do), so a database that demonstrably opened WITHOUT the fallback's own
|
||||
// line is the native driver — that is exactly what #7592 guards.
|
||||
if (DB_OPEN_EVIDENCE_PATTERN.test(logs)) return;
|
||||
|
||||
throw new Error(
|
||||
"Packaged Electron app logs contain no '[DB] Driver: ...' line — cannot confirm which SQLite " +
|
||||
"Packaged Electron app logs show no database activity at all — cannot confirm which SQLite " +
|
||||
"driver loaded."
|
||||
);
|
||||
}
|
||||
@@ -560,6 +607,8 @@ async function launchAndCollectLogs({
|
||||
|
||||
try {
|
||||
await waitForReady({ logs, smokeUrl, timeoutMs, settleMs, exitState });
|
||||
// Outside waitForReady on purpose: a missing database is a verdict, not a readiness retry.
|
||||
await openDatabaseForSmoke({ logs, smokeUrl });
|
||||
return logs.value;
|
||||
} catch (error) {
|
||||
if (!streamLogs) {
|
||||
|
||||
@@ -11,6 +11,8 @@ import {
|
||||
FATAL_LOG_PATTERNS,
|
||||
LINUX_EXECUTABLE_NAMES,
|
||||
stopApp,
|
||||
waitForDatabaseOpen,
|
||||
DB_TOUCH_PATH,
|
||||
} from "../../scripts/dev/smoke-electron-packaged.mjs";
|
||||
import { tarPack } from "../../scripts/build/optionalPackStaging.mjs";
|
||||
|
||||
@@ -147,6 +149,46 @@ test("electron smoke flags a cold-restart fallback to the sql.js WASM driver", (
|
||||
test("electron smoke flags startup logs missing any driver selection line", () => {
|
||||
assert.throws(
|
||||
() => assertNativeDriverSelected("[electron] [server] listening on 20128"),
|
||||
/no '\[DB\] Driver: \.\.\.' line/
|
||||
/no database activity/
|
||||
);
|
||||
});
|
||||
|
||||
test("electron smoke waits for database-open evidence after touching a DB-backed endpoint", async () => {
|
||||
assert.equal(DB_TOUCH_PATH, "/api/monitoring/health");
|
||||
let logs = "[electron] [Server] [STARTUP] ready\n";
|
||||
setTimeout(() => {
|
||||
logs += "[electron] [Server] [DB] Added usage_history.combo_strategy column\n";
|
||||
}, 60);
|
||||
const seen = await waitForDatabaseOpen(() => logs, { timeoutMs: 2_000, pollMs: 20 });
|
||||
assert.match(seen, /\[DB\] Added/);
|
||||
});
|
||||
|
||||
test("electron smoke fails clearly when the database never opens", async () => {
|
||||
await assert.rejects(
|
||||
() =>
|
||||
waitForDatabaseOpen(() => "[electron] [Server] [STARTUP] ready\n", {
|
||||
timeoutMs: 120,
|
||||
pollMs: 20,
|
||||
}),
|
||||
/logged no \[DB\]\/\[Migration\] startup line within 120ms/
|
||||
);
|
||||
});
|
||||
|
||||
test("electron smoke driver guard: native line, DB evidence and sql.js fallback", () => {
|
||||
assert.doesNotThrow(() =>
|
||||
assertNativeDriverSelected("[DB] Driver: better-sqlite3 | file: /tmp/x/storage.sqlite\n")
|
||||
);
|
||||
assert.doesNotThrow(() =>
|
||||
assertNativeDriverSelected(
|
||||
"[electron] [Server] [DB] Added call_logs.session_tag column\n[electron] [Server] [Migration] Applied: 046_database_settings\n"
|
||||
)
|
||||
);
|
||||
assert.throws(
|
||||
() => assertNativeDriverSelected("[DB] Driver: sql.js | file: /tmp/x/storage.sqlite\n"),
|
||||
/sql\.js \(WASM\) driver/
|
||||
);
|
||||
assert.throws(
|
||||
() => assertNativeDriverSelected("[STARTUP] nothing here\n"),
|
||||
/no database activity/
|
||||
);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user