f31522130f
Build system (5 gaps hardened): - COOKBOOK_OFFLINE defaults to true (fork-mode) - normalize_patch handles diff -ruN format - New 'repo validate-patches' command (25/25 relibc patches) - 14 patched Qt/Wayland/display recipes added to protected list - relibc archive regenerated with current patch chain Boot fixes (fixable): - Full ISO EFI partition: 16 MiB → 1 MiB (matches mini, BIOS hardcoded 2 MiB offset) - D-Bus system bus: absolute /usr/bin/dbus-daemon path (was skipped) - redbear-sessiond: absolute /usr/bin/redbear-sessiond path (was skipped) - daemon framework: silenced spurious INIT_NOTIFY warnings for oneshot_async services (P0-daemon-silence-init-notify.patch) - udev-shim: demoted INIT_NOTIFY warning to INFO (expected for oneshot_async) - relibc: comprehensive named semaphores (sem_open/close/unlink) replacing upstream todo!() stubs - greeterd: Wayland socket timeout 15s → 30s (compositor DRM wait) - greeter-ui: built and linked (header guard unification, sem_compat stubs removed) - mc: un-ignored in both configs, fixed glib/libiconv/pcre2 transitive deps - greeter config: removed stale keymapd dependency from display/greeter services - prefix toolchain: relibc headers synced, _RELIBC_STDLIB_H guard unified Unfixable (diagnosed, upstream): - i2c-hidd: abort on no-I2C-hardware (QEMU) — process::exit → relibc abort - kded6/greeter-ui: page fault 0x8 — Qt library null deref - Thread panics fd != -1 — Rust std library on Redox - DHCP timeout / eth0 MAC — QEMU user-mode networking - hwrngd/thermald — no hardware RNG/thermal in VM - live preload allocation — BIOS memory fragmentation, continues on demand
102 lines
3.7 KiB
JavaScript
102 lines
3.7 KiB
JavaScript
// Copyright (C) 2022 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
|
|
|
import { BatchedTestRunner } from './batchedtestrunner.js'
|
|
import { EmrunAdapter, EmrunCommunication } from './emrunadapter.js'
|
|
import {
|
|
ModuleLoader,
|
|
ResourceFetcher,
|
|
ResourceLocator,
|
|
} from './qwasmjsruntime.js';
|
|
import { parseQuery } from './util.js';
|
|
import { VisualOutputProducer, UI, ScannerFactory } from './qtestoutputreporter.js'
|
|
|
|
const StandardArg = {
|
|
qVisualOutput: 'qvisualoutput',
|
|
qTestName: 'qtestname',
|
|
qBatchedTest: 'qbatchedtest',
|
|
qUseEmrun: 'quseemrun',
|
|
qTestOutputFormat: 'qtestoutputformat',
|
|
}
|
|
|
|
const allArgs = new Set(Object.getOwnPropertyNames(StandardArg).map(arg => StandardArg[arg]));
|
|
Object.defineProperty(StandardArg, 'isKnown', {
|
|
get()
|
|
{
|
|
return name => allArgs.has(name);
|
|
},
|
|
});
|
|
|
|
(() => {
|
|
const setPageTitle = (useEmrun, testName, isBatch) => {
|
|
document.title = 'Qt WASM test runner';
|
|
if (useEmrun || testName || isBatch) {
|
|
document.title += `(${[
|
|
...[useEmrun ? ['emrun'] : []],
|
|
...[testName ? ['test=' + testName] : []],
|
|
...[isBatch ? ['batch'] : []]
|
|
].flat().join(", ")})`;
|
|
}
|
|
}
|
|
|
|
const parsed = parseQuery(location.search);
|
|
|
|
// Get test name from data attribute or query parameter
|
|
const getTestNameFromDataAttribute = () => {
|
|
const scriptTag = document.querySelector('script[data-qtestname]');
|
|
return scriptTag?.dataset?.qtestname;
|
|
};
|
|
|
|
const isBatch = parsed.has(StandardArg.qBatchedTest);
|
|
const testName = parsed.get(StandardArg.qTestName) ??
|
|
(isBatch ? undefined : getTestNameFromDataAttribute());
|
|
const outputInPage = parsed.has(StandardArg.qVisualOutput) ||
|
|
(!parsed.has(StandardArg.qUseEmrun) && testName !== undefined);
|
|
const useEmrun = parsed.has(StandardArg.qUseEmrun);
|
|
const functions = [...parsed.keys()].filter(arg => !StandardArg.isKnown(arg));
|
|
|
|
if (testName === undefined) {
|
|
if (!isBatch)
|
|
throw new Error('The qtestname parameter is required if not running a batch');
|
|
} else if (testName === '') {
|
|
throw new Error(`The qtestname=${testName} parameter is incorrect`);
|
|
}
|
|
|
|
const testOutputFormat = (() => {
|
|
const format = parsed.get(StandardArg.qTestOutputFormat) ?? 'txt';
|
|
if (-1 === ['txt', 'xml', 'lightxml', 'junitxml', 'tap'].indexOf(format))
|
|
throw new Error(`Bad file format: ${format}`);
|
|
return format;
|
|
})();
|
|
|
|
const resourceLocator = new ResourceLocator('');
|
|
|
|
// Get or create container elements
|
|
const testOutputContainer = document.querySelector('#test-output-container') || document.querySelector('body');
|
|
const qtGuiContainer = document.querySelector('#qt-gui-container');
|
|
|
|
const testRunner = new BatchedTestRunner(
|
|
new ModuleLoader(new ResourceFetcher(resourceLocator), resourceLocator),
|
|
qtGuiContainer ? [qtGuiContainer] : undefined
|
|
);
|
|
window.qtTestRunner = testRunner;
|
|
|
|
if (useEmrun) {
|
|
const adapter = new EmrunAdapter(new EmrunCommunication(), testRunner, () => {
|
|
if (!outputInPage)
|
|
window.close();
|
|
});
|
|
adapter.run();
|
|
}
|
|
if (outputInPage) {
|
|
const scanner = ScannerFactory.createScannerForFormat(testOutputFormat);
|
|
const ui = new UI(testOutputContainer, !!scanner);
|
|
const adapter =
|
|
new VisualOutputProducer(ui.outputArea, ui.counters, scanner, testRunner);
|
|
adapter.run();
|
|
}
|
|
setPageTitle(useEmrun, testName, isBatch);
|
|
|
|
testRunner.run(isBatch, testName, functions, testOutputFormat);
|
|
})();
|