@frida/injest 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +184 -0
- package/dist/agent/expect.d.ts +56 -0
- package/dist/agent/expect.d.ts.map +1 -0
- package/dist/agent/expect.js +235 -0
- package/dist/agent/expect.js.map +1 -0
- package/dist/agent/runtime.d.ts +29 -0
- package/dist/agent/runtime.d.ts.map +1 -0
- package/dist/agent/runtime.js +180 -0
- package/dist/agent/runtime.js.map +1 -0
- package/dist/host/bundle.d.ts +9 -0
- package/dist/host/bundle.d.ts.map +1 -0
- package/dist/host/bundle.js +95 -0
- package/dist/host/bundle.js.map +1 -0
- package/dist/host/cli.d.ts +3 -0
- package/dist/host/cli.d.ts.map +1 -0
- package/dist/host/cli.js +214 -0
- package/dist/host/cli.js.map +1 -0
- package/dist/host/config.d.ts +27 -0
- package/dist/host/config.d.ts.map +1 -0
- package/dist/host/config.js +35 -0
- package/dist/host/config.js.map +1 -0
- package/dist/host/index.d.ts +4 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +3 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/run.d.ts +50 -0
- package/dist/host/run.d.ts.map +1 -0
- package/dist/host/run.js +270 -0
- package/dist/host/run.js.map +1 -0
- package/dist/host/session.d.ts +13 -0
- package/dist/host/session.d.ts.map +1 -0
- package/dist/host/session.js +55 -0
- package/dist/host/session.js.map +1 -0
- package/dist/host/source.d.ts +14 -0
- package/dist/host/source.d.ts.map +1 -0
- package/dist/host/source.js +83 -0
- package/dist/host/source.js.map +1 -0
- package/package.json +73 -0
- package/schema/injest.config.schema.json +92 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/// <reference types="frida-gum" />
|
|
2
|
+
import { AssertionError } from "./expect.js";
|
|
3
|
+
export { expect } from "./expect.js";
|
|
4
|
+
class SkipSignal {
|
|
5
|
+
reason;
|
|
6
|
+
constructor(reason) {
|
|
7
|
+
this.reason = reason;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function skip(reason) {
|
|
11
|
+
throw new SkipSignal(reason);
|
|
12
|
+
}
|
|
13
|
+
const registry = [];
|
|
14
|
+
const suiteStack = [];
|
|
15
|
+
const rootSuite = { parent: null, beforeEach: [], afterEach: [] };
|
|
16
|
+
let currentSuite = rootSuite;
|
|
17
|
+
function add(name, fn, mode, opts) {
|
|
18
|
+
const qualifiedName = [...suiteStack, name].join(" › ");
|
|
19
|
+
registry.push({
|
|
20
|
+
name: qualifiedName,
|
|
21
|
+
fn,
|
|
22
|
+
mode,
|
|
23
|
+
launch: opts?.launch ?? "shared",
|
|
24
|
+
suite: currentSuite,
|
|
25
|
+
timeout: opts?.timeout,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export function describe(label, fn) {
|
|
29
|
+
suiteStack.push(label);
|
|
30
|
+
const parent = currentSuite;
|
|
31
|
+
currentSuite = { parent, beforeEach: [], afterEach: [] };
|
|
32
|
+
try {
|
|
33
|
+
fn();
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
currentSuite = parent;
|
|
37
|
+
suiteStack.pop();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function beforeEach(fn) {
|
|
41
|
+
currentSuite.beforeEach.push(fn);
|
|
42
|
+
}
|
|
43
|
+
export function afterEach(fn) {
|
|
44
|
+
currentSuite.afterEach.push(fn);
|
|
45
|
+
}
|
|
46
|
+
function hooksFor(suite) {
|
|
47
|
+
const outerToInner = [];
|
|
48
|
+
for (let s = suite; s; s = s.parent)
|
|
49
|
+
outerToInner.unshift(s);
|
|
50
|
+
const innerToOuter = [...outerToInner].reverse();
|
|
51
|
+
return {
|
|
52
|
+
runBefore: outerToInner.flatMap((s) => s.beforeEach),
|
|
53
|
+
runAfter: innerToOuter.flatMap((s) => s.afterEach),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const baseContext = { skip };
|
|
57
|
+
const suspendedContext = { skip, resume };
|
|
58
|
+
export const test = Object.assign((name, fn, opts) => add(name, () => fn(baseContext), "run", opts), {
|
|
59
|
+
skip: (name, fn, opts) => add(name, () => fn(baseContext), "skip", opts),
|
|
60
|
+
isolated: (name, fn, opts) => add(name, () => fn(baseContext), "run", { ...opts, launch: "isolated" }),
|
|
61
|
+
suspended: (name, fn, opts) => add(name, () => fn(suspendedContext), "run", { ...opts, launch: "suspended" }),
|
|
62
|
+
});
|
|
63
|
+
function resume() {
|
|
64
|
+
return new Promise((resolve) => {
|
|
65
|
+
recv("ft:resume-ack", () => resolve());
|
|
66
|
+
send({ ft: "resume" });
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
export async function run(options = {}) {
|
|
70
|
+
const indexed = registry.map((test, testIndex) => ({ test, testIndex }));
|
|
71
|
+
let selected;
|
|
72
|
+
if (options.only) {
|
|
73
|
+
const want = new Set(options.only);
|
|
74
|
+
selected = indexed.filter((e) => want.has(e.testIndex));
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const matches = makeMatcher(options.grep);
|
|
78
|
+
selected = indexed.filter((e) => matches(e.test.name));
|
|
79
|
+
}
|
|
80
|
+
send({
|
|
81
|
+
ft: "plan",
|
|
82
|
+
total: selected.length,
|
|
83
|
+
names: selected.map((e) => e.test.name),
|
|
84
|
+
indices: selected.map((e) => e.testIndex),
|
|
85
|
+
});
|
|
86
|
+
for (let i = 0; i < selected.length; i++) {
|
|
87
|
+
const { test: t, testIndex } = selected[i];
|
|
88
|
+
send({ ft: "start", index: i, testIndex, name: t.name, timeout: t.timeout });
|
|
89
|
+
if (t.mode === "skip") {
|
|
90
|
+
send({
|
|
91
|
+
ft: "result",
|
|
92
|
+
index: i,
|
|
93
|
+
testIndex,
|
|
94
|
+
name: t.name,
|
|
95
|
+
passed: true,
|
|
96
|
+
skipped: true,
|
|
97
|
+
durationMs: 0,
|
|
98
|
+
});
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const { runBefore, runAfter } = hooksFor(t.suite);
|
|
102
|
+
const start = Date.now();
|
|
103
|
+
let failure;
|
|
104
|
+
let skipSignal;
|
|
105
|
+
try {
|
|
106
|
+
for (const hook of runBefore)
|
|
107
|
+
await hook();
|
|
108
|
+
await t.fn();
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
if (e instanceof SkipSignal)
|
|
112
|
+
skipSignal = e;
|
|
113
|
+
else
|
|
114
|
+
failure = e;
|
|
115
|
+
}
|
|
116
|
+
for (const hook of runAfter) {
|
|
117
|
+
try {
|
|
118
|
+
await hook();
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
failure ??= e;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const durationMs = Date.now() - start;
|
|
125
|
+
if (failure !== undefined) {
|
|
126
|
+
send({
|
|
127
|
+
ft: "result",
|
|
128
|
+
index: i,
|
|
129
|
+
testIndex,
|
|
130
|
+
name: t.name,
|
|
131
|
+
passed: false,
|
|
132
|
+
durationMs,
|
|
133
|
+
error: serializeError(failure),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else if (skipSignal) {
|
|
137
|
+
send({
|
|
138
|
+
ft: "result",
|
|
139
|
+
index: i,
|
|
140
|
+
testIndex,
|
|
141
|
+
name: t.name,
|
|
142
|
+
passed: true,
|
|
143
|
+
skipped: true,
|
|
144
|
+
durationMs,
|
|
145
|
+
error: skipSignal.reason ? { name: "Skipped", message: skipSignal.reason } : undefined,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
send({ ft: "result", index: i, testIndex, name: t.name, passed: true, durationMs });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
send({ ft: "done", total: selected.length });
|
|
153
|
+
}
|
|
154
|
+
function makeMatcher(grep) {
|
|
155
|
+
if (!grep)
|
|
156
|
+
return () => true;
|
|
157
|
+
try {
|
|
158
|
+
const re = new RegExp(grep);
|
|
159
|
+
return (name) => re.test(name);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return (name) => name.includes(grep);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function serializeError(e) {
|
|
166
|
+
if (e instanceof AssertionError) {
|
|
167
|
+
return {
|
|
168
|
+
name: e.name,
|
|
169
|
+
message: e.message,
|
|
170
|
+
stack: e.stack,
|
|
171
|
+
expected: e.expected,
|
|
172
|
+
actual: e.actual,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
if (e instanceof Error) {
|
|
176
|
+
return { name: e.name || "Error", message: e.message, stack: e.stack };
|
|
177
|
+
}
|
|
178
|
+
return { name: "Error", message: String(e) };
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/agent/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const DEFAULT_INCLUDE: string[];
|
|
2
|
+
export interface DiscoverOptions {
|
|
3
|
+
include: string[];
|
|
4
|
+
exclude?: string[];
|
|
5
|
+
cwd?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function discoverTests(opts: DiscoverOptions): string[];
|
|
8
|
+
export declare function compileTests(testFiles: string[]): Promise<string>;
|
|
9
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/host/bundle.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,UAA8B,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,EAAE,CAuB7D;AAkCD,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBvE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { mkdirSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join, relative, resolve, sep } from "node:path";
|
|
3
|
+
import * as frida from "frida";
|
|
4
|
+
export const DEFAULT_INCLUDE = ["tests/**/*.test.{ts,js}"];
|
|
5
|
+
export function discoverTests(opts) {
|
|
6
|
+
const root = resolve(opts.cwd ?? process.cwd());
|
|
7
|
+
const included = opts.include.map(globToRegExp);
|
|
8
|
+
const excluded = (opts.exclude ?? []).map(globToRegExp);
|
|
9
|
+
const matched = [];
|
|
10
|
+
const walkDir = (dir) => {
|
|
11
|
+
for (const name of readdirSync(dir)) {
|
|
12
|
+
if (name === "node_modules" || name.startsWith("."))
|
|
13
|
+
continue;
|
|
14
|
+
const fullPath = join(dir, name);
|
|
15
|
+
if (statSync(fullPath).isDirectory()) {
|
|
16
|
+
walkDir(fullPath);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const relativePath = relative(root, fullPath).split(sep).join("/");
|
|
20
|
+
const isTestFile = included.some((re) => re.test(relativePath)) &&
|
|
21
|
+
!excluded.some((re) => re.test(relativePath));
|
|
22
|
+
if (isTestFile)
|
|
23
|
+
matched.push(fullPath);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
walkDir(root);
|
|
27
|
+
return matched.sort();
|
|
28
|
+
}
|
|
29
|
+
const NESTED_DIRS = "(?:[^/]+/)*";
|
|
30
|
+
const ACROSS_SEGMENTS = ".*";
|
|
31
|
+
const WITHIN_SEGMENT = "[^/]*";
|
|
32
|
+
const ONE_NON_SLASH = "[^/]";
|
|
33
|
+
const GLOB_TOKEN = /\*\*\/|\*\*|\*|\?|\{[^}]*\}|[^*?{]+|\{/g;
|
|
34
|
+
function globToRegExp(glob) {
|
|
35
|
+
const normalized = glob.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
36
|
+
const source = normalized.replace(GLOB_TOKEN, (token) => {
|
|
37
|
+
switch (token) {
|
|
38
|
+
case "**/":
|
|
39
|
+
return NESTED_DIRS;
|
|
40
|
+
case "**":
|
|
41
|
+
return ACROSS_SEGMENTS;
|
|
42
|
+
case "*":
|
|
43
|
+
return WITHIN_SEGMENT;
|
|
44
|
+
case "?":
|
|
45
|
+
return ONE_NON_SLASH;
|
|
46
|
+
}
|
|
47
|
+
if (token.length > 1 && token.startsWith("{") && token.endsWith("}")) {
|
|
48
|
+
const alternatives = token.slice(1, -1).split(",").map(escapeRegExp);
|
|
49
|
+
return `(?:${alternatives.join("|")})`;
|
|
50
|
+
}
|
|
51
|
+
return escapeRegExp(token);
|
|
52
|
+
});
|
|
53
|
+
return new RegExp(`^${source}$`);
|
|
54
|
+
}
|
|
55
|
+
function escapeRegExp(literal) {
|
|
56
|
+
return literal.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
57
|
+
}
|
|
58
|
+
export async function compileTests(testFiles) {
|
|
59
|
+
const buildDir = resolve(`.injest-${process.pid}-${Date.now()}`);
|
|
60
|
+
mkdirSync(buildDir, { recursive: true });
|
|
61
|
+
const entry = join(buildDir, "entry.ts");
|
|
62
|
+
writeFileSync(entry, entrySource(testFiles, buildDir));
|
|
63
|
+
const compiler = new frida.Compiler();
|
|
64
|
+
compiler.diagnostics.connect((diagnostics) => {
|
|
65
|
+
for (const d of diagnostics) {
|
|
66
|
+
const where = d.file ? ` ${d.file.path}:${d.file.line}:${d.file.character}` : "";
|
|
67
|
+
console.error(`[injest] ${d.category}${where}: ${d.text}`);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
try {
|
|
71
|
+
return await compiler.build(entry, {
|
|
72
|
+
projectRoot: process.cwd(),
|
|
73
|
+
sourceMaps: frida.SourceMaps.Included,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
rmSync(buildDir, { recursive: true, force: true });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function entrySource(testFiles, entryDir) {
|
|
81
|
+
const imports = testFiles.map((f) => {
|
|
82
|
+
let rel = relative(entryDir, f).replace(/\\/g, "/");
|
|
83
|
+
if (!rel.startsWith("."))
|
|
84
|
+
rel = "./" + rel;
|
|
85
|
+
return `import ${JSON.stringify(rel)};`;
|
|
86
|
+
});
|
|
87
|
+
return [
|
|
88
|
+
'/// <reference types="frida-gum" />',
|
|
89
|
+
'import { run } from "@frida/injest/agent";',
|
|
90
|
+
...imports,
|
|
91
|
+
"rpc.exports = { run };",
|
|
92
|
+
"",
|
|
93
|
+
].join("\n");
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/host/bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/host/cli.ts"],"names":[],"mappings":""}
|
package/dist/host/cli.js
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
import { compileTests, discoverTests, DEFAULT_INCLUDE } from "./bundle.js";
|
|
4
|
+
import { loadConfig, resolveTarget, } from "./config.js";
|
|
5
|
+
import { reportResult, runSuite, summarize, toProjectRelative, } from "./run.js";
|
|
6
|
+
import { getDevice, openSession, runtimeOption } from "./session.js";
|
|
7
|
+
import { discoverTestInfo, matchTestName } from "./source.js";
|
|
8
|
+
const DEFAULT_TIMEOUT_MS = 10000;
|
|
9
|
+
const EXIT_TEST_FAILURE = 1;
|
|
10
|
+
const EXIT_HARNESS_FAILURE = 2;
|
|
11
|
+
function metaByIndex(tests) {
|
|
12
|
+
return new Map(tests.map((t) => [
|
|
13
|
+
t.index,
|
|
14
|
+
{ id: t.id, name: t.name, file: toProjectRelative(t.file), line: t.line },
|
|
15
|
+
]));
|
|
16
|
+
}
|
|
17
|
+
function tryLoadConfig(path, required) {
|
|
18
|
+
try {
|
|
19
|
+
return loadConfig(path);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
if (required)
|
|
23
|
+
throw err;
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function discoveryGlobs(config) {
|
|
28
|
+
return {
|
|
29
|
+
include: config?.include?.length ? config.include : DEFAULT_INCLUDE,
|
|
30
|
+
exclude: config?.exclude ?? [],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function printHelp() {
|
|
34
|
+
console.log(`injest — run tests inside a Frida GumJS target
|
|
35
|
+
|
|
36
|
+
Usage:
|
|
37
|
+
injest [file-filters...] [options]
|
|
38
|
+
|
|
39
|
+
Test files match the "include" globs in injest.config.json
|
|
40
|
+
(default: tests/**/*.test.{ts,js}). Positional args filter those by path substring.
|
|
41
|
+
|
|
42
|
+
Options:
|
|
43
|
+
--target <name> target profile from injest.config.json (else "default")
|
|
44
|
+
-c, --config <path> config file (default: ./injest.config.json)
|
|
45
|
+
-t, --testNamePattern <re> run only tests whose name matches the regex
|
|
46
|
+
--only <id> run only the test(s) with this stable id (repeatable)
|
|
47
|
+
--reporter <pretty|json> output format; json emits NDJSON on stdout (default: pretty)
|
|
48
|
+
--list list discovered tests (id, location) without running
|
|
49
|
+
-h, --help show this help
|
|
50
|
+
|
|
51
|
+
In code:
|
|
52
|
+
test(name, fn, { timeout }) test.skip(name, fn) describe(label, fn)
|
|
53
|
+
beforeEach(fn) / afterEach(fn) run around each test in the enclosing describe
|
|
54
|
+
test.isolated(name, fn) own fresh process, killed after (spawn targets)
|
|
55
|
+
test.suspended(name, async ({ resume }) => …) spawn suspended; resume() releases it
|
|
56
|
+
|
|
57
|
+
Examples:
|
|
58
|
+
injest --target local run all tests on the local system session
|
|
59
|
+
injest foo -t bar files matching "foo", tests matching /bar/
|
|
60
|
+
injest --target <name> run against a configured target
|
|
61
|
+
injest --list list tests without running
|
|
62
|
+
injest --reporter json > results.ndjson
|
|
63
|
+
|
|
64
|
+
Runtime (qjs|v8) and per-test timeout (ms, default 10000) are set per target in
|
|
65
|
+
injest.config.json.`);
|
|
66
|
+
}
|
|
67
|
+
function describeSession(session) {
|
|
68
|
+
return session === "system" ? "system" : `spawn(${session.spawn})`;
|
|
69
|
+
}
|
|
70
|
+
async function main() {
|
|
71
|
+
const { values, positionals } = parseArgs({
|
|
72
|
+
allowPositionals: true,
|
|
73
|
+
options: {
|
|
74
|
+
target: { type: "string" },
|
|
75
|
+
config: { type: "string", short: "c" },
|
|
76
|
+
testNamePattern: { type: "string", short: "t" },
|
|
77
|
+
only: { type: "string", multiple: true },
|
|
78
|
+
reporter: { type: "string" },
|
|
79
|
+
list: { type: "boolean" },
|
|
80
|
+
help: { type: "boolean", short: "h" },
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
if (values.help) {
|
|
84
|
+
printHelp();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const reporter = values.reporter === "json" ? "json" : "pretty";
|
|
88
|
+
const configRequired = !values.list;
|
|
89
|
+
const config = tryLoadConfig(values.config, configRequired);
|
|
90
|
+
const { include, exclude } = discoveryGlobs(config);
|
|
91
|
+
let files = discoverTests({ include, exclude });
|
|
92
|
+
if (positionals.length > 0) {
|
|
93
|
+
files = files.filter((f) => positionals.some((p) => f.includes(p)));
|
|
94
|
+
}
|
|
95
|
+
if (files.length === 0) {
|
|
96
|
+
const where = positionals.length ? ` matching ${positionals.join(", ")}` : "";
|
|
97
|
+
throw new Error(`no test files found${where} (include: ${include.join(", ")})`);
|
|
98
|
+
}
|
|
99
|
+
const matches = matchTestName(values.testNamePattern);
|
|
100
|
+
let tests = discoverTestInfo(files).filter((t) => matches(t.name));
|
|
101
|
+
if (values.only) {
|
|
102
|
+
const want = new Set(values.only);
|
|
103
|
+
tests = tests.filter((t) => want.has(t.id));
|
|
104
|
+
}
|
|
105
|
+
if (values.list) {
|
|
106
|
+
printList(tests, reporter);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const { name, target } = resolveTarget(config, values.target);
|
|
110
|
+
console.error(`[injest] running ${files.length} test file(s)`);
|
|
111
|
+
const source = await compileTests(files);
|
|
112
|
+
const deviceLabel = typeof target.device === "object" ? `id(${target.device.id})` : target.device;
|
|
113
|
+
console.error(`[injest] target "${name}" -> device=${deviceLabel} session=${describeSession(target.session)}`);
|
|
114
|
+
const device = await getDevice(target);
|
|
115
|
+
const runtime = target.runtime ?? "qjs";
|
|
116
|
+
const timeoutMs = target.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
117
|
+
const failed = await runOnce(device, target, source, runtime, { timeoutMs, reporter, tests });
|
|
118
|
+
if (failed > 0)
|
|
119
|
+
process.exitCode = EXIT_TEST_FAILURE;
|
|
120
|
+
}
|
|
121
|
+
async function runOnce(device, target, source, runtime, opts) {
|
|
122
|
+
const reporter = opts.reporter;
|
|
123
|
+
const spawnable = typeof target.session === "object" && "spawn" in target.session;
|
|
124
|
+
const primary = await openSession(device, target);
|
|
125
|
+
let primaryScript;
|
|
126
|
+
try {
|
|
127
|
+
primaryScript = await primary.session.createScript(source, {
|
|
128
|
+
runtime: runtimeOption(runtime),
|
|
129
|
+
});
|
|
130
|
+
await primaryScript.load();
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
await closeCapped(primary);
|
|
134
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
135
|
+
console.error(`[injest] runtime ${runtime} unavailable on this target: ${msg}`);
|
|
136
|
+
return 0; // a runtime the target lacks is a skip, not a failure
|
|
137
|
+
}
|
|
138
|
+
console.error(`[injest] runtime=${runtime}`);
|
|
139
|
+
const all = opts.tests;
|
|
140
|
+
const isolated = all.filter((t) => (t.launch === "isolated" || t.launch === "suspended") && t.mode !== "skip");
|
|
141
|
+
const isolatedIndices = new Set(isolated.map((t) => t.index));
|
|
142
|
+
const sharedIndices = all.filter((t) => !isolatedIndices.has(t.index)).map((t) => t.index);
|
|
143
|
+
if (reporter === "json") {
|
|
144
|
+
process.stdout.write(JSON.stringify({ type: "start", total: all.length }) + "\n");
|
|
145
|
+
}
|
|
146
|
+
const subOpts = {
|
|
147
|
+
timeoutMs: opts.timeoutMs,
|
|
148
|
+
reporter,
|
|
149
|
+
metaByIndex: metaByIndex(all),
|
|
150
|
+
};
|
|
151
|
+
const results = [];
|
|
152
|
+
if (spawnable)
|
|
153
|
+
await primary.resume();
|
|
154
|
+
results.push(...(await runSuite(primaryScript, primary.session, {
|
|
155
|
+
...subOpts,
|
|
156
|
+
only: sharedIndices,
|
|
157
|
+
onResume: primary.resume,
|
|
158
|
+
})));
|
|
159
|
+
await closeCapped(primary);
|
|
160
|
+
for (const t of isolated) {
|
|
161
|
+
if (!spawnable) {
|
|
162
|
+
const r = {
|
|
163
|
+
index: results.length,
|
|
164
|
+
id: t.id,
|
|
165
|
+
name: t.name,
|
|
166
|
+
durationMs: 0,
|
|
167
|
+
status: "skipped",
|
|
168
|
+
file: toProjectRelative(t.file),
|
|
169
|
+
line: t.line,
|
|
170
|
+
error: { name: "Skipped", message: `requires a spawnable target (launch: ${t.launch})` },
|
|
171
|
+
};
|
|
172
|
+
reportResult(r, reporter ?? "pretty");
|
|
173
|
+
results.push(r);
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
const iso = await openSession(device, target);
|
|
177
|
+
const script = await iso.session.createScript(source, { runtime: runtimeOption(runtime) });
|
|
178
|
+
await script.load();
|
|
179
|
+
// isolated resumes now; suspended stays gated and resumes itself mid-test via ctx.resume()
|
|
180
|
+
if (t.launch === "isolated")
|
|
181
|
+
await iso.resume();
|
|
182
|
+
results.push(...(await runSuite(script, iso.session, {
|
|
183
|
+
...subOpts,
|
|
184
|
+
only: [t.index],
|
|
185
|
+
onResume: iso.resume,
|
|
186
|
+
})));
|
|
187
|
+
await closeCapped(iso);
|
|
188
|
+
}
|
|
189
|
+
const { failed } = summarize(results, reporter ?? "pretty");
|
|
190
|
+
return failed;
|
|
191
|
+
}
|
|
192
|
+
/** Best-effort teardown, capped: a wedged session can make close() block forever. */
|
|
193
|
+
async function closeCapped(opened) {
|
|
194
|
+
await Promise.race([opened.close().catch(() => { }), new Promise((r) => setTimeout(r, 500))]);
|
|
195
|
+
}
|
|
196
|
+
function printList(tests, reporter) {
|
|
197
|
+
const located = tests.map((t) => ({ ...t, file: toProjectRelative(t.file) }));
|
|
198
|
+
if (reporter === "json") {
|
|
199
|
+
process.stdout.write(JSON.stringify({ type: "list", tests: located }) + "\n");
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
for (const t of located) {
|
|
203
|
+
const loc = t.file ? ` (${t.file}:${t.line ?? "?"})` : "";
|
|
204
|
+
const tags = (t.mode === "run" ? "" : ` [${t.mode}]`) + (t.launch === "shared" ? "" : ` [${t.launch}]`);
|
|
205
|
+
console.log(` ${t.id}${loc}${tags}`);
|
|
206
|
+
}
|
|
207
|
+
console.log(`\n${tests.length} test(s)`);
|
|
208
|
+
}
|
|
209
|
+
main().then(() => process.exit(process.exitCode ?? 0), (err) => {
|
|
210
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
211
|
+
console.error("[injest] error:", message);
|
|
212
|
+
process.exit(EXIT_HARNESS_FAILURE);
|
|
213
|
+
});
|
|
214
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/host/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type Runtime = "qjs" | "v8";
|
|
2
|
+
export type SessionSpec = "system" | {
|
|
3
|
+
spawn: string;
|
|
4
|
+
args?: string[];
|
|
5
|
+
};
|
|
6
|
+
export type DeviceSpec = "local" | "usb" | {
|
|
7
|
+
id: string;
|
|
8
|
+
};
|
|
9
|
+
export interface TargetConfig {
|
|
10
|
+
device: DeviceSpec;
|
|
11
|
+
session: SessionSpec;
|
|
12
|
+
runtime?: Runtime;
|
|
13
|
+
timeout?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface Config {
|
|
16
|
+
default?: string;
|
|
17
|
+
targets: Record<string, TargetConfig>;
|
|
18
|
+
include?: string[];
|
|
19
|
+
exclude?: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare function validateConfig(value: unknown, file?: string): Config;
|
|
22
|
+
export declare function loadConfig(path?: string): Config;
|
|
23
|
+
export declare function resolveTarget(config: Config, name?: string): {
|
|
24
|
+
name: string;
|
|
25
|
+
target: TargetConfig;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/host/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC;AAEnC,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAOD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,SAAuB,GAAG,MAAM,CAIlF;AAED,wBAAgB,UAAU,CAAC,IAAI,SAAuB,GAAG,MAAM,CAS9D;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAWxC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { Ajv } from "ajv";
|
|
4
|
+
const schema = JSON.parse(readFileSync(new URL("../../schema/injest.config.schema.json", import.meta.url), "utf8"));
|
|
5
|
+
const validate = new Ajv({ allErrors: true }).compile(schema);
|
|
6
|
+
export function validateConfig(value, file = "injest.config.json") {
|
|
7
|
+
if (validate(value))
|
|
8
|
+
return value;
|
|
9
|
+
const issues = (validate.errors ?? []).map((e) => `${e.instancePath || "(root)"} ${e.message}`);
|
|
10
|
+
throw new Error(`invalid config in ${file}:\n - ${issues.join("\n - ")}`);
|
|
11
|
+
}
|
|
12
|
+
export function loadConfig(path = "injest.config.json") {
|
|
13
|
+
const file = resolve(process.cwd(), path);
|
|
14
|
+
let raw;
|
|
15
|
+
try {
|
|
16
|
+
raw = readFileSync(file, "utf8");
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new Error(`config not found: ${file}`);
|
|
20
|
+
}
|
|
21
|
+
return validateConfig(JSON.parse(raw), file);
|
|
22
|
+
}
|
|
23
|
+
export function resolveTarget(config, name) {
|
|
24
|
+
const chosen = name ?? config.default;
|
|
25
|
+
if (!chosen) {
|
|
26
|
+
throw new Error('no --target given and no "default" in config');
|
|
27
|
+
}
|
|
28
|
+
const target = config.targets[chosen];
|
|
29
|
+
if (!target) {
|
|
30
|
+
const available = Object.keys(config.targets).join(", ");
|
|
31
|
+
throw new Error(`unknown target "${chosen}". available: ${available}`);
|
|
32
|
+
}
|
|
33
|
+
return { name: chosen, target };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/host/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAsB1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,YAAY,CAAC,IAAI,GAAG,CAAC,wCAAwC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CACzF,CAAC;AACF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAS,MAAM,CAAC,CAAC;AAEtE,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,IAAI,GAAG,oBAAoB;IACxE,IAAI,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,YAAY,IAAI,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAChG,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,UAAU,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAI,GAAG,oBAAoB;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,IAAa;IAEb,MAAM,MAAM,GAAG,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,iBAAiB,SAAS,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|