fix: ignore hidden named source operands
This commit is contained in:
@@ -987,6 +987,354 @@ fn cwdwritedata(dir: str, label: str) void = {
|
||||
clean(root);
|
||||
};
|
||||
|
||||
@test fn named_source_prefixes_are_ignored() void = {
|
||||
let root: str = fresh();
|
||||
let source: str = strings.concat(root, "/source");
|
||||
let hiddenparent: str = strings.concat(source, "/.parent");
|
||||
let symlinks: str = strings.concat(source, "/symlinks");
|
||||
let warm: str = strings.concat(source, "/warm");
|
||||
mkdirall(source); mkdirall(hiddenparent); mkdirall(symlinks); mkdirall(warm);
|
||||
|
||||
let maintext: str =
|
||||
"package main;\nfn main() i32 = { return 0; };\n";
|
||||
let testtext: str = strings.concat(
|
||||
"package raw_windows_test;\n",
|
||||
"@test fn selected() void = { assert(true); };\n");
|
||||
let missingmain: str = strings.concat(
|
||||
"package main;\nimport absent.pkg;\n",
|
||||
"fn main() i32 = { return pkg.value(); };\n");
|
||||
let missingtest: str = strings.concat(
|
||||
"package missing_test;\nimport absent.pkg;\n",
|
||||
"@test fn never() void = { abort(); };\n");
|
||||
let malformed: str = "this source must never be opened {\n";
|
||||
let hiddenbuild: str = strings.concat(source, "/_broken_windows_test.ww");
|
||||
let dotbuild: str = strings.concat(source, "/.missing.ww");
|
||||
let hiddentest: str = strings.concat(source,
|
||||
"/_broken_windows_test.ww");
|
||||
let dottest: str = strings.concat(source, "/.missing_test.ww");
|
||||
let visiblewrong: str = strings.concat(source, "/visible_windows.ww");
|
||||
let visiblewrongtest: str = strings.concat(source,
|
||||
"/visible_windows_test.ww");
|
||||
let hiddenparentmain: str = strings.concat(hiddenparent, "/main.ww");
|
||||
let visibletarget: str = strings.concat(symlinks, "/target.ww");
|
||||
let hiddentarget: str = strings.concat(symlinks, "/.target.ww");
|
||||
let hiddenlink: str = strings.concat(symlinks, "/_link.ww");
|
||||
let hiddendevice: str = strings.concat(symlinks, "/_device.ww");
|
||||
let visiblelink: str = strings.concat(symlinks, "/visible-link.ww");
|
||||
let warmvisible: str = strings.concat(warm, "/warm.ww");
|
||||
let warmhidden: str = strings.concat(warm, "/_warm.ww");
|
||||
writefile(hiddenbuild, malformed);
|
||||
writefile(dotbuild, missingmain);
|
||||
writefile(dottest, missingtest);
|
||||
writefile(visiblewrong, maintext);
|
||||
writefile(visiblewrongtest, testtext);
|
||||
writefile(hiddenparentmain, maintext);
|
||||
writefile(visibletarget, maintext);
|
||||
writefile(hiddentarget, maintext);
|
||||
assert(os.symlink(visibletarget, hiddenlink) == 0);
|
||||
assert(os.symlink("/dev/null", hiddendevice) == 0);
|
||||
assert(os.symlink(hiddentarget, visiblelink) == 0);
|
||||
writefile(warmvisible, maintext);
|
||||
|
||||
let stages: []str = ["ww", "ww_ww"];
|
||||
let tags: []str = ["c", "ww"];
|
||||
let rootartifacts: []str = ["/__root.unit.ww", "/__root.wwi",
|
||||
"/__root.s", "/__root.o", "/__root.a",
|
||||
"/__root.init.unit.ww", "/__root.init.s", "/__root.init.o"];
|
||||
let visiblebuildbin: str = "";
|
||||
let visiblebuildartifacts: []str = alloc([], rootartifacts.len: u64)!;
|
||||
let visibletestbin: str = "";
|
||||
let visibletestartifacts: []str = alloc([], rootartifacts.len: u64)!;
|
||||
let visibleteststdout: str = "";
|
||||
let hiddendiagnostics: []str = alloc([], 20u64)!;
|
||||
let si: i32 = 0;
|
||||
for (si < stages.len) {
|
||||
let prefix: str = strings.concat(tags[si], "-");
|
||||
let coldwork: str = strings.concat(root, "/cold-work-", tags[si]);
|
||||
let coldout: str = strings.concat(root, "/cold-output-", tags[si]);
|
||||
let out: commandout;
|
||||
|
||||
// A final requested basename, rather than any parent component, owns
|
||||
// Go's unconditional editor-temporary exclusion.
|
||||
let av: []str = [driver(stages[si]), "build", "-w", coldwork,
|
||||
"-o", coldout, "_broken_windows_test.ww"];
|
||||
runcommanddir(root, strings.concat(prefix, "relative-hidden-build"),
|
||||
source, av, (30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 1);
|
||||
let relativebuilddiag: str =
|
||||
"ww: .: directory contains no WW package sources\n";
|
||||
assert(out.stdout.len == 0 && same(out.stderr, relativebuilddiag)
|
||||
&& !os.exists(coldwork) && !os.exists(coldout)
|
||||
&& !os.exists(strings.concat(coldout, ".sepwork")));
|
||||
append(hiddendiagnostics, strings.dup(out.stderr));
|
||||
|
||||
let dotbuildav: []str = [driver(stages[si]), "build", "-o",
|
||||
strings.concat(root, "/dot-output-", tags[si]), dotbuild];
|
||||
runcommand(root, strings.concat(prefix, "dot-missing-build"), dotbuildav,
|
||||
(30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 1);
|
||||
let sourcediag: str = strings.concat("ww: ", source,
|
||||
": directory contains no WW package sources\n");
|
||||
assert(out.stdout.len == 0 && same(out.stderr, sourcediag)
|
||||
&& !has(out.stderr, "absent.pkg")
|
||||
&& !os.exists(strings.concat(root, "/dot-output-", tags[si]))
|
||||
&& !os.exists(strings.concat(root, "/dot-output-", tags[si],
|
||||
".sepwork")));
|
||||
append(hiddendiagnostics, strings.dup(out.stderr));
|
||||
|
||||
let testcoldwork: str = strings.concat(root, "/cold-test-work-",
|
||||
tags[si]);
|
||||
let testcoldout: str = strings.concat(root, "/cold-test-output-",
|
||||
tags[si]);
|
||||
let hiddentestrunav: []str = [driver(stages[si]), "test", "-w",
|
||||
testcoldwork, "-o",
|
||||
testcoldout, hiddentest];
|
||||
runcommand(root, strings.concat(prefix, "hidden-test-run"),
|
||||
hiddentestrunav,
|
||||
(30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 1);
|
||||
assert(same(out.stdout, "FAIL\n") && same(out.stderr, sourcediag)
|
||||
&& !has(out.stderr, "invalid or missing package clause")
|
||||
&& !os.exists(testcoldwork) && !os.exists(testcoldout)
|
||||
&& !os.exists(strings.concat(testcoldout, ".sepwork")));
|
||||
append(hiddendiagnostics, strings.dup(out.stderr));
|
||||
|
||||
let compiled: str = strings.concat(root, "/hidden-compiled-", tags[si]);
|
||||
let hiddencompileav: []str = [driver(stages[si]), "test", "-c", "-o",
|
||||
compiled,
|
||||
hiddentest];
|
||||
runcommand(root, strings.concat(prefix, "hidden-test-compile"),
|
||||
hiddencompileav,
|
||||
(30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 1);
|
||||
assert(out.stdout.len == 0 && same(out.stderr, sourcediag)
|
||||
&& !os.exists(compiled)
|
||||
&& !os.exists(strings.concat(compiled, ".sepwork")));
|
||||
append(hiddendiagnostics, strings.dup(out.stderr));
|
||||
|
||||
let assembly: str = strings.concat(root, "/hidden-assembly-", tags[si]);
|
||||
let hiddenasmav: []str = [driver(stages[si]), "test", "-S", "-o",
|
||||
assembly,
|
||||
hiddentest];
|
||||
runcommand(root, strings.concat(prefix, "hidden-test-assembly"),
|
||||
hiddenasmav,
|
||||
(30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 1);
|
||||
assert(out.stdout.len == 0 && same(out.stderr, sourcediag)
|
||||
&& !os.exists(assembly)
|
||||
&& !os.exists(strings.concat(assembly, ".sepwork")));
|
||||
append(hiddendiagnostics, strings.dup(out.stderr));
|
||||
|
||||
let dottestav: []str = [driver(stages[si]), "test", dottest];
|
||||
runcommand(root, strings.concat(prefix, "dot-missing-test"), dottestav,
|
||||
(30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 1);
|
||||
assert(same(out.stdout, "FAIL\n") && same(out.stderr, sourcediag)
|
||||
&& !has(out.stderr, "absent.pkg"));
|
||||
append(hiddendiagnostics, strings.dup(out.stderr));
|
||||
|
||||
let visiblework: str = strings.concat(root, "/visible-work-", tags[si]);
|
||||
let visibleout: str = strings.concat(root, "/visible-output-", tags[si]);
|
||||
mkdirall(visiblework);
|
||||
let visiblebuildav: []str = [driver(stages[si]), "build", "-w",
|
||||
visiblework, "-o",
|
||||
visibleout, visiblewrong];
|
||||
runcommand(root, strings.concat(prefix, "visible-wrong-platform-build"),
|
||||
visiblebuildav, (60i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 0);
|
||||
assert(out.stdout.len == 0 && out.stderr.len == 0
|
||||
&& os.exists(visibleout));
|
||||
let runav: []str = [visibleout];
|
||||
runcommand(root, strings.concat(prefix, "visible-wrong-platform-run"),
|
||||
runav, (10i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 0);
|
||||
assert(out.stdout.len == 0 && out.stderr.len == 0);
|
||||
let visiblebytes: str = strings.dup(readfile(visibleout));
|
||||
let ai: i32 = 0;
|
||||
if (si == 0) { visiblebuildbin = strings.dup(visiblebytes); } else {
|
||||
assert(same(visiblebuildbin, visiblebytes));
|
||||
};
|
||||
for (ai < rootartifacts.len) {
|
||||
let bytes: str = strings.dup(readfile(strings.concat(visiblework,
|
||||
rootartifacts[ai])));
|
||||
if (si == 0) { append(visiblebuildartifacts, bytes); }
|
||||
else { assert(same(visiblebuildartifacts[ai], bytes)); };
|
||||
ai += 1;
|
||||
};
|
||||
|
||||
let testwork: str = strings.concat(root, "/visible-test-work-", tags[si]);
|
||||
mkdirall(testwork);
|
||||
let visibletestav: []str = [driver(stages[si]), "test", "-w", testwork,
|
||||
visiblewrongtest];
|
||||
runcommand(root, strings.concat(prefix, "visible-wrong-platform-test"),
|
||||
visibletestav, (60i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 0);
|
||||
assert(out.stderr.len == 0
|
||||
&& occurrences(out.stdout, "selected ... ok\n") == 1
|
||||
&& occurrences(out.stdout,
|
||||
"1 passed, 0 failed, 0 skipped, 0 harness errors\n") == 1);
|
||||
let testbytes: str = strings.dup(readfile(strings.concat(testwork,
|
||||
"/main")));
|
||||
if (si == 0) {
|
||||
visibletestbin = strings.dup(testbytes);
|
||||
visibleteststdout = strings.dup(out.stdout);
|
||||
} else {
|
||||
assert(same(visibletestbin, testbytes)
|
||||
&& same(visibleteststdout, out.stdout));
|
||||
};
|
||||
ai = 0;
|
||||
for (ai < rootartifacts.len) {
|
||||
let bytes: str = strings.dup(readfile(strings.concat(testwork,
|
||||
rootartifacts[ai])));
|
||||
if (si == 0) { append(visibletestartifacts, bytes); }
|
||||
else { assert(same(visibletestartifacts[ai], bytes)); };
|
||||
ai += 1;
|
||||
};
|
||||
|
||||
let parentout: str = strings.concat(root, "/hidden-parent-", tags[si]);
|
||||
let parentwork: str = strings.concat(root, "/hidden-parent-work-",
|
||||
tags[si]);
|
||||
mkdirall(parentwork);
|
||||
let parentav: []str = [driver(stages[si]), "build", "-w", parentwork,
|
||||
"-o", parentout, hiddenparentmain];
|
||||
runcommand(root, strings.concat(prefix, "hidden-parent-visible-base"),
|
||||
parentav, (30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 0);
|
||||
assert(out.stdout.len == 0 && out.stderr.len == 0
|
||||
&& same(visiblebuildbin, readfile(parentout)));
|
||||
|
||||
let hiddenlinkout: str = strings.concat(root, "/hidden-link-", tags[si]);
|
||||
let hiddenlinkav: []str = [driver(stages[si]), "build", "-o",
|
||||
hiddenlinkout, hiddenlink];
|
||||
runcommand(root, strings.concat(prefix, "hidden-request-symlink"),
|
||||
hiddenlinkav,
|
||||
(30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 1);
|
||||
let symlinkdiag: str = strings.concat("ww: ", symlinks,
|
||||
": directory contains no WW package sources\n");
|
||||
assert(out.stdout.len == 0 && same(out.stderr, symlinkdiag)
|
||||
&& !os.exists(hiddenlinkout)
|
||||
&& !os.exists(strings.concat(hiddenlinkout, ".sepwork")));
|
||||
append(hiddendiagnostics, strings.dup(out.stderr));
|
||||
|
||||
let deviceout: str = strings.concat(root, "/hidden-device-", tags[si]);
|
||||
let devicework: str = strings.concat(root, "/hidden-device-work-",
|
||||
tags[si]);
|
||||
let deviceav: []str = [driver(stages[si]), "build", "-w", devicework,
|
||||
"-o", deviceout, hiddendevice];
|
||||
runcommand(root, strings.concat(prefix, "hidden-device-build"), deviceav,
|
||||
(30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 1);
|
||||
assert(out.stdout.len == 0 && same(out.stderr, symlinkdiag)
|
||||
&& !os.exists(devicework) && !os.exists(deviceout)
|
||||
&& !os.exists(strings.concat(deviceout, ".sepwork")));
|
||||
append(hiddendiagnostics, strings.dup(out.stderr));
|
||||
|
||||
let devicetestwork: str = strings.concat(root,
|
||||
"/hidden-device-test-work-", tags[si]);
|
||||
let devicetestout: str = strings.concat(root,
|
||||
"/hidden-device-test-output-", tags[si]);
|
||||
let devicetestav: []str = [driver(stages[si]), "test", "-w",
|
||||
devicetestwork, "-o", devicetestout, hiddendevice, "selected"];
|
||||
runcommand(root, strings.concat(prefix, "hidden-device-test"),
|
||||
devicetestav,
|
||||
(30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 1);
|
||||
assert(same(out.stdout, "FAIL\n") && same(out.stderr, symlinkdiag)
|
||||
&& !os.exists(devicetestwork) && !os.exists(devicetestout)
|
||||
&& !os.exists(strings.concat(devicetestout, ".sepwork")));
|
||||
append(hiddendiagnostics, strings.dup(out.stderr));
|
||||
|
||||
let visiblelinkout: str = strings.concat(root, "/visible-link-", tags[si]);
|
||||
let visiblelinkwork: str = strings.concat(root, "/visible-link-work-",
|
||||
tags[si]);
|
||||
mkdirall(visiblelinkwork);
|
||||
let visiblelinkav: []str = [driver(stages[si]), "build", "-w",
|
||||
visiblelinkwork, "-o", visiblelinkout, visiblelink];
|
||||
runcommand(root, strings.concat(prefix, "visible-request-symlink"),
|
||||
visiblelinkav,
|
||||
(30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 0);
|
||||
assert(out.stdout.len == 0 && out.stderr.len == 0
|
||||
&& same(visiblebuildbin, readfile(visiblelinkout)));
|
||||
|
||||
let warmwork: str = strings.concat(root, "/warm-work-", tags[si]);
|
||||
let warmout: str = strings.concat(root, "/warm-output-", tags[si]);
|
||||
mkdirall(warmwork);
|
||||
let warmvalidav: []str = [driver(stages[si]), "build", "-w",
|
||||
warmwork, "-o",
|
||||
warmout, warmvisible];
|
||||
runcommand(root, strings.concat(prefix, "warm-visible"), warmvalidav,
|
||||
(60i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 0);
|
||||
assert(out.stdout.len == 0 && out.stderr.len == 0
|
||||
&& os.exists(warmout));
|
||||
let warmbin: str = strings.dup(readfile(warmout));
|
||||
let warmsnapshots: []str = alloc([], rootartifacts.len: u64)!;
|
||||
ai = 0;
|
||||
for (ai < rootartifacts.len) {
|
||||
append(warmsnapshots, strings.dup(readfile(strings.concat(warmwork,
|
||||
rootartifacts[ai]))));
|
||||
ai += 1;
|
||||
};
|
||||
assert(os.rename(warmvisible, warmhidden) == 0);
|
||||
let warmhiddenav: []str = [driver(stages[si]), "build", "-w",
|
||||
warmwork, "-o",
|
||||
warmout, warmhidden];
|
||||
runcommand(root, strings.concat(prefix, "warm-hidden"), warmhiddenav,
|
||||
(30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 1);
|
||||
let warmdiag: str = strings.concat("ww: ", warm,
|
||||
": directory contains no WW package sources\n");
|
||||
assert(out.stdout.len == 0 && same(out.stderr, warmdiag)
|
||||
&& same(warmbin, readfile(warmout))
|
||||
&& !os.exists(strings.concat(warmout, ".new"))
|
||||
&& !os.exists(strings.concat(warmout, ".sepwork")));
|
||||
append(hiddendiagnostics, strings.dup(out.stderr));
|
||||
ai = 0;
|
||||
for (ai < rootartifacts.len) {
|
||||
assert(same(warmsnapshots[ai], readfile(strings.concat(warmwork,
|
||||
rootartifacts[ai]))));
|
||||
ai += 1;
|
||||
};
|
||||
assert(!directoryhasnew(warmwork)
|
||||
&& !directoryhasfragment(warmwork, ".wwtxn.")
|
||||
&& !directoryhasfragment(warmwork, ".install")
|
||||
&& !directoryhasfragment(warmwork, ".sepwork"));
|
||||
assert(os.rename(warmhidden, warmvisible) == 0);
|
||||
runcommand(root, strings.concat(prefix, "warm-restored"), warmvalidav,
|
||||
(60i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 0);
|
||||
assert(out.stdout.len == 0 && out.stderr.len == 0
|
||||
&& same(warmbin, readfile(warmout)));
|
||||
ai = 0;
|
||||
for (ai < rootartifacts.len) {
|
||||
assert(same(warmsnapshots[ai], readfile(strings.concat(warmwork,
|
||||
rootartifacts[ai]))));
|
||||
ai += 1;
|
||||
};
|
||||
assert(!directoryhasnew(warmwork)
|
||||
&& !directoryhasfragment(warmwork, ".wwtxn.")
|
||||
&& !directoryhasfragment(warmwork, ".install")
|
||||
&& !directoryhasfragment(warmwork, ".sepwork"));
|
||||
si += 1;
|
||||
};
|
||||
let half: i32 = hiddendiagnostics.len / 2;
|
||||
let di: i32 = 0;
|
||||
for (di < half) {
|
||||
assert(same(hiddendiagnostics[di], hiddendiagnostics[di + half]));
|
||||
di += 1;
|
||||
};
|
||||
assert(!directoryhasnew(root)
|
||||
&& !directoryhasfragment(root, ".wwtxn.")
|
||||
&& !directoryhasfragment(root, ".install")
|
||||
&& !directoryhasfragment(root, ".sepwork")
|
||||
&& !directoryhasfragment(root, ".capture")
|
||||
&& !directoryhasfragment(root, ".result")
|
||||
&& !directoryhasfragment(root, ".request"));
|
||||
clean(root);
|
||||
};
|
||||
|
||||
// A source file has one contiguous import section immediately after its
|
||||
// package clause. The parser may continue after a late import for recovery,
|
||||
// but the imports-only loader and the full compiler parser both reject it.
|
||||
|
||||
Reference in New Issue
Block a user