|
|
|
|
@@ -1159,12 +1159,12 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
caller, stdinpath,
|
|
|
|
|
(90i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
let defaultbin: str = strings.concat(p2, "/p2.test");
|
|
|
|
|
let defaultbin: str = strings.concat(caller, "/p2.test");
|
|
|
|
|
assert(os.exists(defaultbin));
|
|
|
|
|
assert(!os.exists(strings.concat(p2, "/p2.test")));
|
|
|
|
|
assert(!os.exists(strings.concat(p2, "/created.txt")));
|
|
|
|
|
assert(!has(out.stdout, "dep-init") && !has(out.stdout, "p2-external"));
|
|
|
|
|
assert(os.remove(defaultbin) == 0);
|
|
|
|
|
clean(strings.concat(defaultbin, ".sepwork"));
|
|
|
|
|
|
|
|
|
|
assert(os.remove(strings.concat(p1, "/created.txt")) == 0);
|
|
|
|
|
let p1cbin: str = strings.concat(root, "/p1-c.test");
|
|
|
|
|
@@ -1814,6 +1814,12 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
"toexternal_test", "tomixed"];
|
|
|
|
|
let shapetargetsecond: []str = ["", "shapeexternal_test", "", "",
|
|
|
|
|
"tomixed_test"];
|
|
|
|
|
let shapeproductionselector: []str = ["shapeinternal", "shapeexternal",
|
|
|
|
|
"-", "-", "-"];
|
|
|
|
|
let shapeinternalselector: []str = ["shapeinternal", "-", "tosame",
|
|
|
|
|
"-", "tomixed"];
|
|
|
|
|
let shapeexternalselector: []str = ["-", "shapeexternal_test", "-",
|
|
|
|
|
"toexternal_test", "tomixed_test"];
|
|
|
|
|
let shapecompilerrefs: []str = ["", "", "", "", ""];
|
|
|
|
|
let shapelinkerrefs: []str = ["", "", "", "", ""];
|
|
|
|
|
let shapemainrefs: []str = ["", "", "", "", ""];
|
|
|
|
|
@@ -1827,6 +1833,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
let shapebin: str = strings.concat(root, "/shape-product-",
|
|
|
|
|
boundarypkgname(sj), ".test");
|
|
|
|
|
let shapework: str = strings.concat(shapebin, ".sepwork");
|
|
|
|
|
let shapestatus: str = strings.concat(shapebin, ".status");
|
|
|
|
|
let ctracepath: str = strings.concat(root, "/shape-compiler-",
|
|
|
|
|
boundarypkgname(sj), ".trace");
|
|
|
|
|
let ltracepath: str = strings.concat(root, "/shape-linker-",
|
|
|
|
|
@@ -1835,6 +1842,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
writefile(ltracepath, "");
|
|
|
|
|
let stagei: i32 = 0;
|
|
|
|
|
for (stagei < stages.len) {
|
|
|
|
|
assert(os.mkdir(shapework, 448i32) == 0);
|
|
|
|
|
if (stagei != 0) {
|
|
|
|
|
rewritefile(ctracepath, "");
|
|
|
|
|
rewritefile(ltracepath, "");
|
|
|
|
|
@@ -1864,8 +1872,12 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
driver(shapecompilers[stagei])));
|
|
|
|
|
append(env, strings.concat("WW_SHAPE_REAL_LINKER=",
|
|
|
|
|
driver(shapelinkers[stagei])));
|
|
|
|
|
let shapeav: []str = [driver(stages[stagei]), "test", "-c", "-o",
|
|
|
|
|
shapebin, "-I", root, shapes[index]];
|
|
|
|
|
let shapeav: []str = [driver(stages[stagei]), "test", "-c", "-w",
|
|
|
|
|
shapework, "-I", root,
|
|
|
|
|
"--ww-package-test", "test", shapefamilies[index],
|
|
|
|
|
shapeproductionselector[sj], shapeinternalselector[sj],
|
|
|
|
|
shapeexternalselector[sj], shapes[index], shapebin, "-",
|
|
|
|
|
shapestatus, shapes[index]];
|
|
|
|
|
runcommandenv(root, strings.concat("shape-structure-",
|
|
|
|
|
stages[stagei], "-", boundarypkgname(sj)), shapeav, env,
|
|
|
|
|
(120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
@@ -1876,9 +1888,9 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
shapefamilies[index], ".test")));
|
|
|
|
|
let ctrace: str = readfile(ctracepath);
|
|
|
|
|
let ltrace: str = readfile(ltracepath);
|
|
|
|
|
assert(occurrences(ctrace, "-test-main.unit.ww") == 1);
|
|
|
|
|
assert(occurrences(ctrace, "-test-main.unit.new") == 1);
|
|
|
|
|
let mainline: str = linecontaining(ctrace,
|
|
|
|
|
strings.concat("/", shapemains[sj], ".unit.ww"));
|
|
|
|
|
strings.concat("/", shapemains[sj], ".unit.new"));
|
|
|
|
|
let targetcount: i32 = 1;
|
|
|
|
|
if (shapetargetsecond[sj].len != 0) { targetcount = 2; };
|
|
|
|
|
assert(occurrences(mainline, "--test-target-package")
|
|
|
|
|
@@ -1932,6 +1944,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
};
|
|
|
|
|
clean(shapework);
|
|
|
|
|
clean(shapebin);
|
|
|
|
|
clean(shapestatus);
|
|
|
|
|
stagei += 1;
|
|
|
|
|
};
|
|
|
|
|
sj += 1;
|
|
|
|
|
@@ -2191,37 +2204,39 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
assert(same(outc.stderr, outw.stderr));
|
|
|
|
|
assert(has(outc.stderr, "usage: wwtest package"));
|
|
|
|
|
|
|
|
|
|
let cc: []str = [driver("ww"), "test", "-c", "-I", root, route];
|
|
|
|
|
let cwork: str = strings.concat(root, "/compile-c-work");
|
|
|
|
|
let wwork: str = strings.concat(root, "/compile-ww-work");
|
|
|
|
|
let cbinarypath: str = strings.concat(root, "/route-c.test");
|
|
|
|
|
let wbinarypath: str = strings.concat(root, "/route-ww.test");
|
|
|
|
|
let cc: []str = [driver("ww"), "test", "-w", cwork, "-o",
|
|
|
|
|
cbinarypath, "-I", root, route];
|
|
|
|
|
runcommand(root, "compile-c", cc,
|
|
|
|
|
(30i64 * (time.second: i64)): time.duration, &outc);
|
|
|
|
|
expectexit(&outc, 0);
|
|
|
|
|
assert(has(outc.stdout, strings.concat(" -> ", route, "/route.test\n")));
|
|
|
|
|
assert(occurrences(outc.stdout, "built ") == 1);
|
|
|
|
|
let cwhite: str = readfile(strings.concat(route,
|
|
|
|
|
"/route.test.sepwork/route-internal-test.s"));
|
|
|
|
|
let cexternal: str = readfile(strings.concat(route,
|
|
|
|
|
"/route.test.sepwork/route_test-external-test.s"));
|
|
|
|
|
let cmain: str = readfile(strings.concat(route,
|
|
|
|
|
"/route.test.sepwork/route-test-main.s"));
|
|
|
|
|
let cbinary: str = readfile(strings.concat(route, "/route.test"));
|
|
|
|
|
// The explicit package `-c` outputs are caller-owned artifacts. Release
|
|
|
|
|
// the shared C-stage tree before asking the WW driver to acquire the same
|
|
|
|
|
// stem; the driver never deletes a pre-existing `.sepwork` path.
|
|
|
|
|
clean(strings.concat(route, "/route.test.sepwork"));
|
|
|
|
|
assert(has(outc.stdout, "route.white ... ok\n"));
|
|
|
|
|
assert(has(outc.stdout, "route.external ... ok\n"));
|
|
|
|
|
let cwhite: str = readfile(strings.concat(cwork,
|
|
|
|
|
"/route-internal-test.s"));
|
|
|
|
|
let cexternal: str = readfile(strings.concat(cwork,
|
|
|
|
|
"/route_test-external-test.s"));
|
|
|
|
|
let cmain: str = readfile(strings.concat(cwork,
|
|
|
|
|
"/route-test-main.s"));
|
|
|
|
|
let cbinary: str = readfile(cbinarypath);
|
|
|
|
|
|
|
|
|
|
let wc: []str = [driver("ww_ww"), "test", "-c", "-I", root, route];
|
|
|
|
|
let wc: []str = [driver("ww_ww"), "test", "-w", wwork, "-o",
|
|
|
|
|
wbinarypath, "-I", root, route];
|
|
|
|
|
runcommand(root, "compile-ww", wc,
|
|
|
|
|
(30i64 * (time.second: i64)): time.duration, &outw);
|
|
|
|
|
expectexit(&outw, 0);
|
|
|
|
|
assert(same(outc.stdout, outw.stdout));
|
|
|
|
|
assert(same(outc.stderr, outw.stderr));
|
|
|
|
|
assert(same(cwhite, readfile(strings.concat(route,
|
|
|
|
|
"/route.test.sepwork/route-internal-test.s"))));
|
|
|
|
|
assert(same(cexternal, readfile(strings.concat(route,
|
|
|
|
|
"/route.test.sepwork/route_test-external-test.s"))));
|
|
|
|
|
assert(same(cmain, readfile(strings.concat(route,
|
|
|
|
|
"/route.test.sepwork/route-test-main.s"))));
|
|
|
|
|
assert(same(cbinary, readfile(strings.concat(route, "/route.test"))));
|
|
|
|
|
assert(same(cwhite, readfile(strings.concat(wwork,
|
|
|
|
|
"/route-internal-test.s"))));
|
|
|
|
|
assert(same(cexternal, readfile(strings.concat(wwork,
|
|
|
|
|
"/route_test-external-test.s"))));
|
|
|
|
|
assert(same(cmain, readfile(strings.concat(wwork,
|
|
|
|
|
"/route-test-main.s"))));
|
|
|
|
|
assert(same(cbinary, readfile(wbinarypath)));
|
|
|
|
|
clean(root);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@@ -2464,7 +2479,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
|
|
|
|
|
let av: []str = [driver(stages[si]), "test", "-c", "-w", works[si],
|
|
|
|
|
"-I", root, "--ww-package-test", "test", "pkg", "pkg", "pkg",
|
|
|
|
|
"pkg_test", pkg, bins[si], statuses[si], pkg];
|
|
|
|
|
"pkg_test", pkg, bins[si], "-", statuses[si], pkg];
|
|
|
|
|
runcommandenv(root, strings.concat("graph-cold-", stages[si]), av,
|
|
|
|
|
env, (120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
@@ -2728,7 +2743,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
driver(linkers[si])));
|
|
|
|
|
let av: []str = [driver(stages[si]), "test", "-c", "-w", works[si],
|
|
|
|
|
"-I", root, "--ww-package-test", "test", "pkg", "pkg", "pkg",
|
|
|
|
|
"pkg_test", pkg, bins[si], statuses[si], pkg];
|
|
|
|
|
"pkg_test", pkg, bins[si], "-", statuses[si], pkg];
|
|
|
|
|
runcommandenv(root, strings.concat("graph-body-", stages[si]), av,
|
|
|
|
|
tracedenv, (120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
@@ -2807,7 +2822,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
driver(linkers[si])));
|
|
|
|
|
let av: []str = [driver(stages[si]), "test", "-c", "-w", works[si],
|
|
|
|
|
"-I", root, "--ww-package-test", "test", "pkg", "pkg", "pkg",
|
|
|
|
|
"pkg_test", pkg, bins[si], statuses[si], pkg];
|
|
|
|
|
"pkg_test", pkg, bins[si], "-", statuses[si], pkg];
|
|
|
|
|
runcommandenv(root, strings.concat("graph-external-", stages[si]), av,
|
|
|
|
|
tracedenv, (120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
@@ -2878,7 +2893,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
driver(linkers[si])));
|
|
|
|
|
let av: []str = [driver(stages[si]), "test", "-c", "-w", works[si],
|
|
|
|
|
"-I", root, "--ww-package-test", "test", "pkg", "pkg", "pkg",
|
|
|
|
|
"pkg_test", pkg, bins[si], statuses[si], pkg];
|
|
|
|
|
"pkg_test", pkg, bins[si], "-", statuses[si], pkg];
|
|
|
|
|
runcommandenv(root, strings.concat("graph-export-", stages[si]), av,
|
|
|
|
|
tracedenv, (120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
@@ -2981,7 +2996,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
driver(linkers[si])));
|
|
|
|
|
let av: []str = [driver(stages[si]), "test", "-c", "-w", works[si],
|
|
|
|
|
"-I", root, "--ww-package-test", "test", "pkg", "pkg", "pkg",
|
|
|
|
|
"-", pkg, bins[si], statuses[si], pkg];
|
|
|
|
|
"-", pkg, bins[si], "-", statuses[si], pkg];
|
|
|
|
|
runcommandenv(root, strings.concat("graph-remove-external-", stages[si]),
|
|
|
|
|
av, env, (120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
@@ -3106,7 +3121,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
driver(linkers[si])));
|
|
|
|
|
let av: []str = [driver(stages[si]), "test", "-c", "-w", works[si],
|
|
|
|
|
"-I", root, "--ww-package-test", "test", "pkg", "pkg", "pkg",
|
|
|
|
|
"pkg_test", pkg, bins[si], statuses[si], pkg];
|
|
|
|
|
"pkg_test", pkg, bins[si], "-", statuses[si], pkg];
|
|
|
|
|
runcommandenv(root, strings.concat("graph-readd-external-", stages[si]),
|
|
|
|
|
av, env, (120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
@@ -3191,7 +3206,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
runcommand(root, strings.concat("graph-direct-product-", stages[si]),
|
|
|
|
|
directav, (120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(occurrences(out.stdout, "built ") == 1);
|
|
|
|
|
assert(out.stdout.len == 0);
|
|
|
|
|
assert(os.exists(directbin));
|
|
|
|
|
if (si == 0) {
|
|
|
|
|
directbytes = readfile(directbin);
|
|
|
|
|
@@ -3376,19 +3391,19 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
let forward: []str = [driver(stages[si]), "test", "-c", "-w",
|
|
|
|
|
works[si], "-I", suite, "-I", root,
|
|
|
|
|
"--ww-package-test", "test", "alpha", "alpha", "alpha",
|
|
|
|
|
"alpha_test", alpha, bins[0], statuses[0],
|
|
|
|
|
"alpha_test", alpha, bins[0], "-", statuses[0],
|
|
|
|
|
"--ww-package-test", "test", "beta", "beta", "beta",
|
|
|
|
|
"beta_test", beta, bins[1], statuses[1],
|
|
|
|
|
"beta_test", beta, bins[1], "-", statuses[1],
|
|
|
|
|
"--ww-package-test", "test", "gamma", "gamma", "-", "-",
|
|
|
|
|
gamma, gammabin, statuses[2], alpha];
|
|
|
|
|
gamma, gammabin, "-", statuses[2], alpha];
|
|
|
|
|
let reverse: []str = [driver(stages[si]), "test", "-c", "-w",
|
|
|
|
|
works[si], "-I", suite, "-I", root,
|
|
|
|
|
"--ww-package-test", "test", "gamma", "gamma", "-", "-",
|
|
|
|
|
gamma, gammabin, statuses[2],
|
|
|
|
|
gamma, gammabin, "-", statuses[2],
|
|
|
|
|
"--ww-package-test", "test", "beta", "beta", "beta",
|
|
|
|
|
"beta_test", beta, bins[1], statuses[1],
|
|
|
|
|
"beta_test", beta, bins[1], "-", statuses[1],
|
|
|
|
|
"--ww-package-test", "test", "alpha", "alpha", "alpha",
|
|
|
|
|
"alpha_test", alpha, bins[0], statuses[0], alpha];
|
|
|
|
|
"alpha_test", alpha, bins[0], "-", statuses[0], alpha];
|
|
|
|
|
if (si == 0) {
|
|
|
|
|
runcommandenv(root, "multi-forward-c", forward, env,
|
|
|
|
|
(180i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
@@ -3531,14 +3546,11 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
si += 1;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Public root order is presentation-only: two directories publish one
|
|
|
|
|
// binary each, while the selected no-test directory publishes no binary.
|
|
|
|
|
let publicalpha: str = strings.concat(alpha, "/alpha.test");
|
|
|
|
|
let publicbeta: str = strings.concat(beta, "/beta.test");
|
|
|
|
|
let publicgamma: str = strings.concat(gamma, "/gamma.test");
|
|
|
|
|
let publicworks: []str = [strings.concat(publicalpha, ".sepwork"),
|
|
|
|
|
strings.concat(publicbeta, ".sepwork"),
|
|
|
|
|
strings.concat(publicgamma, ".sepwork")];
|
|
|
|
|
// Public root order is presentation-only. Default -c destinations are in
|
|
|
|
|
// the invocation cwd, and the selected no-test package publishes nothing.
|
|
|
|
|
let publicalpha: str = strings.concat(root, "/alpha.test");
|
|
|
|
|
let publicbeta: str = strings.concat(root, "/beta.test");
|
|
|
|
|
let publicgamma: str = strings.concat(root, "/gamma.test");
|
|
|
|
|
let publicout: str = "";
|
|
|
|
|
let publicerr: str = "";
|
|
|
|
|
let publicalphabytes: str = "";
|
|
|
|
|
@@ -3562,11 +3574,11 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
append(publicav, gamma); append(publicav, beta);
|
|
|
|
|
append(publicav, alpha);
|
|
|
|
|
};
|
|
|
|
|
runcommand(root, strings.concat("multi-public-order-",
|
|
|
|
|
publiclabels[pi]), publicav,
|
|
|
|
|
runcommanddir(root, strings.concat("multi-public-order-",
|
|
|
|
|
publiclabels[pi]), root, publicav,
|
|
|
|
|
(180i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(occurrences(out.stdout, "built ") == 2);
|
|
|
|
|
assert(occurrences(out.stdout, "built ") == 0);
|
|
|
|
|
assert(has(out.stdout, strings.concat(
|
|
|
|
|
"? ", gamma, " [no tests]\n")));
|
|
|
|
|
assert(os.exists(publicalpha) && os.exists(publicbeta));
|
|
|
|
|
@@ -3584,8 +3596,6 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
assert(same(publicalphabytes, readfile(publicalpha)));
|
|
|
|
|
assert(same(publicbetabytes, readfile(publicbeta)));
|
|
|
|
|
};
|
|
|
|
|
let wi: i32 = 0;
|
|
|
|
|
for (wi < publicworks.len) { clean(publicworks[wi]); wi += 1; };
|
|
|
|
|
clean(publicalpha); clean(publicbeta); clean(publicgamma);
|
|
|
|
|
pi += 1;
|
|
|
|
|
};
|
|
|
|
|
@@ -3756,6 +3766,8 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
append(linkenv, strings.concat("WW_MIXED_W6L=", driver("w6l")));
|
|
|
|
|
let bins: []str = [strings.concat(named, "/test.test"),
|
|
|
|
|
strings.concat(consumer, "/zconsumer.test")];
|
|
|
|
|
let statuses: []str = [strings.concat(root, "/mixed-test.status"),
|
|
|
|
|
strings.concat(root, "/mixed-zconsumer.status")];
|
|
|
|
|
let keys: []str = ["test-internal-test", "test_test-external-test",
|
|
|
|
|
"test-test-main", "zconsumer-internal-test",
|
|
|
|
|
"zconsumer_test-external-test", "zconsumer-test-main"];
|
|
|
|
|
@@ -3766,8 +3778,14 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
let out: commandout;
|
|
|
|
|
let si: i32 = 0;
|
|
|
|
|
for (si < stages.len) {
|
|
|
|
|
let av: []str = [driver(stages[si]), "test", "-c", "-j", "1",
|
|
|
|
|
"-I", suite, strings.concat(suite, "/...")];
|
|
|
|
|
assert(os.mkdir(workroot, 448i32) == 0);
|
|
|
|
|
let av: []str = [driver(stages[si]), "test", "-c", "-w", workroot,
|
|
|
|
|
"-I", suite,
|
|
|
|
|
"--ww-package-test", "test", "test", "test", "test",
|
|
|
|
|
"test_test", named, bins[0], "-", statuses[0],
|
|
|
|
|
"--ww-package-test", "test", "zconsumer", "zconsumer",
|
|
|
|
|
"zconsumer", "zconsumer_test", consumer, bins[1], "-",
|
|
|
|
|
statuses[1], named];
|
|
|
|
|
if (si == 0) {
|
|
|
|
|
runcommandenv(root, "mixed-actions-c", av, linkenv,
|
|
|
|
|
(120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
@@ -3776,7 +3794,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
(120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
};
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(occurrences(out.stdout, "built ") == 2);
|
|
|
|
|
assert(out.stdout.len == 0 && out.stderr.len == 0);
|
|
|
|
|
let namedprod: str = readfile(strings.concat(work,
|
|
|
|
|
"test-internal-test.unit.ww"));
|
|
|
|
|
let support: str = readfile(strings.concat(work, "__wwtest.unit.ww"));
|
|
|
|
|
@@ -4441,7 +4459,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
append(env, strings.concat("WW_UNIVERSE_BUILDER_TRACE=",
|
|
|
|
|
buildertraces[si]));
|
|
|
|
|
|
|
|
|
|
let av: []str = alloc([], (8 + productcount * 9): u64)!;
|
|
|
|
|
let av: []str = alloc([], (8 + productcount * 10): u64)!;
|
|
|
|
|
append(av, driver(stages[si]));
|
|
|
|
|
append(av, "test"); append(av, "-c");
|
|
|
|
|
append(av, "-w"); append(av, works[si]);
|
|
|
|
|
@@ -4461,6 +4479,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
};
|
|
|
|
|
append(av, dir);
|
|
|
|
|
append(av, strings.concat(root, "/product-", name, ".test"));
|
|
|
|
|
append(av, "-");
|
|
|
|
|
append(av, strings.concat(root, "/product-", name, ".status"));
|
|
|
|
|
i += 1;
|
|
|
|
|
};
|
|
|
|
|
@@ -4479,12 +4498,13 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
};
|
|
|
|
|
append(av, dir);
|
|
|
|
|
append(av, strings.concat(root, "/product-", name, ".test"));
|
|
|
|
|
append(av, "-");
|
|
|
|
|
append(av, strings.concat(root, "/product-", name, ".status"));
|
|
|
|
|
i -= 1;
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
append(av, strings.concat(suite, "/p000"));
|
|
|
|
|
assert(av.len == 8 + productcount * 9);
|
|
|
|
|
assert(av.len == 8 + productcount * 10);
|
|
|
|
|
runcommandenv(root, strings.concat("dynamic-universe-", stages[si]), av,
|
|
|
|
|
env, (1200i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
@@ -5038,7 +5058,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
let seedav: []str = [driver(stages[i]), "test", "-c",
|
|
|
|
|
"-w", lateworks[i], "-I", root, "--ww-package-test", "test",
|
|
|
|
|
"late", "late", "late", "late_test", late, latebins[i],
|
|
|
|
|
latestatuses[i], late];
|
|
|
|
|
"-", latestatuses[i], late];
|
|
|
|
|
runcommandenv(root, strings.concat("late-seed-", tags[i]), seedav,
|
|
|
|
|
seedenv, (180i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
@@ -5164,7 +5184,7 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
let failav: []str = [driver(stages[i]), "test", "-c",
|
|
|
|
|
"-w", lateworks[i], "-I", root, "--ww-package-test", "test",
|
|
|
|
|
"late", "late", "late", "late_test", late, attemptbin,
|
|
|
|
|
attemptstatus, late];
|
|
|
|
|
"-", attemptstatus, late];
|
|
|
|
|
runcommandenv(root, strings.concat("late-failure-",
|
|
|
|
|
phaselabels[phasei], "-", tags[i], "-", retrylabel), failav,
|
|
|
|
|
env, (180i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
@@ -5276,8 +5296,8 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
let out: commandout;
|
|
|
|
|
let i: i32 = 0;
|
|
|
|
|
for (i < stages.len) {
|
|
|
|
|
let av: []str = [driver(stages[i]), "test", "-c", "-I", root,
|
|
|
|
|
"-o", bin, pkg];
|
|
|
|
|
let av: []str = [driver(stages[i]), "test", "-w", workroot,
|
|
|
|
|
"-I", root, "-o", bin, pkg];
|
|
|
|
|
runcommand(root, strings.concat("named-test-build-", stages[i]), av,
|
|
|
|
|
(120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
@@ -5914,18 +5934,22 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
orderwork, "-I", source,
|
|
|
|
|
"--ww-package-test", "test", "main", "main", "-", "-", client,
|
|
|
|
|
strings.concat(root, "/order-client-", stages[si]),
|
|
|
|
|
"-",
|
|
|
|
|
strings.concat(root, "/order-client-", stages[si], ".status"),
|
|
|
|
|
"--ww-package-test", "test", "main", "main", "-", "-", outsider,
|
|
|
|
|
strings.concat(root, "/order-outsider-", stages[si]),
|
|
|
|
|
"-",
|
|
|
|
|
strings.concat(root, "/order-outsider-", stages[si], ".status"),
|
|
|
|
|
client];
|
|
|
|
|
let orderreverse: []str = [driver(stages[si]), "test", "-c", "-w",
|
|
|
|
|
orderwork, "-I", source,
|
|
|
|
|
"--ww-package-test", "test", "main", "main", "-", "-", outsider,
|
|
|
|
|
strings.concat(root, "/order-outsider-", stages[si]),
|
|
|
|
|
"-",
|
|
|
|
|
strings.concat(root, "/order-outsider-", stages[si], ".status"),
|
|
|
|
|
"--ww-package-test", "test", "main", "main", "-", "-", client,
|
|
|
|
|
strings.concat(root, "/order-client-", stages[si]),
|
|
|
|
|
"-",
|
|
|
|
|
strings.concat(root, "/order-client-", stages[si], ".status"),
|
|
|
|
|
client];
|
|
|
|
|
let orderrequests: [][]str = [orderforward, orderreverse];
|
|
|
|
|
@@ -6352,10 +6376,10 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
source, "--ww-package-build",
|
|
|
|
|
"--ww-package-test", "build", "paritybase", "paritybase",
|
|
|
|
|
"-", "-", base,
|
|
|
|
|
combinedbase, combinedbasestatus,
|
|
|
|
|
combinedbase, "-", combinedbasestatus,
|
|
|
|
|
"--ww-package-test", "build", "parityleft", "parityleft",
|
|
|
|
|
"-", "-", left,
|
|
|
|
|
combinedleft, combinedleftstatus, left];
|
|
|
|
|
combinedleft, "-", combinedleftstatus, left];
|
|
|
|
|
runcommandenv(root, strings.concat("long-combined-", tags[si]),
|
|
|
|
|
combinedav, env, (120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
@@ -9113,13 +9137,17 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
strings.concat(root, "/stem"), spec];
|
|
|
|
|
let ow: []str = [driver("ww_ww"), "test", "-o",
|
|
|
|
|
strings.concat(root, "/stem"), spec];
|
|
|
|
|
runcommand(root, "tree-o-c", oc, time.second, &outc);
|
|
|
|
|
runcommand(root, "tree-o-ww", ow, time.second, &outw);
|
|
|
|
|
expectexit(&outc, 2);
|
|
|
|
|
expectexit(&outw, 2);
|
|
|
|
|
runcommand(root, "tree-o-c", oc,
|
|
|
|
|
(30i64 * (time.second: i64)): time.duration, &outc);
|
|
|
|
|
runcommand(root, "tree-o-ww", ow,
|
|
|
|
|
(30i64 * (time.second: i64)): time.duration, &outw);
|
|
|
|
|
expectexit(&outc, 1);
|
|
|
|
|
expectexit(&outw, 1);
|
|
|
|
|
assert(outc.stdout.len == 0 && outw.stdout.len == 0);
|
|
|
|
|
assert(same(outc.stderr, outw.stderr));
|
|
|
|
|
assert(has(outc.stderr,
|
|
|
|
|
"ww test: -o needs -c for a package target\n"));
|
|
|
|
|
"with multiple packages, -o must refer to a directory or /dev/null"));
|
|
|
|
|
assert(!os.exists(strings.concat(root, "/stem")));
|
|
|
|
|
|
|
|
|
|
// -w on a package target forwards to the coordinator: one shared
|
|
|
|
|
// persistent driver workdir for the complete selected request,
|
|
|
|
|
@@ -9691,9 +9719,11 @@ fn cwdwritedata(dir: str, label: str) void = {
|
|
|
|
|
"--ww-package-build",
|
|
|
|
|
"--ww-package-test", "build", "foo", "foo", "-", "-",
|
|
|
|
|
localleft, leftout,
|
|
|
|
|
"-",
|
|
|
|
|
strings.concat(root, "/local-", stages[si], "-left.status"),
|
|
|
|
|
"--ww-package-test", "build", "foo", "foo", "-", "-",
|
|
|
|
|
localright, rightout,
|
|
|
|
|
"-",
|
|
|
|
|
strings.concat(root, "/local-", stages[si], "-right.status"),
|
|
|
|
|
localleft];
|
|
|
|
|
runcommand(root, strings.concat("local-command-union-", stages[si]),
|
|
|
|
|
@@ -10440,15 +10470,15 @@ fn runtimepath(relative: str) str = {
|
|
|
|
|
let foldforward: []str = [driver(stages[si]), "test", "-c", "-w",
|
|
|
|
|
foldmultiwork, "-I", source, "--ww-package-build",
|
|
|
|
|
"--ww-package-test", "build", "main", "main", "-", "-", client,
|
|
|
|
|
foldallowedout, foldallowedstatus,
|
|
|
|
|
foldallowedout, "-", foldallowedstatus,
|
|
|
|
|
"--ww-package-test", "build", "main", "main", "-", "-",
|
|
|
|
|
foldvendorclient, foldcollisionout, foldcollisionstatus, client];
|
|
|
|
|
foldvendorclient, foldcollisionout, "-", foldcollisionstatus, client];
|
|
|
|
|
let foldreverse: []str = [driver(stages[si]), "test", "-c", "-w",
|
|
|
|
|
foldmultiwork, "-I", source, "--ww-package-build",
|
|
|
|
|
"--ww-package-test", "build", "main", "main", "-", "-",
|
|
|
|
|
foldvendorclient, foldcollisionout, foldcollisionstatus,
|
|
|
|
|
foldvendorclient, foldcollisionout, "-", foldcollisionstatus,
|
|
|
|
|
"--ww-package-test", "build", "main", "main", "-", "-", client,
|
|
|
|
|
foldallowedout, foldallowedstatus, client];
|
|
|
|
|
foldallowedout, "-", foldallowedstatus, client];
|
|
|
|
|
let foldrequests: [][]str = [foldforward, foldreverse];
|
|
|
|
|
let foldmultidiags: []str = ["", ""];
|
|
|
|
|
let foldorderlabels: []str = ["forward", "reverse"];
|
|
|
|
|
@@ -10793,7 +10823,7 @@ fn runtimepath(relative: str) str = {
|
|
|
|
|
strings.concat(combinedoutputs[5], ".status"),
|
|
|
|
|
strings.concat(combinedoutputs[6], ".status")];
|
|
|
|
|
let combinedav: []str = alloc([],
|
|
|
|
|
(9 + combinedtargets.len * 9): u64)!;
|
|
|
|
|
(9 + combinedtargets.len * 10): u64)!;
|
|
|
|
|
append(combinedav, driver(stages[si]));
|
|
|
|
|
append(combinedav, "test"); append(combinedav, "-c");
|
|
|
|
|
append(combinedav, "-w"); append(combinedav, combinedwork);
|
|
|
|
|
@@ -10809,6 +10839,7 @@ fn runtimepath(relative: str) str = {
|
|
|
|
|
append(combinedav, "-");
|
|
|
|
|
append(combinedav, combinedtargets[ui]);
|
|
|
|
|
append(combinedav, combinedoutputs[ui]);
|
|
|
|
|
append(combinedav, "-");
|
|
|
|
|
append(combinedav, combinedstatuses[ui]);
|
|
|
|
|
ui += 1;
|
|
|
|
|
};
|
|
|
|
|
@@ -10882,15 +10913,15 @@ fn runtimepath(relative: str) str = {
|
|
|
|
|
let orderforward: []str = [driver(stages[si]), "test", "-c", "-w",
|
|
|
|
|
orderwork, "-I", source, "--ww-package-build",
|
|
|
|
|
"--ww-package-test", "build", "main", "main", "-", "-", client,
|
|
|
|
|
orderallowed, orderallowedstatus,
|
|
|
|
|
orderallowed, "-", orderallowedstatus,
|
|
|
|
|
"--ww-package-test", "build", "main", "main", "-", "-", outsider,
|
|
|
|
|
orderforbidden, orderforbiddenstatus, client];
|
|
|
|
|
orderforbidden, "-", orderforbiddenstatus, client];
|
|
|
|
|
let orderreverse: []str = [driver(stages[si]), "test", "-c", "-w",
|
|
|
|
|
orderwork, "-I", source, "--ww-package-build",
|
|
|
|
|
"--ww-package-test", "build", "main", "main", "-", "-", outsider,
|
|
|
|
|
orderforbidden, orderforbiddenstatus,
|
|
|
|
|
orderforbidden, "-", orderforbiddenstatus,
|
|
|
|
|
"--ww-package-test", "build", "main", "main", "-", "-", client,
|
|
|
|
|
orderallowed, orderallowedstatus, client];
|
|
|
|
|
orderallowed, "-", orderallowedstatus, client];
|
|
|
|
|
let orderrequests: [][]str = [orderforward, orderreverse];
|
|
|
|
|
let orderdiags: []str = ["", ""];
|
|
|
|
|
let oi: i32 = 0;
|
|
|
|
|
@@ -12162,23 +12193,32 @@ fn runtimepath(relative: str) str = {
|
|
|
|
|
let pdir: str = strings.concat(root, "/pkg");
|
|
|
|
|
assert(os.mkdir(pdir, 493i32) == 0);
|
|
|
|
|
writefile(strings.concat(pdir, "/pkg.ww"),
|
|
|
|
|
"package pkg;\nexport fn v() i32 = { return 7; };\n");
|
|
|
|
|
writefile(strings.concat(pdir, "/pkg_test.ww"), strings.concat(
|
|
|
|
|
"package pkg_test;\nimport pkg;\n",
|
|
|
|
|
"@test fn seven() void = { assert(pkg.v() == 7); };\n"));
|
|
|
|
|
"package family;\nexport fn v() i32 = { return 7; };\n");
|
|
|
|
|
writefile(strings.concat(pdir, "/same_test.ww"), strings.concat(
|
|
|
|
|
"package family;\nimport os;\n",
|
|
|
|
|
"@test fn seven() void = { let av: []str = os.args();",
|
|
|
|
|
" if (av.len != 0) { os.write(os.STDOUT_FILENO, av[0].ptr,",
|
|
|
|
|
" av[0].len: u64); os.write(os.STDOUT_FILENO, \"\\n\".ptr, 1u64); };",
|
|
|
|
|
" assert(v() == 7); };\n"));
|
|
|
|
|
let adir: str = strings.concat(root, "/a");
|
|
|
|
|
assert(os.mkdir(adir, 493i32) == 0);
|
|
|
|
|
// '_'-prefixed: the tree walk skips it, so the artifacts and
|
|
|
|
|
// their .sepwork trees never pollute the multi-package discovery.
|
|
|
|
|
writefile(strings.concat(adir, "/a.ww"),
|
|
|
|
|
"package other;\nexport fn v() i32 = { return 1; };\n");
|
|
|
|
|
writefile(strings.concat(adir, "/a_test.ww"),
|
|
|
|
|
"package other;\n@test fn one() void = { assert(v() == 1); };\n");
|
|
|
|
|
let none: str = strings.concat(root, "/znone");
|
|
|
|
|
assert(os.mkdir(none, 493i32) == 0);
|
|
|
|
|
writefile(strings.concat(none, "/none.ww"),
|
|
|
|
|
"package renamed;\nexport fn v() i32 = { return 9; };\n");
|
|
|
|
|
// '_' roots are excluded from recursive package discovery.
|
|
|
|
|
let outdir: str = strings.concat(root, "/_out");
|
|
|
|
|
assert(os.mkdir(outdir, 493i32) == 0);
|
|
|
|
|
writefile(strings.concat(adir, "/a.ww"),
|
|
|
|
|
"package a;\nexport fn v() i32 = { return 1; };\n");
|
|
|
|
|
writefile(strings.concat(adir, "/a_test.ww"), strings.concat(
|
|
|
|
|
"package a_test;\nimport a;\n",
|
|
|
|
|
"@test fn one() void = { assert(a.v() == 1); };\n"));
|
|
|
|
|
let out: commandout;
|
|
|
|
|
let drvs: []str = ["ww", "ww_ww"];
|
|
|
|
|
let namedbytes: str = "";
|
|
|
|
|
let defaultbytes: str = "";
|
|
|
|
|
let fanabytes: str = "";
|
|
|
|
|
let fanpkgbytes: str = "";
|
|
|
|
|
let i: i32 = 0;
|
|
|
|
|
for (i < 2) {
|
|
|
|
|
let named: str = strings.concat(outdir, "/out_", drvs[i],
|
|
|
|
|
@@ -12193,31 +12233,379 @@ fn runtimepath(relative: str) str = {
|
|
|
|
|
case void => void;
|
|
|
|
|
case let e: os.oserror => abort("-c -o artifact missing");
|
|
|
|
|
};
|
|
|
|
|
assert(((fi.mode: u32) & 73u32) != 0u32);
|
|
|
|
|
assert(!has(out.stdout, "seven ... "));
|
|
|
|
|
match (os.stat(&fi, strings.concat(pdir, "/pkg.test"))) {
|
|
|
|
|
case void => abort("-c -o still published the fixed stem");
|
|
|
|
|
case let e: os.oserror => void;
|
|
|
|
|
};
|
|
|
|
|
if (i == 0) { namedbytes = readfile(named); }
|
|
|
|
|
else { assert(same(namedbytes, readfile(named))); };
|
|
|
|
|
let runav: []str = [named];
|
|
|
|
|
runcommand(root, strings.concat("namerun_", drvs[i]), runav,
|
|
|
|
|
(30i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(has(out.stdout, "seven ... ok"));
|
|
|
|
|
assert(has(out.stdout, "seven ... "));
|
|
|
|
|
|
|
|
|
|
let runnamed: str = strings.concat(outdir, "/run_", drvs[i], ".bin");
|
|
|
|
|
let nocav: []str = [driver(drvs[i]), "test", "-I", root,
|
|
|
|
|
"-o", named, pdir];
|
|
|
|
|
"-o", runnamed, pdir];
|
|
|
|
|
runcommand(root, strings.concat("noc_", drvs[i]), nocav,
|
|
|
|
|
(30i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 2);
|
|
|
|
|
assert(has(out.stderr, "-o needs -c for a package target"));
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(out.stderr.len == 0 && os.exists(runnamed));
|
|
|
|
|
assert(has(out.stdout, "seven ... "));
|
|
|
|
|
assert(has(out.stdout, "/package.test\n"));
|
|
|
|
|
assert(!has(out.stdout, runnamed));
|
|
|
|
|
|
|
|
|
|
let defaultbin: str = strings.concat(root, "/pkg.test");
|
|
|
|
|
let defaultav: []str = [driver(drvs[i]), "test", "-c", "-I", root,
|
|
|
|
|
pdir];
|
|
|
|
|
runcommanddir(root, strings.concat("default_", drvs[i]), root,
|
|
|
|
|
defaultav,
|
|
|
|
|
(30i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(os.exists(defaultbin));
|
|
|
|
|
assert(!os.exists(strings.concat(root, "/family.test")));
|
|
|
|
|
assert(!os.exists(strings.concat(pdir, "/family.test")));
|
|
|
|
|
if (i == 0) { defaultbytes = readfile(defaultbin); }
|
|
|
|
|
else { assert(same(defaultbytes, readfile(defaultbin))); };
|
|
|
|
|
clean(defaultbin);
|
|
|
|
|
|
|
|
|
|
let fanroot: str = strings.concat(root, "/_fan_", drvs[i]);
|
|
|
|
|
let fanarg: str = strings.concat(fanroot, "/nested/");
|
|
|
|
|
let fanav: []str = [driver(drvs[i]), "test", "-c", "-j", "2",
|
|
|
|
|
"-I", root, "-o", fanarg, strings.concat(root, "/...")];
|
|
|
|
|
runcommand(root, strings.concat("fan_", drvs[i]), fanav,
|
|
|
|
|
(60i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
let fanabin: str = strings.concat(fanarg, "a.test");
|
|
|
|
|
let fanpkg: str = strings.concat(fanarg, "pkg.test");
|
|
|
|
|
assert(os.exists(fanabin) && os.exists(fanpkg));
|
|
|
|
|
assert(!os.exists(strings.concat(fanarg, "znone.test")));
|
|
|
|
|
assert(has(out.stdout, strings.concat("? ", none, " [no tests]\n")));
|
|
|
|
|
if (i == 0) {
|
|
|
|
|
fanabytes = readfile(fanabin);
|
|
|
|
|
fanpkgbytes = readfile(fanpkg);
|
|
|
|
|
} else {
|
|
|
|
|
assert(same(fanabytes, readfile(fanabin)));
|
|
|
|
|
assert(same(fanpkgbytes, readfile(fanpkg)));
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let badout: str = strings.concat(outdir, "/multi-file-", drvs[i]);
|
|
|
|
|
let mulav: []str = [driver(drvs[i]), "test", "-c", "-o",
|
|
|
|
|
named, strings.concat(root, "/...")];
|
|
|
|
|
badout, strings.concat(root, "/...")];
|
|
|
|
|
runcommand(root, strings.concat("multi_", drvs[i]), mulav,
|
|
|
|
|
(30i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 2);
|
|
|
|
|
expectexit(&out, 1);
|
|
|
|
|
assert(has(out.stderr,
|
|
|
|
|
"cannot use -o with multiple packages"));
|
|
|
|
|
"with multiple packages, -o must refer to a directory or /dev/null"));
|
|
|
|
|
assert(!os.exists(badout));
|
|
|
|
|
|
|
|
|
|
let nullcompile: []str = [driver(drvs[i]), "test", "-c", "-I",
|
|
|
|
|
root, "-o", "/dev/null", pdir];
|
|
|
|
|
runcommand(root, strings.concat("null-compile_", drvs[i]), nullcompile,
|
|
|
|
|
(30i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(!has(out.stdout, "seven ... "));
|
|
|
|
|
assert(!os.exists("/dev/null.new"));
|
|
|
|
|
let nullrun: []str = [driver(drvs[i]), "test", "-I", root,
|
|
|
|
|
"-o", "/dev/null", pdir];
|
|
|
|
|
runcommand(root, strings.concat("null-run_", drvs[i]), nullrun,
|
|
|
|
|
(30i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(has(out.stdout, "seven ... "));
|
|
|
|
|
i += 1;
|
|
|
|
|
};
|
|
|
|
|
clean(root);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@test fn test_binary_publication_transaction() void = {
|
|
|
|
|
let root: str = fresh();
|
|
|
|
|
let suite: str = strings.concat(root, "/suite");
|
|
|
|
|
let leftsame: str = strings.concat(suite, "/left/same");
|
|
|
|
|
let rightsame: str = strings.concat(suite, "/right/same");
|
|
|
|
|
let alpha: str = strings.concat(suite, "/alpha");
|
|
|
|
|
let beta: str = strings.concat(suite, "/beta");
|
|
|
|
|
let failed: str = strings.concat(suite, "/failed");
|
|
|
|
|
let none: str = strings.concat(suite, "/none");
|
|
|
|
|
let persist: str = strings.concat(suite, "/persist");
|
|
|
|
|
mkdirall(leftsame); mkdirall(rightsame); mkdirall(alpha);
|
|
|
|
|
mkdirall(beta); mkdirall(failed); mkdirall(none); mkdirall(persist);
|
|
|
|
|
writefile(strings.concat(leftsame, "/same.ww"),
|
|
|
|
|
"package declared_left;\nfn value() i32 = { return 1; };\n");
|
|
|
|
|
writefile(strings.concat(leftsame, "/same_test.ww"), strings.concat(
|
|
|
|
|
"package declared_left;\n",
|
|
|
|
|
"@test fn left() void = { assert(value() == 1); };\n"));
|
|
|
|
|
writefile(strings.concat(rightsame, "/same.ww"),
|
|
|
|
|
"package declared_right;\nfn value() i32 = { return 2; };\n");
|
|
|
|
|
writefile(strings.concat(rightsame, "/same_test.ww"), strings.concat(
|
|
|
|
|
"package declared_right;\n",
|
|
|
|
|
"@test fn right() void = { assert(value() == 2); };\n"));
|
|
|
|
|
writefile(strings.concat(alpha, "/alpha.ww"),
|
|
|
|
|
"package alpha_decl;\nfn value() i32 = { return 3; };\n");
|
|
|
|
|
writefile(strings.concat(alpha, "/alpha_test.ww"), strings.concat(
|
|
|
|
|
"package alpha_decl;\n",
|
|
|
|
|
"@test fn alpha_ok() void = { assert(value() == 3); };\n"));
|
|
|
|
|
writefile(strings.concat(beta, "/beta.ww"),
|
|
|
|
|
"package beta_decl;\nfn value() i32 = { return 4; };\n");
|
|
|
|
|
writefile(strings.concat(beta, "/beta_test.ww"), strings.concat(
|
|
|
|
|
"package beta_decl;\n",
|
|
|
|
|
"@test fn beta_ok() void = { assert(value() == 4); };\n"));
|
|
|
|
|
writefile(strings.concat(failed, "/failed.ww"),
|
|
|
|
|
"package failed_decl;\nfn value() i32 = { return 5; };\n");
|
|
|
|
|
writefile(strings.concat(failed, "/failed_test.ww"), strings.concat(
|
|
|
|
|
"package failed_decl;\n",
|
|
|
|
|
"@test fn runtime_failure() void = { assert(false); };\n"));
|
|
|
|
|
writefile(strings.concat(none, "/none.ww"),
|
|
|
|
|
"package none_decl;\nfn value() i32 = { return 6; };\n");
|
|
|
|
|
let persisttest: str = strings.concat(persist, "/persist_test.ww");
|
|
|
|
|
let persistbase: str = strings.concat(
|
|
|
|
|
"package persist_decl;\n",
|
|
|
|
|
"@test fn persistent_base() void = { assert(true); };\n");
|
|
|
|
|
let persistchanged: str = strings.concat(
|
|
|
|
|
"package persist_decl;\n",
|
|
|
|
|
"@test fn persistent_changed() void = { assert(1 + 1 == 2); };\n");
|
|
|
|
|
writefile(strings.concat(persist, "/persist.ww"),
|
|
|
|
|
"package persist_decl;\nfn value() i32 = { return 7; };\n");
|
|
|
|
|
writefile(persisttest, persistbase);
|
|
|
|
|
|
|
|
|
|
let compilerwrapper: str = strings.concat(root, "/publish-w6c.sh");
|
|
|
|
|
let linkerwrapper: str = strings.concat(root, "/publish-w6l.sh");
|
|
|
|
|
writeexecutable(compilerwrapper, strings.concat(
|
|
|
|
|
"#!/bin/sh\nprintf '%s\\n' \"$*\" >> \"$WW_PUBLISH_CTRACE\"\n",
|
|
|
|
|
"exec \"$WW_PUBLISH_REAL_C\" \"$@\"\n"));
|
|
|
|
|
writeexecutable(linkerwrapper, strings.concat(
|
|
|
|
|
"#!/bin/sh\nprintf '%s\\n' \"$*\" >> \"$WW_PUBLISH_LTRACE\"\n",
|
|
|
|
|
"if test -n \"$WW_PUBLISH_FAIL\"; then\n",
|
|
|
|
|
" for arg do case \"$arg\" in *\"$WW_PUBLISH_FAIL\"*)\n",
|
|
|
|
|
" printf 'injected publication linker failure\\n' >&2\n",
|
|
|
|
|
" exit 97;; esac; done\nfi\n",
|
|
|
|
|
"exec \"$WW_PUBLISH_REAL_L\" \"$@\"\n"));
|
|
|
|
|
let stages: []str = ["ww", "ww_ww"];
|
|
|
|
|
let compilers: []str = ["w6c", "w6c_ww"];
|
|
|
|
|
let linkers: []str = ["w6l", "w6l_ww"];
|
|
|
|
|
let tags: []str = ["c", "ww"];
|
|
|
|
|
let duplicatediag: str = "";
|
|
|
|
|
let rollbackdiag: str = "";
|
|
|
|
|
let missingdiag: str = "";
|
|
|
|
|
let occupieddiag: str = "";
|
|
|
|
|
let failurebytes: str = "";
|
|
|
|
|
let persistbasebytes: str = "";
|
|
|
|
|
let persistchangedbytes: str = "";
|
|
|
|
|
let baseenv: []str = os.getenvs();
|
|
|
|
|
let out: commandout;
|
|
|
|
|
let si: i32 = 0;
|
|
|
|
|
for (si < stages.len) {
|
|
|
|
|
let ctrace: str = strings.concat(root, "/publish-", tags[si],
|
|
|
|
|
"-w6c.trace");
|
|
|
|
|
let ltrace: str = strings.concat(root, "/publish-", tags[si],
|
|
|
|
|
"-w6l.trace");
|
|
|
|
|
writefile(ctrace, ""); writefile(ltrace, "");
|
|
|
|
|
let env: []str = alloc([], (baseenv.len + 7): u64)!;
|
|
|
|
|
let ei: i32 = 0;
|
|
|
|
|
for (ei < baseenv.len) {
|
|
|
|
|
if (!strings.hasprefix(baseenv[ei], "WW_W6C=")
|
|
|
|
|
&& !strings.hasprefix(baseenv[ei], "WW_W6L=")
|
|
|
|
|
&& !strings.hasprefix(baseenv[ei], "WW_PUBLISH_CTRACE=")
|
|
|
|
|
&& !strings.hasprefix(baseenv[ei], "WW_PUBLISH_LTRACE=")
|
|
|
|
|
&& !strings.hasprefix(baseenv[ei], "WW_PUBLISH_REAL_C=")
|
|
|
|
|
&& !strings.hasprefix(baseenv[ei], "WW_PUBLISH_REAL_L=")
|
|
|
|
|
&& !strings.hasprefix(baseenv[ei], "WW_PUBLISH_FAIL=")) {
|
|
|
|
|
append(env, baseenv[ei]);
|
|
|
|
|
};
|
|
|
|
|
ei += 1;
|
|
|
|
|
};
|
|
|
|
|
append(env, strings.concat("WW_W6C=", compilerwrapper));
|
|
|
|
|
append(env, strings.concat("WW_W6L=", linkerwrapper));
|
|
|
|
|
append(env, strings.concat("WW_PUBLISH_CTRACE=", ctrace));
|
|
|
|
|
append(env, strings.concat("WW_PUBLISH_LTRACE=", ltrace));
|
|
|
|
|
append(env, strings.concat("WW_PUBLISH_REAL_C=",
|
|
|
|
|
driver(compilers[si])));
|
|
|
|
|
append(env, strings.concat("WW_PUBLISH_REAL_L=",
|
|
|
|
|
driver(linkers[si])));
|
|
|
|
|
append(env, "WW_PUBLISH_FAIL=");
|
|
|
|
|
|
|
|
|
|
// Equal import leaves are rejected before tools or output creation,
|
|
|
|
|
// independent of their unequal declared package names.
|
|
|
|
|
let duplicateout: str = strings.concat(root, "/duplicate-output/");
|
|
|
|
|
let duplicateav: []str = [driver(stages[si]), "test", "-c",
|
|
|
|
|
"-j", "2", "-I", suite, "-o", duplicateout,
|
|
|
|
|
leftsame, rightsame];
|
|
|
|
|
runcommandenvdir(root, strings.concat("publish-duplicate-", tags[si]),
|
|
|
|
|
duplicateav, env, root,
|
|
|
|
|
(60i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 1);
|
|
|
|
|
assert(out.stdout.len == 0);
|
|
|
|
|
assert(has(out.stderr,
|
|
|
|
|
"ww test: cannot write test binary same.test for multiple packages:\n"));
|
|
|
|
|
assert(has(out.stderr, strings.concat(leftsame, "\n")));
|
|
|
|
|
assert(has(out.stderr, strings.concat(rightsame, "\n")));
|
|
|
|
|
assert(readfile(ctrace).len == 0 && readfile(ltrace).len == 0);
|
|
|
|
|
assert(!os.exists(duplicateout));
|
|
|
|
|
if (si == 0) { duplicatediag = strings.dup(out.stderr); }
|
|
|
|
|
else { assert(same(duplicatediag, out.stderr)); };
|
|
|
|
|
|
|
|
|
|
// /dev/null is Go's exact multi-package discard exception: both
|
|
|
|
|
// products build, neither publishes, and duplicate names are harmless.
|
|
|
|
|
let nullav: []str = [driver(stages[si]), "test", "-c", "-j", "2",
|
|
|
|
|
"-I", suite, "-o", "/dev/null", leftsame, rightsame];
|
|
|
|
|
runcommandenvdir(root, strings.concat("publish-null-", tags[si]),
|
|
|
|
|
nullav, env, root,
|
|
|
|
|
(120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(out.stdout.len == 0 && out.stderr.len == 0);
|
|
|
|
|
assert(readfile(ctrace).len != 0);
|
|
|
|
|
assert(occurrences(readfile(ltrace), "\n") == 2);
|
|
|
|
|
assert(!os.exists("/dev/null.new"));
|
|
|
|
|
|
|
|
|
|
// An occupied retained-binary stage is a pre-tool rejection. The
|
|
|
|
|
// caller's old destination and occupied stage both remain untouched.
|
|
|
|
|
let occupied: str = strings.concat(root, "/occupied");
|
|
|
|
|
if (si == 0) {
|
|
|
|
|
assert(os.mkdir(occupied, 448i32) == 0);
|
|
|
|
|
writefile(strings.concat(occupied, "/alpha.test"), "old-alpha\n");
|
|
|
|
|
writefile(strings.concat(occupied, "/alpha.test.new"),
|
|
|
|
|
"occupied-stage\n");
|
|
|
|
|
};
|
|
|
|
|
rewritefile(ctrace, ""); rewritefile(ltrace, "");
|
|
|
|
|
let occupiedav: []str = [driver(stages[si]), "test", "-c", "-I",
|
|
|
|
|
suite, "-o", strings.concat(occupied, "/"), alpha];
|
|
|
|
|
runcommandenvdir(root, strings.concat("publish-occupied-", tags[si]),
|
|
|
|
|
occupiedav, env, root,
|
|
|
|
|
(60i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 1);
|
|
|
|
|
assert(has(out.stderr, strings.concat(
|
|
|
|
|
"ww: product staging path already exists: ", occupied,
|
|
|
|
|
"/alpha.test.new\n")));
|
|
|
|
|
assert(same(readfile(strings.concat(occupied, "/alpha.test")),
|
|
|
|
|
"old-alpha\n"));
|
|
|
|
|
assert(same(readfile(strings.concat(occupied, "/alpha.test.new")),
|
|
|
|
|
"occupied-stage\n"));
|
|
|
|
|
assert(readfile(ctrace).len == 0 && readfile(ltrace).len == 0);
|
|
|
|
|
if (si == 0) { occupieddiag = strings.dup(out.stderr); }
|
|
|
|
|
else { assert(same(occupieddiag, out.stderr)); };
|
|
|
|
|
|
|
|
|
|
// Link failure after an earlier sibling has staged a retained copy
|
|
|
|
|
// rejects the whole request and preserves every old destination.
|
|
|
|
|
let rollback: str = strings.concat(root, "/rollback-", tags[si]);
|
|
|
|
|
assert(os.mkdir(rollback, 448i32) == 0);
|
|
|
|
|
writefile(strings.concat(rollback, "/alpha.test"), "alpha-sentinel\n");
|
|
|
|
|
writefile(strings.concat(rollback, "/beta.test"), "beta-sentinel\n");
|
|
|
|
|
rewritefile(ctrace, ""); rewritefile(ltrace, "");
|
|
|
|
|
env[env.len - 1] = "WW_PUBLISH_FAIL=beta-test-main";
|
|
|
|
|
let rollbackav: []str = [driver(stages[si]), "test", "-c", "-j",
|
|
|
|
|
"1", "-I", suite, "-o", strings.concat(rollback, "/"),
|
|
|
|
|
alpha, beta];
|
|
|
|
|
runcommandenvdir(root, strings.concat("publish-rollback-", tags[si]),
|
|
|
|
|
rollbackav, env, root,
|
|
|
|
|
(120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 1);
|
|
|
|
|
assert(has(out.stderr, "injected publication linker failure\n"));
|
|
|
|
|
assert(has(out.stderr, "ww: w6l failed\n"));
|
|
|
|
|
assert(same(readfile(strings.concat(rollback, "/alpha.test")),
|
|
|
|
|
"alpha-sentinel\n"));
|
|
|
|
|
assert(same(readfile(strings.concat(rollback, "/beta.test")),
|
|
|
|
|
"beta-sentinel\n"));
|
|
|
|
|
assert(!directoryhasnew(rollback));
|
|
|
|
|
assert(occurrences(readfile(ltrace), "\n") == 2);
|
|
|
|
|
if (si == 0) { rollbackdiag = strings.dup(out.stderr); }
|
|
|
|
|
else { assert(same(rollbackdiag, out.stderr)); };
|
|
|
|
|
|
|
|
|
|
// Output directories minted for a rejected request are rolled back.
|
|
|
|
|
let missingroot: str = strings.concat(root, "/missing-", tags[si]);
|
|
|
|
|
let missingout: str = strings.concat(missingroot, "/nested/");
|
|
|
|
|
rewritefile(ctrace, ""); rewritefile(ltrace, "");
|
|
|
|
|
env[env.len - 1] = "WW_PUBLISH_FAIL=alpha-test-main";
|
|
|
|
|
let missingav: []str = [driver(stages[si]), "test", "-c", "-j",
|
|
|
|
|
"1", "-I", suite, "-o", missingout, alpha];
|
|
|
|
|
runcommandenvdir(root, strings.concat("publish-missing-", tags[si]),
|
|
|
|
|
missingav, env, root,
|
|
|
|
|
(120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 1);
|
|
|
|
|
assert(!os.exists(missingroot));
|
|
|
|
|
assert(occurrences(readfile(ltrace), "\n") == 1);
|
|
|
|
|
if (si == 0) { missingdiag = strings.dup(out.stderr); }
|
|
|
|
|
else { assert(same(missingdiag, out.stderr)); };
|
|
|
|
|
|
|
|
|
|
// A package with no tests never claims a binary or creates a requested
|
|
|
|
|
// output hierarchy, although its production package is still checked.
|
|
|
|
|
let noneroot: str = strings.concat(root, "/none-output-", tags[si]);
|
|
|
|
|
let noneav: []str = [driver(stages[si]), "test", "-c", "-I", suite,
|
|
|
|
|
"-o", strings.concat(noneroot, "/nested/"), none];
|
|
|
|
|
env[env.len - 1] = "WW_PUBLISH_FAIL=";
|
|
|
|
|
runcommandenvdir(root, strings.concat("publish-none-", tags[si]),
|
|
|
|
|
noneav, env, root,
|
|
|
|
|
(60i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(has(out.stdout, strings.concat("? ", none,
|
|
|
|
|
" [no tests]\n")));
|
|
|
|
|
assert(out.stderr.len == 0 && !os.exists(noneroot));
|
|
|
|
|
|
|
|
|
|
// Publication commits before execution. A failing test therefore leaves
|
|
|
|
|
// a runnable retained binary while its product failure stays on stdout.
|
|
|
|
|
let failurebin: str = strings.concat(root, "/failure-", tags[si],
|
|
|
|
|
".test");
|
|
|
|
|
let failureav: []str = [driver(stages[si]), "test", "-I", suite,
|
|
|
|
|
"-o", failurebin, failed];
|
|
|
|
|
runcommandenvdir(root, strings.concat("publish-runtime-", tags[si]),
|
|
|
|
|
failureav, env, root,
|
|
|
|
|
(60i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 1);
|
|
|
|
|
assert(os.exists(failurebin) && !os.exists(strings.concat(failurebin,
|
|
|
|
|
".new")));
|
|
|
|
|
assert(has(out.stdout,
|
|
|
|
|
"failed_decl.runtime_failure ... FAIL (exit 1)\n"));
|
|
|
|
|
assert(out.stderr.len == 0);
|
|
|
|
|
let fi: os.filestat;
|
|
|
|
|
match (os.stat(&fi, failurebin)) {
|
|
|
|
|
case void => void;
|
|
|
|
|
case let e: os.oserror => abort("retained failure binary missing");
|
|
|
|
|
};
|
|
|
|
|
assert(((fi.mode: u32) & 73u32) != 0u32);
|
|
|
|
|
if (si == 0) { failurebytes = readfile(failurebin); }
|
|
|
|
|
else { assert(same(failurebytes, readfile(failurebin))); };
|
|
|
|
|
|
|
|
|
|
// -w keeps semantic actions persistent while -o remains a presentation
|
|
|
|
|
// copy. Unchanged input reuses actions; changed input replaces the copy.
|
|
|
|
|
rewritefile(persisttest, persistbase);
|
|
|
|
|
let persistwork: str = strings.concat(root, "/persist-work-", tags[si]);
|
|
|
|
|
let persistbin: str = strings.concat(root, "/persist.test");
|
|
|
|
|
if (os.exists(persistbin)) { clean(persistbin); };
|
|
|
|
|
rewritefile(ctrace, ""); rewritefile(ltrace, "");
|
|
|
|
|
let persistav: []str = [driver(stages[si]), "test", "-w",
|
|
|
|
|
persistwork, "-I", suite, "-o", persistbin, persist];
|
|
|
|
|
runcommandenvdir(root, strings.concat("publish-persist-cold-", tags[si]),
|
|
|
|
|
persistav, env, root,
|
|
|
|
|
(120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(has(out.stdout, "persistent_base ... ok\n"));
|
|
|
|
|
let basebytes: str = readfile(persistbin);
|
|
|
|
|
if (si == 0) { persistbasebytes = strings.dup(basebytes); }
|
|
|
|
|
else { assert(same(persistbasebytes, basebytes)); };
|
|
|
|
|
rewritefile(ctrace, ""); rewritefile(ltrace, "");
|
|
|
|
|
runcommandenvdir(root, strings.concat("publish-persist-warm-", tags[si]),
|
|
|
|
|
persistav, env, root,
|
|
|
|
|
(120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(readfile(ctrace).len == 0);
|
|
|
|
|
assert(same(basebytes, readfile(persistbin)));
|
|
|
|
|
rewritefile(persisttest, persistchanged);
|
|
|
|
|
rewritefile(ctrace, ""); rewritefile(ltrace, "");
|
|
|
|
|
runcommandenvdir(root, strings.concat("publish-persist-change-", tags[si]),
|
|
|
|
|
persistav, env, root,
|
|
|
|
|
(120i64 * (time.second: i64)): time.duration, &out);
|
|
|
|
|
expectexit(&out, 0);
|
|
|
|
|
assert(has(out.stdout, "persistent_changed ... ok\n"));
|
|
|
|
|
assert(readfile(ctrace).len != 0);
|
|
|
|
|
let changedbytes: str = readfile(persistbin);
|
|
|
|
|
assert(!same(basebytes, changedbytes));
|
|
|
|
|
if (si == 0) { persistchangedbytes = strings.dup(changedbytes); }
|
|
|
|
|
else { assert(same(persistchangedbytes, changedbytes)); };
|
|
|
|
|
assert(!directoryhasnew(persistwork));
|
|
|
|
|
si += 1;
|
|
|
|
|
};
|
|
|
|
|
assert(os.remove(strings.concat(root,
|
|
|
|
|
"/occupied/alpha.test.new")) == 0);
|
|
|
|
|
clean(root);
|
|
|
|
|
};
|
|
|
|
|
|