@descryy/runtime-test-runner 0.4.11 → 0.4.13
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/dist/bounded-file.d.ts +18 -0
- package/dist/bounded-file.d.ts.map +1 -0
- package/dist/bounded-file.js +77 -0
- package/dist/bounded-file.js.map +1 -0
- package/dist/child-environment.d.ts +12 -0
- package/dist/child-environment.d.ts.map +1 -0
- package/dist/child-environment.js +124 -0
- package/dist/child-environment.js.map +1 -0
- package/dist/coverage-capture.d.ts +23 -0
- package/dist/coverage-capture.d.ts.map +1 -0
- package/dist/coverage-capture.js +165 -0
- package/dist/coverage-capture.js.map +1 -0
- package/dist/executed-coverage.d.ts +45 -0
- package/dist/executed-coverage.d.ts.map +1 -0
- package/dist/executed-coverage.js +143 -0
- package/dist/executed-coverage.js.map +1 -0
- package/dist/go-cover-profile.d.ts +29 -0
- package/dist/go-cover-profile.d.ts.map +1 -0
- package/dist/go-cover-profile.js +162 -0
- package/dist/go-cover-profile.js.map +1 -0
- package/dist/go-test.d.ts +29 -2
- package/dist/go-test.d.ts.map +1 -1
- package/dist/go-test.js +149 -30
- package/dist/go-test.js.map +1 -1
- package/dist/graph-mapping.d.ts +1 -0
- package/dist/graph-mapping.d.ts.map +1 -1
- package/dist/graph-mapping.js +78 -1
- package/dist/graph-mapping.js.map +1 -1
- package/dist/index.d.ts +21 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/lexers/c-family.d.ts +4 -0
- package/dist/lexers/c-family.d.ts.map +1 -0
- package/dist/lexers/c-family.js +221 -0
- package/dist/lexers/c-family.js.map +1 -0
- package/dist/lexers/chars.d.ts +7 -0
- package/dist/lexers/chars.d.ts.map +1 -0
- package/dist/lexers/chars.js +49 -0
- package/dist/lexers/chars.js.map +1 -0
- package/dist/lexers/index.d.ts +7 -0
- package/dist/lexers/index.d.ts.map +1 -0
- package/dist/lexers/index.js +5 -0
- package/dist/lexers/index.js.map +1 -0
- package/dist/lexers/python.d.ts +3 -0
- package/dist/lexers/python.d.ts.map +1 -0
- package/dist/lexers/python.js +101 -0
- package/dist/lexers/python.js.map +1 -0
- package/dist/quality/annotations.d.ts +14 -0
- package/dist/quality/annotations.d.ts.map +1 -0
- package/dist/quality/annotations.js +147 -0
- package/dist/quality/annotations.js.map +1 -0
- package/dist/quality/assertion-kinds.d.ts +18 -0
- package/dist/quality/assertion-kinds.d.ts.map +1 -0
- package/dist/quality/assertion-kinds.js +25 -0
- package/dist/quality/assertion-kinds.js.map +1 -0
- package/dist/quality/chains.d.ts +25 -0
- package/dist/quality/chains.d.ts.map +1 -0
- package/dist/quality/chains.js +129 -0
- package/dist/quality/chains.js.map +1 -0
- package/dist/quality/common.d.ts +31 -0
- package/dist/quality/common.d.ts.map +1 -0
- package/dist/quality/common.js +211 -0
- package/dist/quality/common.js.map +1 -0
- package/dist/quality/csharp-family.d.ts +9 -0
- package/dist/quality/csharp-family.d.ts.map +1 -0
- package/dist/quality/csharp-family.js +560 -0
- package/dist/quality/csharp-family.js.map +1 -0
- package/dist/quality/detect.d.ts +3 -0
- package/dist/quality/detect.d.ts.map +1 -0
- package/dist/quality/detect.js +348 -0
- package/dist/quality/detect.js.map +1 -0
- package/dist/quality/durations.d.ts +4 -0
- package/dist/quality/durations.d.ts.map +1 -0
- package/dist/quality/durations.js +177 -0
- package/dist/quality/durations.js.map +1 -0
- package/dist/quality/expressions.d.ts +7 -0
- package/dist/quality/expressions.d.ts.map +1 -0
- package/dist/quality/expressions.js +123 -0
- package/dist/quality/expressions.js.map +1 -0
- package/dist/quality/facts.d.ts +5 -0
- package/dist/quality/facts.d.ts.map +1 -0
- package/dist/quality/facts.js +183 -0
- package/dist/quality/facts.js.map +1 -0
- package/dist/quality/failure-of.d.ts +4 -0
- package/dist/quality/failure-of.d.ts.map +1 -0
- package/dist/quality/failure-of.js +233 -0
- package/dist/quality/failure-of.js.map +1 -0
- package/dist/quality/frameworks.d.ts +5 -0
- package/dist/quality/frameworks.d.ts.map +1 -0
- package/dist/quality/frameworks.js +20 -0
- package/dist/quality/frameworks.js.map +1 -0
- package/dist/quality/go-family.d.ts +6 -0
- package/dist/quality/go-family.d.ts.map +1 -0
- package/dist/quality/go-family.js +393 -0
- package/dist/quality/go-family.js.map +1 -0
- package/dist/quality/index.d.ts +10 -0
- package/dist/quality/index.d.ts.map +1 -0
- package/dist/quality/index.js +19 -0
- package/dist/quality/index.js.map +1 -0
- package/dist/quality/java-family.d.ts +12 -0
- package/dist/quality/java-family.d.ts.map +1 -0
- package/dist/quality/java-family.js +529 -0
- package/dist/quality/java-family.js.map +1 -0
- package/dist/quality/js-assertions.d.ts +11 -0
- package/dist/quality/js-assertions.d.ts.map +1 -0
- package/dist/quality/js-assertions.js +297 -0
- package/dist/quality/js-assertions.js.map +1 -0
- package/dist/quality/js-family.d.ts +3 -0
- package/dist/quality/js-family.d.ts.map +1 -0
- package/dist/quality/js-family.js +470 -0
- package/dist/quality/js-family.js.map +1 -0
- package/dist/quality/python-family.d.ts +6 -0
- package/dist/quality/python-family.d.ts.map +1 -0
- package/dist/quality/python-family.js +786 -0
- package/dist/quality/python-family.js.map +1 -0
- package/dist/quality/scope.d.ts +26 -0
- package/dist/quality/scope.d.ts.map +1 -0
- package/dist/quality/scope.js +33 -0
- package/dist/quality/scope.js.map +1 -0
- package/dist/quality/selectors.d.ts +14 -0
- package/dist/quality/selectors.d.ts.map +1 -0
- package/dist/quality/selectors.js +137 -0
- package/dist/quality/selectors.js.map +1 -0
- package/dist/quality/statuses.d.ts +7 -0
- package/dist/quality/statuses.d.ts.map +1 -0
- package/dist/quality/statuses.js +143 -0
- package/dist/quality/statuses.js.map +1 -0
- package/dist/quality/stream.d.ts +23 -0
- package/dist/quality/stream.d.ts.map +1 -0
- package/dist/quality/stream.js +194 -0
- package/dist/quality/stream.js.map +1 -0
- package/dist/quality/types.d.ts +88 -0
- package/dist/quality/types.d.ts.map +1 -0
- package/dist/quality/types.js +2 -0
- package/dist/quality/types.js.map +1 -0
- package/dist/run-timeout.d.ts +25 -0
- package/dist/run-timeout.d.ts.map +1 -0
- package/dist/run-timeout.js +52 -0
- package/dist/run-timeout.js.map +1 -0
- package/dist/runner-wrappers.d.ts +74 -0
- package/dist/runner-wrappers.d.ts.map +1 -0
- package/dist/runner-wrappers.js +604 -0
- package/dist/runner-wrappers.js.map +1 -0
- package/dist/swift-xctest.d.ts +15 -2
- package/dist/swift-xctest.d.ts.map +1 -1
- package/dist/swift-xctest.js +143 -20
- package/dist/swift-xctest.js.map +1 -1
- package/dist/test-runner-collector.d.ts +56 -6
- package/dist/test-runner-collector.d.ts.map +1 -1
- package/dist/test-runner-collector.js +265 -113
- package/dist/test-runner-collector.js.map +1 -1
- package/dist/testgen/csharp-facts.d.ts +3 -0
- package/dist/testgen/csharp-facts.d.ts.map +1 -0
- package/dist/testgen/csharp-facts.js +306 -0
- package/dist/testgen/csharp-facts.js.map +1 -0
- package/dist/testgen/csharp-profile.d.ts +14 -0
- package/dist/testgen/csharp-profile.d.ts.map +1 -0
- package/dist/testgen/csharp-profile.js +233 -0
- package/dist/testgen/csharp-profile.js.map +1 -0
- package/dist/testgen/declarations.d.ts +10 -0
- package/dist/testgen/declarations.d.ts.map +1 -0
- package/dist/testgen/declarations.js +110 -0
- package/dist/testgen/declarations.js.map +1 -0
- package/dist/testgen/facts-common.d.ts +33 -0
- package/dist/testgen/facts-common.d.ts.map +1 -0
- package/dist/testgen/facts-common.js +76 -0
- package/dist/testgen/facts-common.js.map +1 -0
- package/dist/testgen/failure.d.ts +4 -0
- package/dist/testgen/failure.d.ts.map +1 -0
- package/dist/testgen/failure.js +106 -0
- package/dist/testgen/failure.js.map +1 -0
- package/dist/testgen/frameworks.d.ts +6 -0
- package/dist/testgen/frameworks.d.ts.map +1 -0
- package/dist/testgen/frameworks.js +516 -0
- package/dist/testgen/frameworks.js.map +1 -0
- package/dist/testgen/go-facts.d.ts +11 -0
- package/dist/testgen/go-facts.d.ts.map +1 -0
- package/dist/testgen/go-facts.js +237 -0
- package/dist/testgen/go-facts.js.map +1 -0
- package/dist/testgen/go-profile.d.ts +6 -0
- package/dist/testgen/go-profile.d.ts.map +1 -0
- package/dist/testgen/go-profile.js +155 -0
- package/dist/testgen/go-profile.js.map +1 -0
- package/dist/testgen/index.d.ts +28 -0
- package/dist/testgen/index.d.ts.map +1 -0
- package/dist/testgen/index.js +21 -0
- package/dist/testgen/index.js.map +1 -0
- package/dist/testgen/java-build.d.ts +13 -0
- package/dist/testgen/java-build.d.ts.map +1 -0
- package/dist/testgen/java-build.js +250 -0
- package/dist/testgen/java-build.js.map +1 -0
- package/dist/testgen/java-facts.d.ts +3 -0
- package/dist/testgen/java-facts.d.ts.map +1 -0
- package/dist/testgen/java-facts.js +349 -0
- package/dist/testgen/java-facts.js.map +1 -0
- package/dist/testgen/java-profile.d.ts +13 -0
- package/dist/testgen/java-profile.d.ts.map +1 -0
- package/dist/testgen/java-profile.js +194 -0
- package/dist/testgen/java-profile.js.map +1 -0
- package/dist/testgen/languages.d.ts +11 -0
- package/dist/testgen/languages.d.ts.map +1 -0
- package/dist/testgen/languages.js +63 -0
- package/dist/testgen/languages.js.map +1 -0
- package/dist/testgen/lexer.d.ts +19 -0
- package/dist/testgen/lexer.d.ts.map +1 -0
- package/dist/testgen/lexer.js +257 -0
- package/dist/testgen/lexer.js.map +1 -0
- package/dist/testgen/mutant-core.d.ts +19 -0
- package/dist/testgen/mutant-core.d.ts.map +1 -0
- package/dist/testgen/mutant-core.js +39 -0
- package/dist/testgen/mutant-core.js.map +1 -0
- package/dist/testgen/mutants-lang.d.ts +6 -0
- package/dist/testgen/mutants-lang.d.ts.map +1 -0
- package/dist/testgen/mutants-lang.js +291 -0
- package/dist/testgen/mutants-lang.js.map +1 -0
- package/dist/testgen/mutants.d.ts +9 -0
- package/dist/testgen/mutants.d.ts.map +1 -0
- package/dist/testgen/mutants.js +148 -0
- package/dist/testgen/mutants.js.map +1 -0
- package/dist/testgen/paths.d.ts +32 -0
- package/dist/testgen/paths.d.ts.map +1 -0
- package/dist/testgen/paths.js +211 -0
- package/dist/testgen/paths.js.map +1 -0
- package/dist/testgen/process.d.ts +19 -0
- package/dist/testgen/process.d.ts.map +1 -0
- package/dist/testgen/process.js +89 -0
- package/dist/testgen/process.js.map +1 -0
- package/dist/testgen/profile-failure.d.ts +7 -0
- package/dist/testgen/profile-failure.d.ts.map +1 -0
- package/dist/testgen/profile-failure.js +29 -0
- package/dist/testgen/profile-failure.js.map +1 -0
- package/dist/testgen/python-facts.d.ts +11 -0
- package/dist/testgen/python-facts.d.ts.map +1 -0
- package/dist/testgen/python-facts.js +380 -0
- package/dist/testgen/python-facts.js.map +1 -0
- package/dist/testgen/python-profile.d.ts +4 -0
- package/dist/testgen/python-profile.d.ts.map +1 -0
- package/dist/testgen/python-profile.js +344 -0
- package/dist/testgen/python-profile.js.map +1 -0
- package/dist/testgen/source-facts.d.ts +30 -0
- package/dist/testgen/source-facts.d.ts.map +1 -0
- package/dist/testgen/source-facts.js +497 -0
- package/dist/testgen/source-facts.js.map +1 -0
- package/dist/testgen/stubs.d.ts +4 -0
- package/dist/testgen/stubs.d.ts.map +1 -0
- package/dist/testgen/stubs.js +66 -0
- package/dist/testgen/stubs.js.map +1 -0
- package/dist/testgen/toolchain.d.ts +23 -0
- package/dist/testgen/toolchain.d.ts.map +1 -0
- package/dist/testgen/toolchain.js +201 -0
- package/dist/testgen/toolchain.js.map +1 -0
- package/dist/testgen/types.d.ts +67 -0
- package/dist/testgen/types.d.ts.map +1 -0
- package/dist/testgen/types.js +2 -0
- package/dist/testgen/types.js.map +1 -0
- package/dist/v8-coverage.d.ts +21 -0
- package/dist/v8-coverage.d.ts.map +1 -0
- package/dist/v8-coverage.js +217 -0
- package/dist/v8-coverage.js.map +1 -0
- package/dist/vitest-reporter.d.ts +46 -13
- package/dist/vitest-reporter.d.ts.map +1 -1
- package/dist/vitest-reporter.js +119 -26
- package/dist/vitest-reporter.js.map +1 -1
- package/dist/vitest-version.d.ts +21 -0
- package/dist/vitest-version.d.ts.map +1 -0
- package/dist/vitest-version.js +98 -0
- package/dist/vitest-version.js.map +1 -0
- package/package.json +14 -8
- package/reporters/junit/classes/DescryJUnitListener.class +0 -0
- package/reporters/junit/classes/META-INF/services/org.junit.platform.launcher.TestExecutionListener +1 -0
- package/reporters/minitest/descry_minitest_reporter.rb +150 -0
- package/reporters/phpunit/DescryPhpUnitExtension.php +209 -0
- package/reporters/pytest/descry_pytest_plugin.py +397 -0
- package/reporters/rspec/descry_rspec_formatter.rb +175 -0
- package/reporters/xunit/bin/Release/netstandard2.0/Descry.TestLogger.deps.json +203 -0
- package/reporters/xunit/bin/Release/netstandard2.0/Descry.TestLogger.dll +0 -0
- package/reporters/xunit/bin/Release/netstandard2.0/Descry.TestLogger.pdb +0 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { mkdtempSync, realpathSync, rmSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
export const MAX_COVERAGE_FILES = 20_000;
|
|
5
|
+
export const MAX_COVERAGE_LINES = 2_000_000;
|
|
6
|
+
export const MAX_COVERAGE_NOTES = 25;
|
|
7
|
+
export const EXCLUDED_DIRECTORY_NAMES = new Set([
|
|
8
|
+
"node_modules",
|
|
9
|
+
"site-packages",
|
|
10
|
+
"dist-packages",
|
|
11
|
+
".venv",
|
|
12
|
+
"venv",
|
|
13
|
+
"vendor",
|
|
14
|
+
"__pycache__",
|
|
15
|
+
".tox",
|
|
16
|
+
".git",
|
|
17
|
+
]);
|
|
18
|
+
export function unavailableCoverage(reason) {
|
|
19
|
+
return { available: false, reason };
|
|
20
|
+
}
|
|
21
|
+
export function resolveRepositoryRoot(directory) {
|
|
22
|
+
const absolute = resolve(directory);
|
|
23
|
+
try {
|
|
24
|
+
return realpathSync(absolute);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return absolute;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function hasExcludedSegment(posixRelativePath) {
|
|
31
|
+
return posixRelativePath.split("/").some((segment) => EXCLUDED_DIRECTORY_NAMES.has(segment));
|
|
32
|
+
}
|
|
33
|
+
export function repositoryRelativePath(repositoryRoot, absolutePath) {
|
|
34
|
+
let resolved = resolve(absolutePath);
|
|
35
|
+
try {
|
|
36
|
+
resolved = realpathSync(resolved);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
resolved = resolve(absolutePath);
|
|
40
|
+
}
|
|
41
|
+
const relation = relative(repositoryRoot, resolved);
|
|
42
|
+
if (relation === "" || isAbsolute(relation) || relation === ".." || relation.startsWith(`..${sep}`))
|
|
43
|
+
return null;
|
|
44
|
+
const posixPath = sep === "/" ? relation : relation.split(sep).join("/");
|
|
45
|
+
return hasExcludedSegment(posixPath) ? null : posixPath;
|
|
46
|
+
}
|
|
47
|
+
export function isRepositoryRelativePosixPath(candidate) {
|
|
48
|
+
if (candidate === "" || candidate.startsWith("/") || candidate.includes("\\") || /^[A-Za-z]:/.test(candidate))
|
|
49
|
+
return false;
|
|
50
|
+
const segments = candidate.split("/");
|
|
51
|
+
return segments.every((segment) => segment !== "" && segment !== "." && segment !== "..") && !hasExcludedSegment(candidate);
|
|
52
|
+
}
|
|
53
|
+
export function createCoverageTempDirectory() {
|
|
54
|
+
return realpathSync(mkdtempSync(join(tmpdir(), "descry-coverage-")));
|
|
55
|
+
}
|
|
56
|
+
export function removeCoverageTempDirectory(directory) {
|
|
57
|
+
try {
|
|
58
|
+
rmSync(directory, { recursive: true, force: true });
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function withCoverageDirectoryAllowed(policy, directory) {
|
|
65
|
+
return { ...policy, allowedRoots: [...policy.allowedRoots, directory] };
|
|
66
|
+
}
|
|
67
|
+
export class NoteLog {
|
|
68
|
+
seen = new Set();
|
|
69
|
+
overflow = 0;
|
|
70
|
+
add(note) {
|
|
71
|
+
if (this.seen.has(note))
|
|
72
|
+
return;
|
|
73
|
+
if (this.seen.size >= MAX_COVERAGE_NOTES) {
|
|
74
|
+
this.overflow += 1;
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
this.seen.add(note);
|
|
78
|
+
}
|
|
79
|
+
toArray() {
|
|
80
|
+
const notes = [...this.seen];
|
|
81
|
+
return this.overflow === 0 ? notes : [...notes, `${this.overflow} further note(s) omitted`];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function isLineNumber(value) {
|
|
85
|
+
return Number.isInteger(value) && value > 0;
|
|
86
|
+
}
|
|
87
|
+
export class CoverageAccumulator {
|
|
88
|
+
files = new Map();
|
|
89
|
+
addFile(path, executedLines, measuredLines) {
|
|
90
|
+
let entry = this.files.get(path);
|
|
91
|
+
if (entry === undefined) {
|
|
92
|
+
entry = { executed: new Set(), measured: measuredLines === null ? null : new Set() };
|
|
93
|
+
this.files.set(path, entry);
|
|
94
|
+
}
|
|
95
|
+
for (const line of executedLines)
|
|
96
|
+
if (isLineNumber(line))
|
|
97
|
+
entry.executed.add(line);
|
|
98
|
+
if (measuredLines === null) {
|
|
99
|
+
entry.measured = null;
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (entry.measured === null)
|
|
103
|
+
return;
|
|
104
|
+
for (const line of measuredLines)
|
|
105
|
+
if (isLineNumber(line))
|
|
106
|
+
entry.measured.add(line);
|
|
107
|
+
}
|
|
108
|
+
paths() {
|
|
109
|
+
return [...this.files.keys()];
|
|
110
|
+
}
|
|
111
|
+
get fileCount() {
|
|
112
|
+
return this.files.size;
|
|
113
|
+
}
|
|
114
|
+
build(tool, notes) {
|
|
115
|
+
const sortedPaths = [...this.files.keys()].sort((left, right) => (left < right ? -1 : left > right ? 1 : 0));
|
|
116
|
+
const files = [];
|
|
117
|
+
let lineTotal = 0;
|
|
118
|
+
let truncated = false;
|
|
119
|
+
const byNumber = (left, right) => left - right;
|
|
120
|
+
for (const path of sortedPaths) {
|
|
121
|
+
const entry = this.files.get(path);
|
|
122
|
+
const measuredSize = entry.measured?.size ?? 0;
|
|
123
|
+
if (entry.executed.size === 0 && measuredSize === 0)
|
|
124
|
+
continue;
|
|
125
|
+
const lineCost = entry.executed.size + measuredSize;
|
|
126
|
+
if (files.length >= MAX_COVERAGE_FILES || lineTotal + lineCost > MAX_COVERAGE_LINES) {
|
|
127
|
+
truncated = true;
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
lineTotal += lineCost;
|
|
131
|
+
files.push({
|
|
132
|
+
path,
|
|
133
|
+
executedLines: [...entry.executed].sort(byNumber),
|
|
134
|
+
measuredLines: entry.measured === null ? null : [...entry.measured].sort(byNumber),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
if (truncated) {
|
|
138
|
+
notes.add(`truncated at ${files.length} of ${sortedPaths.length} files (${lineTotal} line numbers): the result keeps at most ${MAX_COVERAGE_FILES} files and ${MAX_COVERAGE_LINES} line numbers in total, files taken in path order`);
|
|
139
|
+
}
|
|
140
|
+
return { available: true, tool, scope: "run", files, truncated, notes: notes.toArray() };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=executed-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executed-coverage.js","sourceRoot":"","sources":["../src/executed-coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ExecutedCoverage } from "./executed-coverage.ts";
|
|
2
|
+
export interface GoModuleLocation {
|
|
3
|
+
readonly moduleRoot: string;
|
|
4
|
+
readonly modulePath: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function modulePathOfGoMod(goMod: string): string | null;
|
|
7
|
+
export declare function locateGoModule(startDirectory: string): GoModuleLocation | null;
|
|
8
|
+
export declare function hasGoCoverFlag(argumentsAfterTest: readonly string[]): boolean;
|
|
9
|
+
export declare function goWorkingDirectory(tokensBeforeTest: readonly string[], cwd: string): string;
|
|
10
|
+
export interface GoProfileContext {
|
|
11
|
+
readonly module: GoModuleLocation;
|
|
12
|
+
readonly repositoryRoot: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function executedCoverageFromGoProfile(profileText: string, context: GoProfileContext): ExecutedCoverage;
|
|
15
|
+
export interface GoCoverageCapture {
|
|
16
|
+
readonly directory: string;
|
|
17
|
+
readonly flags: readonly string[];
|
|
18
|
+
collect(): ExecutedCoverage;
|
|
19
|
+
dispose(): void;
|
|
20
|
+
}
|
|
21
|
+
export type GoCoverageBegin = {
|
|
22
|
+
readonly ok: true;
|
|
23
|
+
readonly capture: GoCoverageCapture;
|
|
24
|
+
} | {
|
|
25
|
+
readonly ok: false;
|
|
26
|
+
readonly reason: string;
|
|
27
|
+
};
|
|
28
|
+
export declare function beginGoCoverage(tokens: readonly string[], testIndex: number, cwd: string): GoCoverageBegin;
|
|
29
|
+
//# sourceMappingURL=go-cover-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go-cover-profile.d.ts","sourceRoot":"","sources":["../src/go-cover-profile.ts"],"names":[],"mappings":"AAGA,OAAO,EAQL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAOD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ9D;AAED,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAiB9E;AAED,wBAAgB,cAAc,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAI7E;AAED,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ3F;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,CA4D9G;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,OAAO,IAAI,gBAAgB,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3I,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CAsC1G"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { CoverageAccumulator, NoteLog, createCoverageTempDirectory, removeCoverageTempDirectory, repositoryRelativePath, resolveRepositoryRoot, unavailableCoverage, } from "./executed-coverage.js";
|
|
4
|
+
const MAX_BLOCK_LINE_SPAN = 1_000_000;
|
|
5
|
+
const MAX_PROFILE_BYTES = 256 * 1024 * 1024;
|
|
6
|
+
const COVER_FLAG = /^--?(?:test\.)?(?:cover|covermode|coverpkg|coverprofile)(?:=|$)/;
|
|
7
|
+
const PROFILE_LINE = /^(.+):(\d+)\.(\d+),(\d+)\.(\d+) (\d+) (\d+)$/;
|
|
8
|
+
export function modulePathOfGoMod(goMod) {
|
|
9
|
+
for (const rawLine of goMod.split("\n")) {
|
|
10
|
+
const line = rawLine.trim();
|
|
11
|
+
if (line.startsWith("//"))
|
|
12
|
+
continue;
|
|
13
|
+
const match = /^module\s+(?:"([^"]+)"|`([^`]+)`|(\S+))/.exec(line);
|
|
14
|
+
if (match !== null)
|
|
15
|
+
return match[1] ?? match[2] ?? match[3] ?? null;
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
export function locateGoModule(startDirectory) {
|
|
20
|
+
let directory = resolve(startDirectory);
|
|
21
|
+
for (;;) {
|
|
22
|
+
const goModPath = join(directory, "go.mod");
|
|
23
|
+
if (existsSync(goModPath)) {
|
|
24
|
+
try {
|
|
25
|
+
const modulePath = modulePathOfGoMod(readFileSync(goModPath, "utf8"));
|
|
26
|
+
return modulePath === null ? null : { moduleRoot: resolveRepositoryRoot(directory), modulePath };
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (existsSync(join(directory, ".git")))
|
|
33
|
+
return null;
|
|
34
|
+
const parent = dirname(directory);
|
|
35
|
+
if (parent === directory)
|
|
36
|
+
return null;
|
|
37
|
+
directory = parent;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function hasGoCoverFlag(argumentsAfterTest) {
|
|
41
|
+
const programArgumentsStart = argumentsAfterTest.indexOf("-args");
|
|
42
|
+
const flags = programArgumentsStart === -1 ? argumentsAfterTest : argumentsAfterTest.slice(0, programArgumentsStart);
|
|
43
|
+
return flags.some((token) => COVER_FLAG.test(token));
|
|
44
|
+
}
|
|
45
|
+
export function goWorkingDirectory(tokensBeforeTest, cwd) {
|
|
46
|
+
let directory = cwd;
|
|
47
|
+
for (let index = 0; index < tokensBeforeTest.length; index += 1) {
|
|
48
|
+
const token = tokensBeforeTest[index];
|
|
49
|
+
if (token === "-C" && index + 1 < tokensBeforeTest.length)
|
|
50
|
+
directory = resolve(directory, tokensBeforeTest[index + 1]);
|
|
51
|
+
else if (token.startsWith("-C="))
|
|
52
|
+
directory = resolve(directory, token.slice(3));
|
|
53
|
+
}
|
|
54
|
+
return directory;
|
|
55
|
+
}
|
|
56
|
+
export function executedCoverageFromGoProfile(profileText, context) {
|
|
57
|
+
const lines = profileText.split("\n");
|
|
58
|
+
const modeLine = lines[0]?.trim() ?? "";
|
|
59
|
+
if (!/^mode: (?:set|count|atomic)$/.test(modeLine)) {
|
|
60
|
+
return unavailableCoverage("the cover profile does not start with a valid `mode:` line");
|
|
61
|
+
}
|
|
62
|
+
const accumulator = new CoverageAccumulator();
|
|
63
|
+
const notes = new NoteLog();
|
|
64
|
+
const modulePrefix = `${context.module.modulePath}/`;
|
|
65
|
+
const executedByFile = new Map();
|
|
66
|
+
const measuredByFile = new Map();
|
|
67
|
+
let malformed = 0;
|
|
68
|
+
let outsideModule = 0;
|
|
69
|
+
let oversizedBlocks = 0;
|
|
70
|
+
const pathCache = new Map();
|
|
71
|
+
for (const rawLine of lines.slice(1)) {
|
|
72
|
+
const line = rawLine.trim();
|
|
73
|
+
if (line === "")
|
|
74
|
+
continue;
|
|
75
|
+
const match = PROFILE_LINE.exec(line);
|
|
76
|
+
if (match === null) {
|
|
77
|
+
malformed += 1;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const importPathName = match[1];
|
|
81
|
+
const startLine = Number(match[2]);
|
|
82
|
+
const endLine = Number(match[4]);
|
|
83
|
+
const count = Number(match[7]);
|
|
84
|
+
if (endLine < startLine || endLine - startLine > MAX_BLOCK_LINE_SPAN) {
|
|
85
|
+
oversizedBlocks += 1;
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
let path = pathCache.get(importPathName);
|
|
89
|
+
if (path === undefined) {
|
|
90
|
+
path = importPathName.startsWith(modulePrefix)
|
|
91
|
+
? repositoryRelativePath(context.repositoryRoot, join(context.module.moduleRoot, importPathName.slice(modulePrefix.length)))
|
|
92
|
+
: null;
|
|
93
|
+
pathCache.set(importPathName, path);
|
|
94
|
+
}
|
|
95
|
+
if (path === null) {
|
|
96
|
+
outsideModule += 1;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const measured = measuredByFile.get(path) ?? new Set();
|
|
100
|
+
measuredByFile.set(path, measured);
|
|
101
|
+
const executed = executedByFile.get(path) ?? new Set();
|
|
102
|
+
executedByFile.set(path, executed);
|
|
103
|
+
for (let lineNumber = startLine; lineNumber <= endLine; lineNumber += 1) {
|
|
104
|
+
measured.add(lineNumber);
|
|
105
|
+
if (count > 0)
|
|
106
|
+
executed.add(lineNumber);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const [path, measured] of measuredByFile)
|
|
110
|
+
accumulator.addFile(path, executedByFile.get(path) ?? [], measured);
|
|
111
|
+
if (malformed > 0)
|
|
112
|
+
notes.add(`${malformed} cover profile line(s) were not in the documented format and were ignored`);
|
|
113
|
+
if (oversizedBlocks > 0)
|
|
114
|
+
notes.add(`${oversizedBlocks} cover block(s) had an inverted or implausibly large line span and were ignored`);
|
|
115
|
+
if (outsideModule > 0) {
|
|
116
|
+
notes.add(`${outsideModule} cover block(s) belong to files outside the module root, the repository, or an excluded directory and were dropped`);
|
|
117
|
+
}
|
|
118
|
+
return accumulator.build("go-cover", notes);
|
|
119
|
+
}
|
|
120
|
+
export function beginGoCoverage(tokens, testIndex, cwd) {
|
|
121
|
+
if (hasGoCoverFlag(tokens.slice(testIndex + 1))) {
|
|
122
|
+
return { ok: false, reason: "the command already sets a coverage flag (-cover, -covermode, -coverpkg or -coverprofile); it is not altered, so no executed-line coverage is collected" };
|
|
123
|
+
}
|
|
124
|
+
const workingDirectory = goWorkingDirectory(tokens.slice(1, testIndex), cwd);
|
|
125
|
+
const module = locateGoModule(workingDirectory);
|
|
126
|
+
if (module === null) {
|
|
127
|
+
return { ok: false, reason: `no go.mod with a module directive was found from ${workingDirectory} up to the repository root, so cover profile paths cannot be mapped to files` };
|
|
128
|
+
}
|
|
129
|
+
const repositoryRoot = resolveRepositoryRoot(cwd);
|
|
130
|
+
let directory;
|
|
131
|
+
try {
|
|
132
|
+
directory = createCoverageTempDirectory();
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
return { ok: false, reason: `could not create a temporary directory for the cover profile: ${error instanceof Error ? error.message : String(error)}` };
|
|
136
|
+
}
|
|
137
|
+
const profilePath = join(directory, "cover.out");
|
|
138
|
+
return {
|
|
139
|
+
ok: true,
|
|
140
|
+
capture: {
|
|
141
|
+
directory,
|
|
142
|
+
flags: [`-coverprofile=${profilePath}`, "-coverpkg=./..."],
|
|
143
|
+
collect() {
|
|
144
|
+
if (!existsSync(profilePath)) {
|
|
145
|
+
return unavailableCoverage("go test wrote no cover profile: the build failed or the run ended before the profile was written");
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
if (statSync(profilePath).size > MAX_PROFILE_BYTES)
|
|
149
|
+
return unavailableCoverage("the cover profile is larger than 256 MiB and was not read");
|
|
150
|
+
return executedCoverageFromGoProfile(readFileSync(profilePath, "utf8"), { module, repositoryRoot });
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
return unavailableCoverage(`the cover profile could not be read: ${error instanceof Error ? error.message : String(error)}`);
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
dispose() {
|
|
157
|
+
removeCoverageTempDirectory(directory);
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=go-cover-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go-cover-profile.js","sourceRoot":"","sources":["../src/go-cover-profile.ts"],"names":[],"mappings":"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"}
|
package/dist/go-test.d.ts
CHANGED
|
@@ -15,13 +15,17 @@
|
|
|
15
15
|
* `run` arrives while the parent is still open, and the parent's result always
|
|
16
16
|
* arrives last, so parentage is detected by name prefix (`Parent/child`) while
|
|
17
17
|
* streaming, no lookahead needed. A test with children is a container: its own
|
|
18
|
-
* pass
|
|
18
|
+
* pass or skip is suppressed, and so is a failure one of its children already
|
|
19
|
+
* reported; a container that fails while every child passed failed on its own
|
|
20
|
+
* account (a t.Errorf, a cleanup, a panic in the parent body) and is reported.
|
|
19
21
|
*
|
|
20
22
|
* No source location: `go test -json` has no `file`/`line` field, only a
|
|
21
23
|
* possible mention inside captured `Output` text — not scraped (same refusal as
|
|
22
24
|
* `cargo test`'s prose). `sourceLocation` stays null: an honest gap, not a guess.
|
|
23
25
|
*/
|
|
24
|
-
import type
|
|
26
|
+
import { type ProcessExitInfo, type SandboxDisclosures } from "@descryy/runtime-controller";
|
|
27
|
+
import type { Collector, FilesystemPolicy, NetworkPolicy } from "@descryy/runtime-contracts";
|
|
28
|
+
import { type ExecutedCoverage } from "./executed-coverage.ts";
|
|
25
29
|
import { type NodeTestEvent, type TraceCoverage } from "./test-runner-collector.ts";
|
|
26
30
|
/** One line of `go test -json` NDJSON — undocumented as a contract but stable in shape since Go 1.10. */
|
|
27
31
|
export interface GoTestEvent {
|
|
@@ -46,10 +50,33 @@ export interface GoTestCollectorOptions {
|
|
|
46
50
|
readonly cwd: string;
|
|
47
51
|
/** Joins emitted Evidence to a named service; omit for a standalone run with no corresponding service. */
|
|
48
52
|
readonly service?: string;
|
|
53
|
+
readonly timeoutMs?: number;
|
|
54
|
+
readonly filesystemPolicy?: FilesystemPolicy;
|
|
55
|
+
readonly networkPolicy?: NetworkPolicy;
|
|
56
|
+
readonly collectCoverage?: boolean;
|
|
57
|
+
readonly inheritHostEnvironment?: boolean;
|
|
58
|
+
readonly passthroughEnvironmentNames?: readonly string[];
|
|
49
59
|
}
|
|
50
60
|
export interface GoTestCollector extends Collector {
|
|
51
61
|
waitForCompletion(): Promise<void>;
|
|
52
62
|
traceCoverage(): TraceCoverage;
|
|
63
|
+
timedOut(): boolean;
|
|
64
|
+
processExit(): ProcessExitInfo | null;
|
|
65
|
+
outputTail(maxBytes?: number): string | null;
|
|
66
|
+
wrapperDisclosures(): readonly string[];
|
|
67
|
+
degradations(): readonly string[];
|
|
68
|
+
sandboxDisclosures(): SandboxDisclosures;
|
|
69
|
+
executedCoverage(): ExecutedCoverage;
|
|
53
70
|
}
|
|
71
|
+
export type GoCommandParse = {
|
|
72
|
+
readonly ok: true;
|
|
73
|
+
readonly env: Readonly<Record<string, string>>;
|
|
74
|
+
readonly program: string;
|
|
75
|
+
readonly args: readonly string[];
|
|
76
|
+
} | {
|
|
77
|
+
readonly ok: false;
|
|
78
|
+
readonly reason: string;
|
|
79
|
+
};
|
|
80
|
+
export declare function parseGoTestCommand(command: string): GoCommandParse;
|
|
54
81
|
export declare function createGoTestCollector(options: GoTestCollectorOptions): GoTestCollector;
|
|
55
82
|
//# sourceMappingURL=go-test.d.ts.map
|
package/dist/go-test.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"go-test.d.ts","sourceRoot":"","sources":["../src/go-test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"go-test.d.ts","sourceRoot":"","sources":["../src/go-test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAA8E,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACxK,OAAO,KAAK,EAAE,SAAS,EAAiE,gBAAgB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE5J,OAAO,EAAqD,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAGlH,OAAO,EAA2D,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE7I,yGAAyG;AACzG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpG,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI;IAAE,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa,GAAG,IAAI,CAAA;CAAE,CA8EjG;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0GAA0G;IAC1G,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IACvC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,2BAA2B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1D;AAmBD,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,aAAa,IAAI,aAAa,CAAC;IAC/B,QAAQ,IAAI,OAAO,CAAC;IACpB,WAAW,IAAI,eAAe,GAAG,IAAI,CAAC;IACtC,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC7C,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAAC;IACxC,YAAY,IAAI,SAAS,MAAM,EAAE,CAAC;IAClC,kBAAkB,IAAI,kBAAkB,CAAC;IACzC,gBAAgB,IAAI,gBAAgB,CAAC;CACtC;AAID,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACjI;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAclE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAiKtF"}
|