test: cover package and runtime library roots

This commit is contained in:
2026-08-12 15:18:51 +09:00
parent 5a2e4ba28d
commit 470aacef95
2 changed files with 426 additions and 35 deletions

View File

@@ -2190,26 +2190,45 @@ fn workescape(s: str) str = {
@test fn exact_package_tool_argv_stage_parity() void = {
let root: str = fresh();
let source: str = strings.concat(root, "/source tree");
let leaf: str = strings.concat(source, "/leaf");
let dep: str = strings.concat(source, "/dep");
let target: str = strings.concat(source, "/target");
let runtime: str = strings.concat(root, "/runtime library");
let leaf: str = strings.concat(source, "/ww_root_parity_leaf_7f3");
let dep: str = strings.concat(source, "/ww_root_parity_dep_7f3");
let target: str = strings.concat(source, "/ww_root_parity_target_7f3");
let tools: str = strings.concat(root, "/tool wrappers");
assert(os.mkdir(source, 448i32) == 0);
assert(os.mkdir(runtime, 448i32) == 0);
let copyav: []str = ["/bin/cp", "-R", strings.concat(repo(), "/lib/."),
source];
let copyout: commandout;
runcommand(root, "copy-source-library", copyav,
(30i64 * (time.second: i64)): time.duration, &copyout);
expectexit(&copyout, 0);
assert(copyout.stderr.len == 0);
let support: str = strings.concat(source, "/test/run.ww");
let supportbody: str = readfile(support);
assert(os.remove(support) == 0);
writefile(support, strings.concat("// WW_SRCLIB fixture marker\n",
supportbody));
writefile(strings.concat(runtime, "/libwwrt.a"),
readfile(strings.concat(repo(), "/out/lib/libwwrt.a")));
assert(os.mkdir(leaf, 448i32) == 0);
assert(os.mkdir(dep, 448i32) == 0);
assert(os.mkdir(target, 448i32) == 0);
assert(os.mkdir(tools, 448i32) == 0);
writefile(strings.concat(leaf, "/leaf.ww"), strings.concat(
"package leaf;\n",
"package ww_root_parity_leaf_7f3;\n",
"export fn value() i32 = { return 40; };\n"));
writefile(strings.concat(dep, "/dep.ww"), strings.concat(
"package dep;\nimport leaf;\n",
"export fn value() i32 = { return leaf.value() + 2; };\n"));
"package ww_root_parity_dep_7f3;\n",
"import ww_root_parity_leaf_7f3;\n",
"export fn value() i32 = { return ",
"ww_root_parity_leaf_7f3.value() + 2; };\n"));
writefile(strings.concat(target, "/target.ww"), strings.concat(
"package target;\nimport dep;\n",
"fn value() i32 = { return dep.value(); };\n"));
"package ww_root_parity_target_7f3;\n",
"import ww_root_parity_dep_7f3;\n",
"fn value() i32 = { return ww_root_parity_dep_7f3.value(); };\n"));
writefile(strings.concat(target, "/target_test.ww"), strings.concat(
"package target;\n",
"package ww_root_parity_target_7f3;\n",
"@test fn exact_argv() void = { assert(value() == 42); };\n"));
let compilerwrapper: str = strings.concat(tools, "/w6c wrapper.sh");
@@ -2278,10 +2297,12 @@ fn workescape(s: str) str = {
writefile(assemblertrace, "");
writefile(linkertrace, "");
writefile(failuretrace, "");
let env: []str = alloc([], (baseenv.len + 9): u64)!;
let env: []str = alloc([], (baseenv.len + 11): u64)!;
let ei: i32 = 0;
for (ei < baseenv.len) {
if (!strings.hasprefix(baseenv[ei], "WW_W6C=")
if (!strings.hasprefix(baseenv[ei], "WW_SRCLIB=")
&& !strings.hasprefix(baseenv[ei], "WW_LIB=")
&& !strings.hasprefix(baseenv[ei], "WW_W6C=")
&& !strings.hasprefix(baseenv[ei], "WW_W6A=")
&& !strings.hasprefix(baseenv[ei], "WW_W6L=")
&& !strings.hasprefix(baseenv[ei],
@@ -2300,6 +2321,8 @@ fn workescape(s: str) str = {
};
ei += 1;
};
append(env, strings.concat("WW_SRCLIB=", source));
append(env, strings.concat("WW_LIB=", runtime));
append(env, strings.concat("WW_W6C=", compilerwrapper));
append(env, strings.concat("WW_W6A=", assemblerwrapper));
append(env, strings.concat("WW_W6L=", linkerwrapper));
@@ -2314,7 +2337,7 @@ fn workescape(s: str) str = {
driver(linkers[si])));
let av: []str = [driver(stages[si]), "test", "-c", "-o", bin,
"-I", source, target];
target];
let out: commandout;
runcommandenv(root, strings.concat("exact-argv-", tags[si]), av, env,
(120i64 * (time.second: i64)): time.duration, &out);
@@ -2322,14 +2345,21 @@ fn workescape(s: str) str = {
assert(out.stderr.len == 0);
let rootunit: str = readfile(strings.concat(work,
"__ww-test-000-same.unit.ww"));
let depunit: str = readfile(strings.concat(work, "dep.unit.ww"));
assert(has(rootunit, "//ww:module dep\n"));
assert(!has(rootunit, "//ww:module leaf\n"));
assert(has(depunit, "//ww:module leaf\n"));
assert(os.exists(strings.concat(work, "leaf.wwi")));
assert(os.exists(strings.concat(work, "leaf.a")));
assert(os.exists(strings.concat(work, "dep.wwi")));
assert(os.exists(strings.concat(work, "dep.a")));
let depunit: str = readfile(strings.concat(work,
"ww_root_parity_dep_7f3.unit.ww"));
assert(has(rootunit, "//ww:module ww_root_parity_dep_7f3\n"));
assert(!has(rootunit, "//ww:module ww_root_parity_leaf_7f3\n"));
assert(has(depunit, "//ww:module ww_root_parity_leaf_7f3\n"));
assert(os.exists(strings.concat(work,
"ww_root_parity_leaf_7f3.wwi")));
assert(os.exists(strings.concat(work,
"ww_root_parity_leaf_7f3.a")));
assert(os.exists(strings.concat(work,
"ww_root_parity_dep_7f3.wwi")));
assert(os.exists(strings.concat(work,
"ww_root_parity_dep_7f3.a")));
assert(has(readfile(strings.concat(work, "test.unit.ww")),
"// WW_SRCLIB fixture marker\n"));
assert(!os.exists(strings.concat(work,
"__ww-test-000-same.wwi")));
assert(!os.exists(strings.concat(work,
@@ -2340,30 +2370,41 @@ fn workescape(s: str) str = {
let atrace: str = readfile(assemblertrace);
let ltrace: str = readfile(linkertrace);
assert(occurrences(ctrace, strings.concat("<", work,
"leaf.unit.ww>")) == 1);
"ww_root_parity_leaf_7f3.unit.ww>")) == 1);
assert(occurrences(ctrace, strings.concat("<", work,
"dep.unit.ww>")) == 1);
"ww_root_parity_dep_7f3.unit.ww>")) == 1);
assert(occurrences(ctrace, strings.concat("<", work,
"__ww-test-000-same.unit.ww>")) == 1);
assert(pos(ctrace, strings.concat("<", work, "leaf.unit.ww>"))
< pos(ctrace, strings.concat("<", work, "dep.unit.ww>")));
assert(pos(ctrace, strings.concat("<", work, "dep.unit.ww>"))
assert(pos(ctrace, strings.concat("<", work,
"ww_root_parity_leaf_7f3.unit.ww>"))
< pos(ctrace, strings.concat("<", work,
"ww_root_parity_dep_7f3.unit.ww>")));
assert(pos(ctrace, strings.concat("<", work,
"ww_root_parity_dep_7f3.unit.ww>"))
< pos(ctrace, strings.concat("<", work,
"__ww-test-000-same.unit.ww>")));
assert(has(ctrace, strings.concat("BEGIN<-c><-I><", work,
"dep.wwi><-o><", work, "dep.s><", work, "dep.unit.ww>")));
"ww_root_parity_dep_7f3.wwi><-o><", work,
"ww_root_parity_dep_7f3.s><", work,
"ww_root_parity_dep_7f3.unit.ww>")));
assert(has(ctrace, strings.concat(
"BEGIN<-T><--test-support-module><test><-c><-o><", work,
"__ww-test-000-same.s><", work,
"__ww-test-000-same.unit.ww>")));
assert(has(atrace, strings.concat("BEGIN<-o><", work,
"dep.o><", work, "dep.s>")));
"ww_root_parity_dep_7f3.o><", work,
"ww_root_parity_dep_7f3.s>")));
assert(occurrences(ltrace, "\n") == 1);
assert(has(ltrace, strings.concat("BEGIN<-o><", bin, "><", work,
"__ww-test-000-same.o>")));
assert(has(ltrace, strings.concat("<", work, "dep.a>")));
assert(has(ltrace, strings.concat("<", work, "leaf.a>")));
assert(has(ltrace, strings.concat("<", work,
"ww_root_parity_dep_7f3.a>")));
assert(has(ltrace, strings.concat("<", work,
"ww_root_parity_leaf_7f3.a>")));
assert(has(ltrace, strings.concat("<", work, "test.a>")));
assert(has(ltrace, strings.concat("<", runtime, "/libwwrt.a>")));
assert(!has(ltrace, strings.concat("<", repo(),
"/out/lib/libwwrt.a>")));
assert(!has(ltrace, ".wwi>"));
let runav: []str = [bin];
@@ -2374,9 +2415,9 @@ fn workescape(s: str) str = {
if (si == 0) {
referenceunit = strings.dup(rootunit);
referencewwi = strings.dup(readfile(strings.concat(work,
"dep.wwi")));
"ww_root_parity_dep_7f3.wwi")));
referencearchive = strings.dup(readfile(strings.concat(work,
"dep.a")));
"ww_root_parity_dep_7f3.a")));
referencebin = strings.dup(readfile(bin));
referencecompiler = strings.dup(ctrace);
referenceassembler = strings.dup(atrace);
@@ -2386,9 +2427,11 @@ fn workescape(s: str) str = {
} else {
assert(same(referenceunit, rootunit));
assert(same(referencewwi,
readfile(strings.concat(work, "dep.wwi"))));
readfile(strings.concat(work,
"ww_root_parity_dep_7f3.wwi"))));
assert(same(referencearchive,
readfile(strings.concat(work, "dep.a"))));
readfile(strings.concat(work,
"ww_root_parity_dep_7f3.a"))));
assert(same(referencebin, readfile(bin)));
assert(same(referencecompiler, ctrace));
assert(same(referenceassembler, atrace));
@@ -2414,9 +2457,10 @@ fn workescape(s: str) str = {
runcommandenv(root, strings.concat("exact-argv-fail-", tags[si]), av,
failenv, (120i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 1);
assert(has(out.stderr, "ww: w6c failed for leaf\n"));
assert(has(out.stderr,
"ww: w6c failed for ww_root_parity_leaf_7f3\n"));
assert(has(readfile(failuretrace), strings.concat("<-I><", work,
"leaf.wwi>")));
"ww_root_parity_leaf_7f3.wwi>")));
if (si == 0) { referencefailure = strings.dup(out.stderr); }
else { assert(same(referencefailure, out.stderr)); };
clean(workroot);