From f9252cf59c676b53539656bebb6b02b34c53412a Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Sun, 30 Aug 2026 12:52:21 -0700 Subject: [PATCH 01/10] Add codegen test corpus and native thumb test harness tests/thumb-test compiles programs to native ARM Thumb in-process against a captured micro:bit (mbcodal) CompileOptions fixture and asserts on the generated assembly listing; runs offline via gulp testthumb. lang-test0 gains three semantic files covering condition truthiness and lowering and interface dispatch (including both sides of the call-site-count thresholds that gate dispatch specialization), plus a deliberately disabled repro of the default-parameters-on-dynamic-dispatch defect and a coverage map (README-codegen.md) tying failure modes to tests and layers. --- gulpfile.js | 3 + .../lang-test0/54conditiontruthiness.ts | 195 +++++++ .../lang-test0/55conditionlowering.ts | 528 +++++++++++++++++ .../lang-test0/56ifacedispatch.ts | 552 ++++++++++++++++++ .../lang-test0/57defaultparamdispatch.ts | 57 ++ .../compile-test/lang-test0/README-codegen.md | 227 +++++++ tests/thumb-test/README.md | 105 ++++ tests/thumb-test/asmchecks.ts | 168 ++++++ tests/thumb-test/cases/boolbaseline.ts | 28 + tests/thumb-test/cases/ifacebaseline.ts | 71 +++ tests/thumb-test/cases/sizebaseline.ts | 45 ++ .../fixtures/microbit-mbcodal.json.gz | Bin 0 -> 488859 bytes tests/thumb-test/scripts/capture-fixture.js | 164 ++++++ tests/thumb-test/thumbrunner.ts | 137 +++++ tests/thumb-test/tsconfig.json | 31 + 15 files changed, 2311 insertions(+) create mode 100644 tests/compile-test/lang-test0/54conditiontruthiness.ts create mode 100644 tests/compile-test/lang-test0/55conditionlowering.ts create mode 100644 tests/compile-test/lang-test0/56ifacedispatch.ts create mode 100644 tests/compile-test/lang-test0/57defaultparamdispatch.ts create mode 100644 tests/compile-test/lang-test0/README-codegen.md create mode 100644 tests/thumb-test/README.md create mode 100644 tests/thumb-test/asmchecks.ts create mode 100644 tests/thumb-test/cases/boolbaseline.ts create mode 100644 tests/thumb-test/cases/ifacebaseline.ts create mode 100644 tests/thumb-test/cases/sizebaseline.ts create mode 100644 tests/thumb-test/fixtures/microbit-mbcodal.json.gz create mode 100644 tests/thumb-test/scripts/capture-fixture.js create mode 100644 tests/thumb-test/thumbrunner.ts create mode 100644 tests/thumb-test/tsconfig.json diff --git a/gulpfile.js b/gulpfile.js index 23397439b2e4..d58a2f3fe736 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -735,6 +735,7 @@ const lint = lintWithEslint const testdecompiler = testTask("decompile-test", "decompilerunner.js"); const testlang = testTask("compile-test", "compilerunner.js"); +const testthumb = testTask("thumb-test", "thumbrunner.js"); const testhelpers = testTask("helpers-test", "helperrunner.js"); const testerr = testTask("errors-test", "errorrunner.js"); const testfmt = testTask("format-test", "formatrunner.js"); @@ -772,6 +773,7 @@ const browserifyBlocksPrep = () => const testAll = gulp.series( testdecompiler, testlang, + testthumb, testhelpers, testerr, testfmt, @@ -884,6 +886,7 @@ exports.updatestrings = updatestrings; exports.lint = lint exports.testdecompiler = testdecompiler; exports.testlang = testlang; +exports.testthumb = testthumb; exports.testerr = testerr; exports.testfmt = testfmt; exports.testpydecomp = testpydecomp; diff --git a/tests/compile-test/lang-test0/54conditiontruthiness.ts b/tests/compile-test/lang-test0/54conditiontruthiness.ts new file mode 100644 index 000000000000..319c871f9ba3 --- /dev/null +++ b/tests/compile-test/lang-test0/54conditiontruthiness.ts @@ -0,0 +1,195 @@ +// Truthiness matrix for every construct that lowers to a condition test. +// +// The falsy set here is exactly the set numops::toBool treats as false: +// false, 0 (any representation, including -0 and a boxed double zero), null, +// undefined, NaN and "". Everything else is truthy, including "0", " ", +// "false", [], {} and function values. +// +// Every value reaches its condition through an any-typed identity call so the +// test site sees an opaque operand and cannot be folded at compile time. + +namespace CondTruth { + function opaque(v: any): any { + return v + } + + function opaqueStr(v: string): string { + return v + } + + function opaqueNum(v: number): number { + return v + } + + function opaqueArr(v: number[]): number[] { + return v + } + + class TCase { + v: any + t: boolean + id: string + constructor(v: any, t: boolean, id: string) { + this.v = v + this.t = t + this.id = id + } + } + + // Pushes one value through every construct that lowers to a condition. + function check(c: TCase) { + const v = opaque(c.v) + const want = c.t + + // plain `if` condition + let hit = false + if (v) hit = true + assert(hit == want, "if:" + c.id) + + // `if (!v)` -- the negated condition, which lowers to the inverted jump + let nhit = false + if (!v) nhit = true + assert(nhit == !want, "ifnot:" + c.id) + + // else branch of the same test must be the complement + let branch = 0 + if (v) branch = 1 + else branch = 2 + assert(branch == (want ? 1 : 2), "ifelse:" + c.id) + + // conditional expression + const t = v ? 11 : 22 + assert(t == (want ? 11 : 22), "ternary:" + c.id) + + // `while` header, body entered at most once + let iter = 0 + while (v) { + iter++ + break + } + assert(iter == (want ? 1 : 0), "while:" + c.id) + + // `do..while` runs the body once and only then tests the condition + let dit = 0 + do { + dit++ + } while (v && dit < 2) + assert(dit == (want ? 2 : 1), "dowhile:" + c.id) + + // `for` header condition + let fit = 0 + for (; v;) { + fit++ + break + } + assert(fit == (want ? 1 : 0), "for:" + c.id) + + // condition-position && : truth of the pair, never the operand value + let andHit = false + if (v && true) andHit = true + assert(andHit == want, "and1:" + c.id) + let andZero = false + if (v && false) andZero = true + assert(andZero == false, "and0:" + c.id) + + // condition-position || + let orHit = false + if (v || false) orHit = true + assert(orHit == want, "or0:" + c.id) + let orOne = false + if (v || true) orOne = true + assert(orOne == true, "or1:" + c.id) + + // double negation must yield a real tagged boolean, comparable strictly + const b = !!v + assert(b === want, "bangbang:" + c.id) + assert(typeof b == "boolean", "bangbangtype:" + c.id) + + // single negation is also a real boolean + const nb = !v + assert(nb === !want, "bang:" + c.id) + } + + export function run() { + msg("condition truthiness") + + const zero = opaqueNum(0) + const one = opaqueNum(1) + + const cases: TCase[] = [] + function add(v: any, t: boolean, id: string) { + cases.push(new TCase(v, t, id)) + } + + // --- falsy --- + add(false, false, "false") + add(zero, false, "zero") + add(zero * -1, false, "negzero") + add(null, false, "null") + add(undefined, false, "undefined") + add(zero / zero, false, "nan") + add(opaqueStr(""), false, "emptystr") + + // --- truthy --- + add(true, true, "true") + add(one, true, "one") + add(zero - one, true, "minusone") + // forced past the tagged-int range, so the value is a boxed double + add(0x20000000 * (one + one), true, "bigint") + add(opaqueStr("0"), true, "str0") + add(opaqueStr(" "), true, "space") + add(opaqueStr("false"), true, "strfalse") + add(opaqueStr("00"), true, "str00") + add([], true, "emptyarr") + add([zero], true, "zeroarr") + add({}, true, "emptyobj") + add({ a: zero }, true, "obj") + add(() => zero, true, "fn") + + // Doubles only exist on floating-point targets; a boxed zero and a + // fractional nonzero both go through the boxed side of the falsy test. + if (hasFloat) { + const big = opaqueNum(1e18) + add(big - big, false, "boxedzero") + add(opaqueNum(0.5) - opaqueNum(0.25), true, "fraction") + add(opaqueNum(-0.5), true, "negfraction") + } + + for (const c of cases) check(c) + + assert(cases.length == (hasFloat ? 23 : 20), "casecount") + + // The same values reaching a condition through a non-any local, so the + // condition sees a statically typed operand rather than a boxed any. + const es = opaqueStr("") + assert(!es, "typed:emptystr") + const ns = opaqueStr("x") + assert(!!ns, "typed:str") + const nz = opaqueNum(0) + assert(!nz, "typed:zero") + const nn = opaqueNum(3) + assert(!!nn, "typed:num") + const na = opaqueArr(null) + assert(!na, "typed:nullarr") + const ea = opaqueArr([]) + assert(!!ea, "typed:emptyarr") + + // A boolean-typed local is already 0/1 in the lowered form; it must + // still compare strictly and survive a round trip through a call. + function passBool(b: boolean): boolean { + return b + } + const bt = passBool(!!ns) + const bf = passBool(!!es) + assert(bt === true, "roundtrip:true") + assert(bf === false, "roundtrip:false") + let rhit = 0 + if (bt) rhit++ + if (bf) rhit += 10 + assert(rhit == 1, "roundtrip:cond") + + msg("condition truthiness done") + } +} + +CondTruth.run() diff --git a/tests/compile-test/lang-test0/55conditionlowering.ts b/tests/compile-test/lang-test0/55conditionlowering.ts new file mode 100644 index 000000000000..a32fac828064 --- /dev/null +++ b/tests/compile-test/lang-test0/55conditionlowering.ts @@ -0,0 +1,528 @@ +// Structural semantics of condition lowering: evaluation order and counts for +// &&/||/!, the difference between condition position and value position, every +// syntactic construct that takes a condition, comparisons feeding logical +// operators, freshly allocated operands re-evaluated in loop headers, and +// exceptions raised part way through a condition. + +namespace CondLower { + let lg = "" + + function reset() { + lg = "" + } + + // Each operand records that it ran, then yields the requested truth value, + // so `lg` is the exact left-to-right evaluation trace of a condition. + function A(r: boolean): boolean { + lg += "A" + return r + } + + function B(r: boolean): boolean { + lg += "B" + return r + } + + function C(r: boolean): boolean { + lg += "C" + return r + } + + function D(r: boolean): boolean { + lg += "D" + return r + } + + // --- short-circuit order and operand counts ------------------------- + + function testShortCircuit() { + msg("short circuit") + + // && stops at the first falsy operand + reset() + let r = A(true) && B(false) + assert(lg == "AB", "sc:and:both") + assert(r === false, "sc:and:bothv") + + reset() + r = A(false) && B(true) + assert(lg == "A", "sc:and:short") + assert(r === false, "sc:and:shortv") + + // || stops at the first truthy operand + reset() + r = A(true) || B(true) + assert(lg == "A", "sc:or:short") + assert(r === true, "sc:or:shortv") + + reset() + r = A(false) || B(true) + assert(lg == "AB", "sc:or:both") + assert(r === true, "sc:or:bothv") + + // nested group: the right operand of && is itself a || + reset() + let hit = false + if (A(true) && (B(false) || C(true))) hit = true + assert(lg == "ABC", "sc:group1") + assert(hit, "sc:group1v") + + reset() + hit = false + if (A(false) && (B(true) || C(true))) hit = true + assert(lg == "A", "sc:group2") + assert(!hit, "sc:group2v") + + reset() + hit = false + if (A(true) && (B(true) || C(true))) hit = true + assert(lg == "AB", "sc:group3") + assert(hit, "sc:group3v") + + // negation wrapped around a short-circuit chain + reset() + r = !(A(true) && !B(true)) + assert(lg == "AB", "sc:notand1") + assert(r === true, "sc:notand1v") + + reset() + r = !(A(true) && !B(false)) + assert(lg == "AB", "sc:notand2") + assert(r === false, "sc:notand2v") + + reset() + r = !(A(false) && !B(true)) + assert(lg == "A", "sc:notand3") + assert(r === true, "sc:notand3v") + + // chains of three and four operands + reset() + hit = false + if (A(true) && B(true) && C(false)) hit = true + assert(lg == "ABC", "sc:and3") + assert(!hit, "sc:and3v") + + reset() + hit = false + if (A(true) && B(false) && C(true)) hit = true + assert(lg == "AB", "sc:and3short") + + reset() + hit = false + if (A(true) || B(true) || C(true)) hit = true + assert(lg == "A", "sc:or3short") + assert(hit, "sc:or3shortv") + + reset() + hit = false + if (A(false) || B(false) || C(true)) hit = true + assert(lg == "ABC", "sc:or3") + assert(hit, "sc:or3v") + + reset() + hit = false + if (A(true) && B(true) && C(true) && D(false)) hit = true + assert(lg == "ABCD", "sc:and4") + assert(!hit, "sc:and4v") + + // mixed precedence: && binds tighter than || + reset() + hit = false + if (A(false) && B(true) || C(true)) hit = true + assert(lg == "AC", "sc:mixed1") + assert(hit, "sc:mixed1v") + + reset() + hit = false + if (A(true) && B(true) || C(true)) hit = true + assert(lg == "AB", "sc:mixed2") + assert(hit, "sc:mixed2v") + } + + // --- value position vs condition position --------------------------- + + function testValuePosition() { + msg("value position") + + // In value position || yields the operand itself, not a 0/1 truth. + const fb = "f" + "b" + const empty = "" + "" + let s: string = empty || fb + assert(s == "fb", "vp:orstr") + s = fb || "other" + assert(s == "fb", "vp:orstr2") + + let calls = 0 + function f(): number { + calls++ + return 7 + } + + // && in value position yields the falsy left operand, right not run + const z = 0 + let n: number = z && f() + assert(n === 0, "vp:andnum") + assert(calls == 0, "vp:andnocall") + + // and the right operand when the left is truthy + const five = 5 + n = five && f() + assert(n == 7, "vp:andnum2") + assert(calls == 1, "vp:andcall") + + const nine = 9 + n = five || nine + assert(n == 5, "vp:ornum") + + // ! always yields a real boolean, comparable strictly + let b = !empty + assert(b === true, "vp:bangempty") + b = !fb + assert(b === false, "vp:bangstr") + assert(!!fb === true, "vp:bangbang") + assert(typeof !fb == "boolean", "vp:bangtype") + + // a boolean stored, passed through a call, then used as a condition: + // this round-trips the raw 0/1 form back to a tagged boolean + function takes(v: boolean): boolean { + return v + } + const stored = !empty + const returned = takes(stored) + assert(returned === true, "vp:rt1") + let hit = 0 + if (returned) hit++ + if (takes(!fb)) hit += 10 + assert(hit == 1, "vp:rt2") + + // the same value observed as an any + const anyb: any = returned + assert(anyb === true, "vp:rtany") + assert(!!anyb === true, "vp:rtanybang") + } + + // --- every construct that takes a condition ------------------------- + + function classify(n: number): string { + if (n < 0) return "neg" + else if (n == 0) return "zero" + else if (n < 10) return "small" + else return "big" + } + + function testConstructs() { + msg("condition constructs") + + assert(classify(-3) == "neg", "cc:if1") + assert(classify(0) == "zero", "cc:if2") + assert(classify(5) == "small", "cc:if3") + assert(classify(50) == "big", "cc:if4") + + // while + let i = 0 + let acc = 0 + while (i < 5 && acc < 100) { + acc += i + i++ + } + assert(i == 5 && acc == 10, "cc:while") + + // do..while, body always runs once + let j = 100 + let runs = 0 + do { + runs++ + } while (j < 5) + assert(runs == 1, "cc:dowhile") + + j = 0 + runs = 0 + do { + runs++ + j++ + } while (j < 4 || runs < 2) + assert(j == 4 && runs == 4, "cc:dowhile2") + + // for with a compound header condition + let k = 0 + let sum2 = 0 + for (k = 0; k < 10 && sum2 < 12; k++) sum2 += k + assert(k == 6 && sum2 == 15, "cc:for") + + // nested ternaries + function grade(n: number): string { + return n > 90 ? "a" : n > 80 ? "b" : n > 70 ? "c" : "f" + } + assert(grade(95) == "a", "cc:tern1") + assert(grade(85) == "b", "cc:tern2") + assert(grade(75) == "c", "cc:tern3") + assert(grade(5) == "f", "cc:tern4") + + // ternary whose branches are themselves conditions + const t = (1 < 2) ? (3 > 4) : (5 > 6) + assert(t === false, "cc:tern5") + } + + // --- comparisons feeding logical operators -------------------------- + + function testComparisons() { + msg("comparisons") + + const a = 1 + const b = 2 + const c = 4 + const d = 3 + + assert((a < b && c > d) === true, "cmp:1") + assert((a > b && c > d) === false, "cmp:2") + assert((a > b || c > d) === true, "cmp:3") + assert((a > b || c < d) === false, "cmp:4") + + const x = "x" + "y" + const y = "xy" + const p: number = 1 + const q: number = 2 + assert((x == y || p != q) === true, "cmp:5") + assert((x != y && p == q) === false, "cmp:6") + + // string relational comparisons inside a chain + const s1 = "a" + "" + const s2 = "b" + "" + assert((s1 < s2 && s2 > s1) === true, "cmp:str1") + assert((s1 > s2 || s1 == s2) === false, "cmp:str2") + assert((s1 <= s1 && s2 >= s2) === true, "cmp:str3") + assert((s1 < s2 && s1.length > 0 && s2 != "") === true, "cmp:str4") + + // comparison result stored and re-tested + const cmp = s1 < s2 + assert(cmp === true, "cmp:store") + let hit = 0 + if (cmp && a < b) hit++ + assert(hit == 1, "cmp:retest") + + // arr.length directly as a condition and inside chains + const empty: number[] = [] + const full = [1, 2, 3] + assert(!empty.length, "cmp:len0") + assert(!!full.length, "cmp:len1") + let lh = 0 + if (empty.length) lh += 100 + if (full.length) lh += 1 + if (full.length && !empty.length) lh += 10 + if (empty.length || full.length) lh += 1000 + assert(lh == 1011, "cmp:lenchain") + } + + // --- freshly allocated operands re-evaluated in loop headers --------- + // + // Each iteration allocates the value the condition tests, so an + // imbalanced reference count on the condition path shows up as a GC + // failure or a wrong final state rather than as a wrong first iteration. + + function testFreshOperands() { + msg("fresh operands"); + + let s = "x" + let i = 0 + while ((s + i).length < 8) { + i++ + s = s + "y" + } + assert(s.length == 7, "fresh:concat") + assert(i == 6, "fresh:concatn") + + // array literal built in the loop header + let n = 0 + while ([n, n + 1].length > 0 && n < 200) n++ + assert(n == 200, "fresh:arrlit") + + // slices built in the header and in the body + const base = [1, 2, 3, 4, 5] + let k = 0 + let seen = 0 + while (base.slice(0, (k % 5) + 1).length > 0 && k < 300) { + seen += base.slice(k % 5).length + k++ + } + assert(k == 300, "fresh:slicek") + assert(seen == 900, "fresh:slicelen") + + // fresh object in a condition, in both operand positions of || + let m = 0 + while (({ v: m }).v < 150 || m < 0) m++ + assert(m == 150, "fresh:obj") + + // fresh string compared in a do..while + let c = 0 + do { + c++ + } while (("s" + c) != "s50") + assert(c == 50, "fresh:strcmp") + + // ternary over a freshly built array, repeated + let tsum = 0 + for (let q = 0; q < 200; q++) tsum += [q].length ? 1 : 0 + assert(tsum == 200, "fresh:tern") + } + + // --- exceptions raised part way through a condition ----------------- + + function testExceptionsInConditions() { + msg("exceptions in conditions") + + function t(): boolean { + lg += "t" + return false + } + + function boom(): boolean { + lg += "!" + throw "boom" + } + + // throw from the right operand of || (left already evaluated) + reset() + let caught = "" + try { + if (t() || boom()) lg += "?" + lg += "after" + } catch (e) { + caught = e + lg += "c" + } + assert(lg == "t!c", "exn:right " + lg) + assert(caught == "boom", "exn:rightval") + + // throw from the left operand: the right operand must never run + reset() + caught = "" + try { + if (boom() || t()) lg += "?" + } catch (e) { + caught = e + lg += "c" + } + assert(lg == "!c", "exn:left " + lg) + assert(caught == "boom", "exn:leftval") + + // throw from the right operand of && + reset() + try { + if (A(true) && boom()) lg += "?" + } catch (e) { + lg += "c" + } + assert(lg == "A!c", "exn:and " + lg) + + // && short-circuits before the throwing operand, so nothing is caught + reset() + let ok = false + try { + if (A(false) && boom()) lg += "?" + ok = true + } catch (e) { + lg += "c" + } + assert(lg == "A", "exn:andshort " + lg) + assert(ok, "exn:andshortok") + + // conditions still behave after the stack has been unwound + reset() + let hit = 0 + if (A(true) && B(true)) hit++ + if (A(false) || B(true)) hit += 10 + assert(hit == 11, "exn:after") + assert(lg == "ABAB", "exn:afterlog " + lg) + + // throw from inside a loop header condition + let iters = 0 + caught = "" + try { + while (iters < 10) { + iters++ + if (iters > 3 && boom()) iters += 100 + } + } catch (e) { + caught = e + } + assert(iters == 4, "exn:loop") + assert(caught == "boom", "exn:loopval") + } + + // --- switch over computed scrutinees -------------------------------- + + function testSwitch() { + msg("switch") + + function pick(s: string): number { + switch (s) { + case "a" + "": + case "b": + return 12 + case "c": + return 3 + default: + return 0 + } + } + assert(pick("a") == 12, "sw:s1") + assert(pick("b") == 12, "sw:s2") + assert(pick("c") == 3, "sw:s3") + assert(pick("z") == 0, "sw:s4") + + // fallthrough that accumulates rather than returning + function acc(n: number): string { + let r = "" + switch (n) { + case 0: + r += "0" + case 1: + r += "1" + break + case 2: + r += "2" + default: + r += "d" + } + return r + } + assert(acc(0) == "01", "sw:n0") + assert(acc(1) == "1", "sw:n1") + assert(acc(2) == "2d", "sw:n2") + assert(acc(9) == "d", "sw:n3") + + // computed scrutinee, so the switch cannot be resolved statically + let base = 0 + function bump(): number { + base += 2 + return base + } + assert(acc(bump() - 2) == "01", "sw:c0") + assert(acc(bump() - 3) == "1", "sw:c1") + + // switch whose scrutinee is a condition result + function fromBool(b: boolean): string { + switch (b ? "y" : "n") { + case "y": return "yes" + default: return "no" + } + } + const s1 = "a" + "" + assert(fromBool(!!s1) == "yes", "sw:b1") + assert(fromBool(!s1) == "no", "sw:b2") + } + + export function run() { + msg("condition lowering") + testShortCircuit() + testValuePosition() + testConstructs() + testComparisons() + testFreshOperands() + testExceptionsInConditions() + testSwitch() + msg("condition lowering done") + } +} + +CondLower.run() diff --git a/tests/compile-test/lang-test0/56ifacedispatch.ts b/tests/compile-test/lang-test0/56ifacedispatch.ts new file mode 100644 index 000000000000..ff278e06f373 --- /dev/null +++ b/tests/compile-test/lang-test0/56ifacedispatch.ts @@ -0,0 +1,552 @@ +// Interface dispatch semantics: dynamic member get/set/call through +// interface-typed, structurally typed and any-typed references. +// +// Interface member ids are global by name across the whole program, and some +// dispatch specializations are gated on how many static call sites a member +// has. Every member exercised here therefore carries a `qz` prefix that is +// unique to this file, and the call sites of the threshold-straddling members +// are counted deliberately: `qzLo` and `qzRare` sit below their thresholds, +// `qzHi`, `qzMany` and `qzHot` sit above. Both sides must behave identically. + +namespace IfaceDispatch { + + // --- threshold straddling ------------------------------------------- + + interface QzShape { + qzFew: number + qzMany: number + qzLo(n: number): number + qzHi(n: number): number + } + + class QzThing implements QzShape { + qzFew: number + qzMany: number + constructor(few: number, many: number) { + this.qzFew = few + this.qzMany = many + } + qzLo(n: number): number { + return n + 1 + } + qzHi(n: number): number { + return n + 2 + } + } + + // Within this function: qzLo is dispatched from 2 sites, qzHi from 5; + // qzFew is read at 4 sites and qzMany at 6. All of them go through an + // interface-typed reference, i.e. the checked/dynamic path. + // + // Call-site counts that feed the specialization thresholds are + // PROGRAM-WIDE per member name. qzHi and qzMany have additional sites in + // testAgreement and testDynamicGet, which keeps them above their gates; + // qzLo (2 total) and qzFew (4 total) have no sites outside this function + // and must stay below their gates (3 and 5). When editing this file, + // grep the member name before adding a call or read anywhere. + function testThresholds() { + msg("thresholds") + + const a: QzShape = new QzThing(1, 10) + const b: QzShape = new QzThing(2, 20) + + // qzLo: call site 1 and 2 + assert(a.qzLo(0) == 1, "th:lo1") + assert(b.qzLo(5) == 6, "th:lo2") + + // qzHi: call sites 1..5 + assert(a.qzHi(0) == 2, "th:hi1") + assert(b.qzHi(5) == 7, "th:hi2") + assert(a.qzHi(10) == 12, "th:hi3") + assert(b.qzHi(-2) == 0, "th:hi4") + let hisum = 0 + for (let i = 0; i < 4; i++) hisum += a.qzHi(i) + assert(hisum == 14, "th:hi5") + + // qzFew: read sites 1..4 + assert(a.qzFew == 1, "th:few1") + assert(b.qzFew == 2, "th:few2") + let fsum = a.qzFew + fsum += b.qzFew + assert(fsum == 3, "th:few34") + + // qzMany: read sites 1..6 + assert(a.qzMany == 10, "th:many1") + assert(b.qzMany == 20, "th:many2") + let msum = a.qzMany + b.qzMany + assert(msum == 30, "th:many34") + msum = msum - a.qzMany + assert(msum == 20, "th:many5") + msum = msum - b.qzMany + assert(msum == 0, "th:many6") + + // two receivers reaching the same proc through the same call site + assert(a.qzHi(3) == b.qzHi(3), "th:agree") + } + + // --- the same method through three kinds of reference ---------------- + + interface QzTriIface { + qzTri(n: number): number + } + + class QzTriImpl implements QzTriIface { + base: number + constructor(base: number) { + this.base = base + } + qzTri(n: number): number { + return this.base + n + } + } + + function testThreeRefs() { + msg("three refs") + + const concrete = new QzTriImpl(100) + const iface: QzTriIface = concrete + const dyn: any = concrete + + // concrete (static vtable call), interface (dynamic) and any (dynamic) + assert(concrete.qzTri(1) == 101, "tri:concrete") + assert(iface.qzTri(1) == 101, "tri:iface") + assert(dyn.qzTri(1) == 101, "tri:any") + assert(concrete.qzTri(2) == iface.qzTri(2), "tri:same1") + assert("" + iface.qzTri(3) == "" + dyn.qzTri(3), "tri:same2") + } + + // --- optional and defaulted parameters through an interface ---------- + // + // The emitter fills in a defaulted argument at the call site from the + // statically known signature. Through an interface- or any-typed + // reference there is no such signature, so an omitted argument arrives as + // undefined and the callee's own default does not apply. What must hold + // is that the interface and any paths agree with each other, and that a + // callee written to test for undefined works on every path. + + interface QzOptIface { + qzOpt(a: number, b?: number): number + qzOptSafe(a: number, b?: number): number + } + + class QzOptImpl implements QzOptIface { + qzOpt(a: number, b = 5): number { + return a + b + } + qzOptSafe(a: number, b?: number): number { + if (b === undefined) b = 5 + return a + b + } + } + + function testDefaults() { + msg("defaults") + + const impl = new QzOptImpl() + const iface: QzOptIface = impl + const dyn: any = impl + + // a concrete call gets the default filled in at the call site + assert(impl.qzOpt(1) == 6, "opt:concrete") + + // explicit arguments behave the same on every path + assert(impl.qzOpt(1, 2) == 3, "opt:concrete2") + assert(iface.qzOpt(1, 2) == 3, "opt:iface2") + assert(dyn.qzOpt(1, 2) == 3, "opt:any2") + + // omitting the argument yields the same result on both dynamic paths + assert(("" + iface.qzOpt(1)) == ("" + dyn.qzOpt(1)), "opt:dynagree") + + // a callee that defaults explicitly works everywhere + assert(impl.qzOptSafe(1) == 6, "opt:safe1") + assert(iface.qzOptSafe(1) == 6, "opt:safe2") + assert(dyn.qzOptSafe(1) == 6, "opt:safe3") + assert(iface.qzOptSafe(1, 2) == 3, "opt:safe4") + } + + // --- one member name, two unrelated interfaces, different arities ----- + + interface QzOneArg { + qzShared(a: number): number + } + + interface QzTwoArg { + qzShared(a: number, b: number): number + } + + class QzOneImpl implements QzOneArg { + qzShared(a: number): number { + return a + 1 + } + } + + class QzTwoImpl implements QzTwoArg { + qzShared(a: number, b: number): number { + return a * b + } + } + + function testArityCollision() { + msg("arity collision") + + const one: QzOneArg = new QzOneImpl() + const two: QzTwoArg = new QzTwoImpl() + + assert(one.qzShared(1) == 2, "ar:one1") + assert(one.qzShared(9) == 10, "ar:one2") + assert(two.qzShared(3, 4) == 12, "ar:two1") + assert(two.qzShared(5, 6) == 30, "ar:two2") + + // interleaved, so neither dispatch can be hoisted into the other + let acc = 0 + for (let i = 1; i <= 3; i++) { + acc += one.qzShared(i) + acc += two.qzShared(i, i) + } + assert(acc == 23, "ar:mixed") + } + + // --- one member name used as a property get and as a method ---------- + + interface QzCollGet { + qzColl: number + } + + interface QzCollCall { + qzColl(a: number, b: number): number + } + + class QzCollField implements QzCollGet { + qzColl: number + constructor() { + this.qzColl = 42 + } + } + + class QzCollMethod implements QzCollCall { + qzColl(a: number, b: number): number { + return a * b + } + } + + function testGetCallCollision() { + msg("get/call collision") + + const g: QzCollGet = new QzCollField() + const c: QzCollCall = new QzCollMethod() + + assert(g.qzColl == 42, "gc:get1") + assert(c.qzColl(6, 7) == 42, "gc:call1") + assert(g.qzColl == c.qzColl(2, 21), "gc:agree") + + const ga: any = g + const ca: any = c + assert(ga.qzColl == 42, "gc:get2") + assert(ca.qzColl(3, 14) == 42, "gc:call2") + assert(typeof ca.qzColl == "function", "gc:type") + } + + // --- a method that is both interface-dispatched and used as a value --- + + interface QzTakeIface { + qzTake(n: number): number + } + + class QzTaker implements QzTakeIface { + mul: number + constructor(mul: number) { + this.mul = mul + } + qzTake(n: number): number { + return n * this.mul + } + } + + function testMethodAsValue() { + msg("method as value") + + const t = new QzTaker(3) + const iface: QzTakeIface = t + + // A bare method reference is not a value in this language; wrapping it + // in a lambda is the supported form. + const f = (n: number) => t.qzTake(n) + const g = (n: number) => iface.qzTake(n) + + assert(f(2) == 6, "mv:lambda") + assert(g(2) == 6, "mv:ifacelambda") + assert(iface.qzTake(2) == 6, "mv:direct") + + // the same proc reached through a higher order call + function apply(fn: (n: number) => number, n: number): number { + return fn(n) + } + assert(apply(f, 4) == 12, "mv:apply1") + assert(apply(g, 4) == 12, "mv:apply2") + assert(apply(n => iface.qzTake(n), 5) == 15, "mv:apply3") + } + + // --- polymorphic sites: class instances and object literals ----------- + + interface QzValIface { + qzVal(): number + } + + class QzValClass implements QzValIface { + n: number + constructor(n: number) { + this.n = n + } + qzVal(): number { + return this.n + } + } + + function useQzVal(v: QzValIface): number { + return v.qzVal() + 1 + } + + function testPolymorphic() { + msg("polymorphic"); + + // the same call site sees a class instance and an object literal + assert(useQzVal(new QzValClass(1)) == 2, "poly:class") + assert(useQzVal({ qzVal: () => 5 }) == 6, "poly:literal") + + const mixed: QzValIface[] = [ + new QzValClass(1), + { qzVal: () => 2 }, + new QzValClass(3), + { qzVal: () => 4 } + ] + const expected = [2, 3, 4, 5] + for (let i = 0; i < mixed.length; i++) + assert(useQzVal(mixed[i]) == expected[i], "poly:elem" + i) + + let total = 0 + for (const m of mixed) total += m.qzVal() + assert(total == 10, "poly:total") + } + + // --- toString override ----------------------------------------------- + + interface QzNamed { + toString(): string + } + + class QzLabel implements QzNamed { + id: number + constructor(id: number) { + this.id = id + } + toString(): string { + return "L" + this.id + } + } + + function testToString() { + msg("toString") + + const l = new QzLabel(7) + assert("" + l == "L7", "ts:concat") + assert(`${l}` == "L7", "ts:template") + assert(l.toString() == "L7", "ts:direct") + + const named: QzNamed = l + assert(named.toString() == "L7", "ts:iface") + + const dyn: any = l + assert(dyn.toString() == "L7", "ts:any") + assert("" + dyn == "L7", "ts:anyconcat") + + // in a condition, so the override result feeds a truth test + assert(!!("" + l), "ts:truthy") + assert(("" + l).length == 2, "ts:len") + } + + // --- stores through every dynamic path -------------------------------- + + interface QzRec { + // qzRare is never present in the initializer, so its only stores are + // the two explicit ones below + qzRare?: number + qzHot: number + } + + interface QzPropOnly { + qzProp: number + } + + class QzPropClass implements QzPropOnly { + qzProp: number + constructor() { + this.qzProp = 0 + } + } + + class QzAccClass { + _v: number + constructor() { + this._v = 0 + } + get qzAcc(): number { + return this._v + 1 + } + set qzAcc(v: number) { + this._v = v * 2 + } + } + + interface QzAccIface { + qzAcc: number + } + + class QzBase { + qzInherited: number + constructor() { + this.qzInherited = 1 + } + qzSuper(n: number): number { + return n + 1 + } + } + + class QzDerived extends QzBase { + constructor() { + super() + } + qzSuper(n: number): number { + return super.qzSuper(n) * 10 + } + } + + interface QzInheritedIface { + qzInherited: number + qzSuper(n: number): number + } + + function testStores() { + msg("stores") + + // Object literal STORE sites (the count the store specialization + // gates on): qzRare at 2 (below the gate of 3), qzHot at 4 store + // sites plus 2 initializers (above it). Reads of both keys also occur + // below but do not feed the store count. + const r1: QzRec = { qzHot: 0 } + const r2: QzRec = { qzHot: 0 } + r1.qzRare = 1 + r2.qzRare = 2 + r1.qzHot = 10 + r2.qzHot = 20 + r1.qzHot = r1.qzHot + 1 + r2.qzHot = r2.qzHot + 1 + assert(r1.qzRare == 1 && r2.qzRare == 2, "st:rare") + assert(r1.qzHot == 11 && r2.qzHot == 21, "st:hot") + + // store through an interface that only declares a property signature + const p: QzPropOnly = new QzPropClass() + p.qzProp = 5 + assert(p.qzProp == 5, "st:prop:class") + const pl: QzPropOnly = { qzProp: 0 } + pl.qzProp = 6 + assert(pl.qzProp == 6, "st:prop:literal") + + // accessor get/set reached through an interface-typed reference + const acc = new QzAccClass() + const ai: QzAccIface = acc + ai.qzAcc = 4 + assert(acc._v == 8, "st:acc:set") + assert(ai.qzAcc == 9, "st:acc:get") + ai.qzAcc = ai.qzAcc + 1 + assert(acc._v == 20, "st:acc:rmw") + + // a growing map: every key is built at run time + const grow: any = {} + for (let i = 0; i < 40; i++) grow["qzk" + i] = i * 3 + assert(grow["qzk0"] == 0, "st:grow0") + assert(grow["qzk7"] == 21, "st:grow7") + assert(grow["qzk39"] == 117, "st:grow39") + assert(grow["qzk" + (20 + 1)] == 63, "st:grow21") + let gsum = 0 + for (let i = 0; i < 40; i++) gsum += grow["qzk" + i] + assert(gsum == 2340, "st:growsum") + + // typed string index signature over a plain object literal + const tbl: { [k: string]: number } = {} + tbl["a"] = 1 + tbl["b"] = 2 + tbl["a"] = tbl["a"] + 10 + assert(tbl["a"] == 11 && tbl["b"] == 2, "st:idx:literal") + + // the same index-signature type pointing at a class instance: a store + // of a declared field must reach the field, not trap + const inst = new QzPropClass() + const asIdx = inst as any as { [k: string]: number } + asIdx["qzProp"] = 12 + assert(inst.qzProp == 12, "st:idx:class:set") + assert(asIdx["qzProp"] == 12, "st:idx:class:get") + asIdx["qzProp"] = asIdx["qzProp"] + 1 + assert(inst.qzProp == 13, "st:idx:class:rmw") + + // inherited field, through the subclass and through an interface + const d = new QzDerived() + assert(d.qzInherited == 1, "st:inh:init") + d.qzInherited = 3 + assert(d.qzInherited == 3, "st:inh:set") + const ii: QzInheritedIface = d + ii.qzInherited = 4 + assert(d.qzInherited == 4, "st:inh:ifaceset") + assert(ii.qzInherited == 4, "st:inh:ifaceget") + + // super call, direct and interface-dispatched + assert(d.qzSuper(1) == 20, "st:super:direct") + assert(ii.qzSuper(1) == 20, "st:super:iface") + + // class field store through a plain concrete reference, for contrast + const base = new QzBase() + base.qzInherited = 9 + assert(base.qzInherited == 9, "st:base") + assert(base.qzSuper(1) == 2, "st:base:call") + } + + // --- dynamic member get on an any-typed variable ----------------------- + + function testDynamicGet() { + msg("dynamic get") + + const o: any = { qzDyn: 5, qzOther: "s" } + const key = "qz" + "Dyn" + + assert(o.qzDyn == 5, "dg:dot") + assert(o["qzDyn"] == 5, "dg:literal") + assert(o[key] == 5, "dg:computed") + assert(o["qzMissing"] === undefined, "dg:missing") + assert(o.qzOther == "s", "dg:other") + + // the same object reached as a class instance + const inst: any = new QzThing(1, 2) + // qzMany rather than qzFew: qzFew's read-site count is deliberately + // held below its threshold by the block in testThresholds + assert(inst.qzMany == 2, "dg:inst1") + assert(inst["qzMany"] == 2, "dg:inst2") + assert(inst["qz" + "Many"] == 2, "dg:inst3") + assert(inst.qzHi(1) == 3, "dg:instcall") + } + + export function run() { + msg("iface dispatch") + testThresholds() + testThreeRefs() + testDefaults() + testArityCollision() + testGetCallCollision() + testMethodAsValue() + testPolymorphic() + testToString() + testStores() + testDynamicGet() + msg("iface dispatch done") + } +} + +IfaceDispatch.run() diff --git a/tests/compile-test/lang-test0/57defaultparamdispatch.ts b/tests/compile-test/lang-test0/57defaultparamdispatch.ts new file mode 100644 index 000000000000..1a5825738517 --- /dev/null +++ b/tests/compile-test/lang-test0/57defaultparamdispatch.ts @@ -0,0 +1,57 @@ +// Reproduces a known defect: default parameter values are not applied when a +// method is invoked through dynamic (interface or any-typed) dispatch. +// +// Mechanism: a statically resolved call site fills omitted arguments with the +// declared defaults, because the compiler can see the declaration. A dynamic +// call site pushes only the arguments written at the call, and the arity +// wrapper on the callee fills the missing slots with `undefined` -- the +// parameter initializer (`b = 5` below) never runs. The method then computes +// 1 + undefined = NaN. +// +// The assertions that fail today are commented out (block marked REPRO) so +// the suite stays green. To reproduce: uncomment that block and run +// `gulp testlang` -- qzdp:iface and qzdp:any fail with the calls yielding +// NaN instead of 6. A fix for the defect makes the REPRO block pass; it can +// then be uncommented permanently and the qzdp:agree assertion below retired. +// +// 56ifacedispatch.ts documents the same constraint where it affects the +// dispatch corpus; this file is the minimal standalone repro. + +interface DfShape { + dfOpt(a: number, b?: number): number; +} + +class DfThing implements DfShape { + constructor() { } + dfOpt(a: number, b = 5): number { + return a + b; + } +} + +function testDefaultParamDispatch() { + msg("default params through dynamic dispatch"); + + const direct = new DfThing(); + const viaIface: DfShape = direct; + const viaAny: any = direct; + + // Statically resolved call: the compiler applies the default. Passes. + assert(direct.dfOpt(1) == 6, "qzdp:direct"); + + // Passing the argument explicitly works on every path. + assert(direct.dfOpt(1, 2) == 3, "qzdp:direct2"); + assert(viaIface.dfOpt(1, 2) == 3, "qzdp:iface2"); + assert(viaAny.dfOpt(1, 2) == 3, "qzdp:any2"); + + // REPRO -- uncomment these two lines to surface the defect: + // assert(viaIface.dfOpt(1) == 6, "qzdp:iface"); + // assert(viaAny.dfOpt(1) == 6, "qzdp:any"); + + // Kept active so any CHANGE in the current behavior is noticed: the two + // dynamic paths must at least agree with each other. Compared as strings + // so this holds both before a fix (NaN == NaN fails as numbers) and + // after one. + assert("" + viaIface.dfOpt(1) == "" + viaAny.dfOpt(1), "qzdp:agree"); +} + +testDefaultParamDispatch(); diff --git a/tests/compile-test/lang-test0/README-codegen.md b/tests/compile-test/lang-test0/README-codegen.md new file mode 100644 index 000000000000..8a121df9a03e --- /dev/null +++ b/tests/compile-test/lang-test0/README-codegen.md @@ -0,0 +1,227 @@ +# Codegen test corpus: conditions and interface dispatch + +Tests for how the compiler lowers boolean conditions and dynamic member access +(interface-typed, structural, `any`). Three layers; each catches what the one +before structurally cannot: + +| layer | run | catches | +| --- | --- | --- | +| JS-executed semantics | `gulp testlang` | wrong answers. The corpus files in this directory are compiled and *run* on the simulator backend -- and condition lowering changes the JS backend too, so this is real coverage, not a stand-in for native | +| native assembly shape | `gulp testthumb` | which sequences codegen chose, unencodable instructions, large size swings. Nothing executes, so no wrong answer is visible here | +| on-device A/B + soak | `npm run hwab` (see `tests/hw-ab/README.md`) | the real allocator, real GC, real panics, leaks over time | + +The coverage matrix below is the index: failure mode -> covering test -> layer +-> what the failure looks like when it fires. + +The corpus is sized for two optimization families: + +- **Boolean condition lowering.** Conditions lower to short-circuit jumps that + yield a raw 0/1 rather than a tagged value materialized and then narrowed, + with Thumb fast-path helpers taking over the common truthiness tests from a + runtime call. +- **Interface dispatch specialization.** Count-gated checked-field-load + helpers, shared interface-call thunks, object-literal store specialization, + vtable wrapper-skip for calls whose arity already matches, and a typed + index-signature store fast path. + +## Coverage matrix + +| Failure mode | Covered by | Layers | How it presents | +| --- | --- | --- | --- | +| Truthiness divergence between a fast path and the runtime's own `toBool` (`-0`, `NaN`, boxed zero, `""` vs `"0"`, `[]`, `{}`, functions) | `54conditiontruthiness.ts`, whole `check()` matrix plus the `--- falsy ---` / `--- truthy ---` case list | testlang, hw-ab | `assertion failed: if:` / `ternary:` / `while:` / `bangbang:`, where `` names the value (`negzero`, `nan`, `boxedzero`, `str0`, `emptyarr`, ...) | +| Statically typed operand and boxed `any` operand disagreeing at the same construct | `54conditiontruthiness.ts`, the `typed:` block; every matrix value additionally arrives through `opaque()` as an `any` | testlang, hw-ab | `typed:emptystr`, `typed:zero`, `typed:nullarr`, `typed:emptyarr` | +| Raw 0/1 form leaking out of a condition instead of round-tripping to a tagged boolean | `54conditiontruthiness.ts` `roundtrip:` block; `55conditionlowering.ts` `testValuePosition` `vp:rt1`, `vp:rt2`, `vp:rtany` | testlang, hw-ab | `roundtrip:true`, `roundtrip:cond`, `vp:rtany`; also `bangbangtype:` and `vp:bangtype` when `typeof` stops saying `boolean` | +| Short-circuit order or operand count changing (`&&`, `\|\|`, `!`, nesting, 3- and 4-operand chains, mixed precedence) | `55conditionlowering.ts` `testShortCircuit`, which records a left-to-right trace in `lg` | testlang, hw-ab | `sc:and:short`, `sc:group1`, `sc:notand1`, `sc:and3short`, `sc:or3short`, `sc:and4`, `sc:mixed1` | +| Value position confused with condition position -- `\|\|`/`&&` yielding a truth value where the operand itself is required | `55conditionlowering.ts` `testValuePosition`; the condition-position complement is in `54conditiontruthiness.ts` (`and1:`, `and0:`, `or0:`, `or1:`) | testlang, hw-ab | `vp:orstr`, `vp:andnum`, `vp:andnocall`, `vp:ornum` | +| Conditions inside constructs other than plain `if` (else-if chains, `while`, `do..while`, `for` header, nested ternaries, switch on a computed scrutinee) | `55conditionlowering.ts` `testConstructs` and `testSwitch` | testlang, hw-ab | `cc:if*`, `cc:while`, `cc:dowhile2`, `cc:for`, `cc:tern*`, `sw:s*`, `sw:n*`, `sw:c*`, `sw:b*` | +| Comparisons feeding logical operators, including string relational comparisons and `length` used directly as a condition | `55conditionlowering.ts` `testComparisons` | testlang, hw-ab | `cmp:1`..`cmp:6`, `cmp:str1`..`cmp:str4`, `cmp:len0`, `cmp:lenchain` | +| Reference imbalance on an operand consumed by a condition (allocation in a loop header, re-evaluated every iteration) | `55conditionlowering.ts` `testFreshOperands` -- string concatenation, array literal, `slice`, object literal and ternary operands all built inside the header | testlang (wrong final state), hw-ab (allocator/GC failure) | `fresh:concat`, `fresh:arrlit`, `fresh:slicelen`, `fresh:obj`, `fresh:strcmp`, `fresh:tern`; on device, a memory panic instead of an assert | +| A condition abandoned part way through by an exception, and conditions used again after the stack unwinds | `55conditionlowering.ts` `testExceptionsInConditions` | testlang, hw-ab | `exn:right`, `exn:left`, `exn:and`, `exn:andshort`, `exn:after`, `exn:loop`; the message carries the actual trace, e.g. `exn:right t!c` | +| Threshold miscounting in a count-gated specialization -- members just below and just above the gate behaving differently | `56ifacedispatch.ts` `testThresholds` (`qzLo` 2 sites vs `qzHi` 5+, `qzFew` 4 reads vs `qzMany` 6+) and `testStores` (`qzRare` 2 stores vs `qzHot` 4) | testlang, hw-ab | `th:lo1`, `th:hi1`..`th:hi5`, `th:few*`, `th:many*`, `th:agree`, `st:rare`, `st:hot` | +| Arity holes in wrapper-skip -- one member name declared at two arities by two unrelated interfaces | `56ifacedispatch.ts` `testArityCollision`, with the two dispatches interleaved in a loop so neither can be hoisted | testlang, hw-ab | `ar:one1`, `ar:two1`, `ar:mixed` | +| A missing trailing argument on a dynamic call (the documented default-parameter constraint) | `56ifacedispatch.ts` `testDefaults` | testlang, hw-ab | `opt:concrete`, `opt:dynagree`, `opt:safe1`..`opt:safe4`, `opt:iface2`, `opt:any2` | +| Get and call sharing a dispatch bucket -- one member name that is a field on one type and a method on another | `56ifacedispatch.ts` `testGetCallCollision`, through both interface-typed and `any`-typed references | testlang, hw-ab | `gc:get1`, `gc:call1`, `gc:agree`, `gc:get2`, `gc:call2`, `gc:type` | +| `toString` fixed-slot violation -- an override not reached through concatenation, templates, direct call, interface or `any` | `56ifacedispatch.ts` `testToString`; also present in `tests/thumb-test/cases/ifacebaseline.ts` | testlang, testthumb (shape), hw-ab | `ts:concat`, `ts:template`, `ts:iface`, `ts:any`, `ts:anyconcat` | +| Polymorphic call site confused between class instances and object literals (maps) | `56ifacedispatch.ts` `testPolymorphic` -- one call site `useQzVal` fed both, plus a mixed array iterated twice | testlang, hw-ab | `poly:class`, `poly:literal`, `poly:elem0`..`poly:elem3`, `poly:total` | +| Index-signature store fast path misrouting -- a declared field reached through `{ [k: string]: number }`, versus a real map | `56ifacedispatch.ts` `testStores` (`st:idx:*` against a class instance, `st:grow*` against a run-time-keyed map); also in `ifacebaseline.ts` | testlang, testthumb (shape), hw-ab | `st:idx:literal`, `st:idx:class:set`, `st:idx:class:rmw`, `st:grow0`, `st:growsum` | +| Stores and accessor calls through interface-typed references, including inherited fields and `super` | `56ifacedispatch.ts` `testStores` | testlang, hw-ab | `st:prop:class`, `st:acc:set`, `st:acc:rmw`, `st:inh:ifaceset`, `st:super:iface`, `st:base:call` | +| Dynamic member get on an `any`, by dot, by string literal and by computed key | `56ifacedispatch.ts` `testDynamicGet` | testlang, hw-ab | `dg:dot`, `dg:literal`, `dg:computed`, `dg:missing`, `dg:inst1`..`dg:inst3`, `dg:instcall` | +| Silent optimization loss -- an expected helper, thunk or dispatch sequence quietly stops being emitted, or an unexpected one appears | `tests/thumb-test/cases/boolbaseline.ts` and `ifacebaseline.ts`, whose entries in `asmchecks.ts` name the exact helpers that must and must not appear | testthumb | chai failure from `assertAtLeast` / `assertAbsent` / `assertNoMatch`, e.g. `expected at least 12 calls to numops::toBoolDecr, found 0` or `listing unexpectedly mentions _pxt_map_set_by_string` | +| Large silent swing in generated code size | `tests/thumb-test/cases/sizebaseline.ts` via `codeSize` and `assertWithin` | testthumb | `generated code size is N, outside the band lo..hi` | +| Invalid Thumb emission -- an unencodable instruction or a stack imbalance | Every thumb-test case, plus every semantic file registered in `externalCases` in `asmchecks.ts`, compiled natively with the lang-test0 prelude | testthumb | `native compile of failed:` followed by the code-9200 diagnostics from the in-process assembler | + +## Per-file summaries + +### `54conditiontruthiness.ts` + +A value-by-value truthiness matrix. `check()` pushes a single value through +every construct that lowers to a condition -- `if`, `if (!v)`, if/else, the +conditional expression, `while`, `do..while`, a `for` header, condition-position +`&&` and `||`, and single and double negation -- and asserts the outcome of +each. The falsy set is pinned to exactly what the runtime treats as false: +`false`, zero in any representation (including `-0` and a boxed double zero), +`null`, `undefined`, `NaN` and `""`; everything else is truthy, including +`"0"`, `" "`, `"false"`, `[]`, `{}` and function values. Every value reaches its +test site through an `any`-typed identity call, so the operand is opaque and no +condition can be folded at compile time. Floating-point-only values (boxed +zero, fractions) are gated on `hasFloat`, and a `casecount` assert pins the +matrix size per target so a case cannot silently disappear. A closing block +re-runs the same values through statically typed locals and round-trips a +boolean through a call, which is where a raw 0/1 form that failed to become a +tagged boolean shows up. + +### `55conditionlowering.ts` + +Structural semantics rather than truth values. Operand functions `A`..`D` +append to a module-level trace string, so each assertion pins the exact +left-to-right evaluation order and operand count of a condition -- including +nested groups, negation wrapped around a chain, three- and four-operand chains, +and `&&` binding tighter than `||`. A separate section contrasts condition +position with value position, where `&&` and `||` must yield an operand rather +than a truth value. `testFreshOperands` allocates the operand inside the loop +header on every iteration (string concatenation, array literals, `slice`, +object literals) and runs the loops for hundreds of iterations, so a +reference-count imbalance on the condition path surfaces as a wrong final state +or an allocator failure rather than as a wrong first iteration. +`testExceptionsInConditions` throws from either operand of `&&` and `||` and +from inside a loop header, asserting both the partial trace and that conditions +still behave once the stack has unwound. `testSwitch` uses computed scrutinees +and a condition result as the scrutinee so nothing resolves statically. + +### `56ifacedispatch.ts` + +Dynamic member get, set and call through interface-typed, structurally typed +and `any`-typed references. Interface member ids are global by name across a +whole program and some specializations are gated on how many static sites a +member has, so every member here carries a `qz` prefix that is unique to this +file, and the threshold-straddling members are counted deliberately: `qzLo`, +`qzFew` and `qzRare` sit below their gates while `qzHi`, `qzMany` and `qzHot` +sit above, and both sides must behave identically. The remaining sections +isolate one dispatch hazard each: the same method through concrete, interface +and `any` references; one member name at two arities in two unrelated +interfaces; one member name that is a field on one type and a method on +another; a method reached through a lambda and through a higher-order call; a +single call site fed both class instances and object literals; a `toString` +override reached five different ways; stores through property signatures, +accessors, inherited fields, `super`, a run-time-keyed map and a typed index +signature over both a literal and a class instance; and dynamic gets by dot, by +string literal and by computed key. One constraint is documented in the file +rather than asserted away: the emitter fills a defaulted argument in at the +call site from the statically known signature, so through an interface- or +`any`-typed reference there is no signature and the callee's own default does +not apply. `testDefaults` therefore asserts that the interface and `any` paths +agree with each other, and that a callee written to test for `undefined` works +on every path. + +`57defaultparamdispatch.ts` is the minimal standalone repro of that defect: a +two-line block marked REPRO is commented out so the suite stays green, and +uncommenting it makes `gulp testlang` fail with `qzdp:iface` -- a ready-made +red test for whoever picks the fix up. The file's active assertions pin the +parts that must hold either way. + +### `tests/thumb-test/cases/boolbaseline.ts` + +A small program that drives conditions in `if` and `while` headers, `&&`, `||` +and `!` over numbers, booleans, strings and arrays, at enough distinct sites to +make a count assertion meaningful. Every value feeds a module-level accumulator +so no condition site can be dropped as unused. Its entry in `asmchecks.ts` +asserts on the shape of the resulting listing: how many test sites narrow their +operand through a `numops::toBoolDecr` call, and which condition-lowering +helpers appear in the listing. Nothing executes -- this is purely about which +sequence codegen chose. + +### `tests/thumb-test/cases/ifacebaseline.ts` + +The dispatch counterpart. Two classes implement one interface; the program does +repeated checked field loads of a single field, repeated interface-dispatched +calls of a single method, repeated object-literal stores of a single key, an +overridden `toString`, and a typed index signature -- each repeated enough times +to cross a plausible count gate. Everything feeds a module-level accumulator. +Its `asmchecks.ts` entry asserts both on the generic map runtime entries the +program reaches and on the presence or absence of the specialized forms: +checked-field-load thunks, interface-call thunks, specialized map-store thunks, +`_iface` proc labels and the by-string map-set helper. + +### `tests/thumb-test/cases/sizebaseline.ts` + +A fixed dispatch-heavy program -- an interface with three implementations +driven through a loop, string building, a string-keyed counter map and an array +sort -- whose emitted code size is tracked with a wide percentage band via +`codeSize` and `assertWithin`. The band is deliberately wide: it is there to +catch large silent swings in either direction, not to turn every codegen tweak +into a test edit. This program must stay stable, since changing it invalidates +the recorded baseline. + +## How to run + +The layer table at the top: `gulp testlang` and `gulp testthumb` (both in +`gulp test`), and `tests/hw-ab/README.md` for hardware. + +## Extending this corpus + +Where a new test belongs: + +- **A behavior that can be observed by running the program.** A new file in + this directory, named `NNname.ts`. It is picked up automatically by + `compilerunner.ts`, which compiles it as `main.ts` together with the + `lang-test0.ts` prelude and runs it. Use `assert(cond, "prefix:id")` with a + prefix unique to the section, since the assert id is the only thing a failure + report carries. +- **A codegen shape that a running program cannot observe.** A new program in + `tests/thumb-test/cases/` plus an entry keyed by its file name in + `asmChecks`. A case with no entry fails, so an expectation is never + accidentally omitted. Feed every value into a module-level accumulator or the + optimizer will drop the code under test. +- **A semantic file that should also survive the native emitter.** Add its + repo-relative path to `externalCases` in `asmchecks.ts`. Those entries are + compiled with the lang-test0 prelude prepended but are not executed, so keep + the expectation light -- the semantics are already covered by `gulp testlang`. +- **Anything that needs the real allocator, the real GC or a real panic.** The + hardware layer; see `tests/hw-ab/README.md`. + +Two rules that are easy to violate: + +- **One program per case file.** Each file compiles as its own `main.ts`, and + its top-level declarations share a scope with the prelude's globals (for + lang-test0 files) or with the target's libraries (everywhere). Wrap the + entire test in a namespace and call its `run()` at the end of the file, as + `54`, `55` and `56` do. Do not merge two case programs into one file, and do + not add bare top-level names. +- **Member-name call-site counts are program-wide.** Interface member ids are + keyed by name across the whole program, target libraries included, so a + member named `size` or `value` already has an unknown number of sites before + your test adds any. A test that depends on sitting on a particular side of a + count gate must use a name that occurs nowhere else -- hence the `qz` prefix + in `56ifacedispatch.ts`. Adding one more use of such a name anywhere in the + same file changes its count and can move it across the gate. + +## Known gaps + +Deliberately not covered by any layer in this corpus: + +- **Asm shape for the semantic programs.** The semantic files are registered in + `externalCases` only to prove they compile and assemble; the expectation is + `codeSize(asm) > 0`. Their condition and dispatch shape is not pinned -- that + is what the purpose-built baseline cases are for. +- **The VM / stack-machine backend.** `tests/thumb-test` pins + `target.nativeType` to Thumb. Nothing asserts on the `backvm.ts` output for + any of these programs. +- **Device-side GC stress.** `testFreshOperands` allocates in loop headers, but + nothing forces a collection, applies memory pressure, or inspects heap growth. + A reference imbalance is only visible indirectly, as a wrong final state or as + an allocator failure that happens to occur. +- **Runtime speed.** These are performance optimizations, and no layer asserts a + speedup. Generated code size (`sizebaseline.ts`) is the only quantitative + signal in the offline layers. +- **Event handlers and concurrency.** The thumb-test cases must terminate and + avoid event loops, and the lang-test0 files are straight-line programs. + Conditions and dispatch inside event handlers or across fibers are not + exercised offline. +- **Error paths on dynamic dispatch.** `dg:missing` reads an absent key and + expects `undefined`, but nothing calls a member that does not exist, or + stores through a reference of the wrong shape, to pin the failure behavior. +- **Accessors through an `any`-typed reference.** `56ifacedispatch.ts` reaches + a getter/setter pair through an interface-typed reference (`st:acc:*`) but + not through an `any`. +- **Multi-variant packaging.** The thumb layer produces single-variant output; + the universal-hex combiner is not loaded. See `tests/thumb-test/README.md`. diff --git a/tests/thumb-test/README.md b/tests/thumb-test/README.md new file mode 100644 index 000000000000..11f96be3f02a --- /dev/null +++ b/tests/thumb-test/README.md @@ -0,0 +1,105 @@ +# thumb-test + +Compiles PXT TypeScript programs to native ARM Thumb in-process and asserts on +the generated assembly listing. + + gulp testthumb # also part of gulp test + +Runs offline, no C++ toolchain needed: the whole native path -- emitter, +register allocation, peephole, Thumb assembler -- runs in-process. + +Catches: which helpers, thunks and dispatch sequences codegen chose; invalid +instruction streams (the assembler fails the compile); silent code-size +swings. Cannot catch: runtime behavior -- nothing executes here, that is +`tests/hw-ab/` -- and multi-variant packaging (the universal-hex combiner is +not loaded; output is single-variant). + +## How it works + +Native compilation needs `opts.extinfo.hexinfo`; here it comes from a fixture: +`fixtures/microbit-mbcodal.json.gz` is a gzipped `CompileOptions` environment +captured from a real native micro:bit build (the mbcodal / V2 variant), holding +`target`, `extinfo` (with `hexinfo`), `fileSystem` (all dependency TS sources), +`sourceFiles` and `jres`. + +For each case program the runner parses a fresh copy of the fixture, +substitutes the case text as `main.ts` in `fileSystem`, forces +`target.isNative`, `target.nativeType = "thumb"` and `target.switches.size`, +then calls `pxtc.compile`. The result must succeed, and the listing in +`res.outfiles["binary.asm"]` is handed to the case's expectation function. + +Compile success is itself a meaningful assertion: the in-process assembler +turns invalid instructions and stack imbalances into code-9200 diagnostics. + +## Adding a case + +1. Drop a `.ts` program in `cases/`. Use core language constructs only -- + classes, interfaces, strings, arrays, maps, arithmetic. Avoid event loops and + device APIs; the program must terminate. Feed every value into a module-level + accumulator so the optimizer cannot drop the code under test. +2. Add an entry keyed by the file name to `asmChecks` in `asmchecks.ts`. A case + with no entry fails, so an expectation is never accidentally omitted. + +Helpers available to expectations: `hasLabel`, `mentions`, `countMatches`, +`codeSize`, `hexSize`, `assertAbsent`, `assertNoMatch`, `assertAtLeast`, +`assertWithin`. + +Size assertions use `codeSize`, which reads the generated-code byte count from +the size stats header. That number tracks codegen; `hexSize` is dominated by the +fixed runtime image and moves very little, so it is only useful as a +sanity check. + +## Regenerating the fixture + +The fixture is a self-consistent snapshot; it does not track pxt-microbit +releases, and a target version bump alone does not require regeneration. +Regenerate only when: + +- the compiler emits calls to a runtime function the snapshot does not carry + (fails loudly at hex setup with the missing function name) +- the shape of `CompileOptions`/`extinfo` consumed by `pxtc.compile` changes + (fails loudly when the replayed options are rejected) +- a test case needs core APIs or runtime behavior newer than the snapshot + +Codegen changes in this repo never require it: the current compiler always +runs against the fixture, so compiler changes are exercised regardless of the +fixture's age. The `meta` block inside the fixture records the capture date, +target version and extinfo sha for diagnosis. + +Requires a sibling `pxt-microbit` checkout that is npm-linked to this one +(`node_modules/pxt-core -> ../../pxt`) and has a populated `built/hexcache/`. + + npm run build + node tests/thumb-test/scripts/capture-fixture.js + +Set `PXT_TARGET_DIR` to capture from a checkout that is not the sibling +`../pxt-microbit`. + +If the capture build fails with `Package not installed: `, the target's +`upgrades` rules injected a dependency into the scratch project. The script +guards against this by stamping the current target version into the scratch +`pxt.json` (`targetVersions.target`), which gates off rules aimed at older +projects; a rule not gated on version would need a matching dependency added to +`makeScratchProject`. + +The script creates a scratch project under +`/projects/thumb-fixture`, loads the compiled CLI bundle +(`built/pxt.js`), patches `ts.pxtc.compile` to intercept the options the CLI +assembles, and drives the CLI's own `build` command with +`PXT_COMPILE_SWITCHES=csv---mbcodal` (a variant selector, not a real switch) +to pin the single mbcodal variant. The hex runtime is resolved from +`built/hexcache/`, so nothing is downloaded or compiled in C++. The script +prints the fixture path and size, and drops `extinfo.compileData`, +`generatedFiles`, `extensionFiles` and `otherMultiVariants`, none of which +`pxtc.compile` reads. + +## Coverage + +This layer is the middle of three that cover condition compilation and +interface dispatch. The coverage map for all of them -- which failure mode is +caught where, what each case program and each semantic test file exercises, and +where a new test belongs -- is +`tests/compile-test/lang-test0/README-codegen.md`. Read it before adding a case +here: some things belong in the JS-executed layer (`gulp testlang`) or on +hardware (`tests/hw-ab/`) instead, and it also lists what none of the layers +cover. diff --git a/tests/thumb-test/asmchecks.ts b/tests/thumb-test/asmchecks.ts new file mode 100644 index 000000000000..2ab2a3a33ca3 --- /dev/null +++ b/tests/thumb-test/asmchecks.ts @@ -0,0 +1,168 @@ +/// + +import * as chai from "chai"; + +/** + * Expectations over the ARM Thumb assembly listing produced for each case + * program in tests/thumb-test/cases. + * + * A case file named .ts is checked by the entry keyed ".ts" in + * `asmChecks` below. A case with no entry fails, so that adding a program + * without an expectation is not silently a no-op. + */ + +export type AsmCheck = (asm: string, res: pxtc.CompileResult) => void; + +// --- helpers ------------------------------------------------------------- + +/** True when `name` appears as a label definition, e.g. "_main___P1:". */ +export function hasLabel(asm: string, name: string): boolean { + return new RegExp("^\\s*" + escapeRegExp(name) + ":", "m").test(asm); +} + +/** True when `name` appears anywhere in the listing as a whole token. */ +export function mentions(asm: string, name: string): boolean { + return new RegExp("(^|[^A-Za-z0-9_])" + escapeRegExp(name) + "([^A-Za-z0-9_]|$)").test(asm); +} + +/** Number of matches of a global regex in the listing. */ +export function countMatches(asm: string, re: RegExp): number { + const g = re.global ? re : new RegExp(re.source, re.flags + "g"); + const m = asm.match(g); + return m ? m.length : 0; +} + +/** + * Bytes of code generated for the program, from the size stats header that + * target.switches.size adds to the listing. This excludes the fixed runtime + * image, so it tracks codegen rather than the size of the hex template. + */ +export function codeSize(asm: string): number { + const m = /^; generated code sizes \(bytes\): (\d+)/m.exec(asm); + chai.assert(!!m, "no code size stats in listing (is target.switches.size set?)"); + return parseInt(m[1], 10); +} + +/** Bytes of the emitted Intel hex text. */ +export function hexSize(res: pxtc.CompileResult): number { + const hex = res.outfiles[pxtc.BINARY_HEX]; + chai.assert(!!hex, "no " + pxtc.BINARY_HEX + " in compile result"); + return hex.length; +} + +/** Fails if any of `names` occurs in the listing. */ +export function assertAbsent(asm: string, names: string[]) { + for (const n of names) + chai.assert(!mentions(asm, n), "listing unexpectedly mentions " + n); +} + +/** Fails if `re` matches the listing. */ +export function assertNoMatch(asm: string, re: RegExp, what: string) { + const n = countMatches(asm, re); + chai.assert(n === 0, "listing unexpectedly contains " + n + " " + what); +} + +/** Fails unless `re` matches the listing at least `min` times. */ +export function assertAtLeast(asm: string, re: RegExp, min: number, what: string) { + const n = countMatches(asm, re); + chai.assert(n >= min, "expected at least " + min + " " + what + ", found " + n); +} + +/** + * Fails unless `actual` is within `pct` percent of `expected`. Bands are wide + * on purpose: they catch silent large regressions in either direction without + * turning every codegen tweak into a test edit. + */ +export function assertWithin(actual: number, expected: number, pct: number, what: string) { + const lo = Math.floor(expected * (1 - pct / 100)); + const hi = Math.ceil(expected * (1 + pct / 100)); + chai.assert(actual >= lo && actual <= hi, + what + " is " + actual + ", outside the band " + lo + ".." + hi + + " (baseline " + expected + ", +/-" + pct + "%)"); +} + +function escapeRegExp(s: string): string { + return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} + +// --- per-case expectations ----------------------------------------------- +// +// The *baseline cases pin how the compiler in this tree lowers specific +// constructs, partly by asserting which specialized helpers are ABSENT from +// the listing. They are the reference half of a differential pair: work that +// specializes those constructs flips or extends these expectations alongside +// its codegen change, and a mismatch in either direction is the signal (the +// specialization silently stopped firing, or it appeared where it was not +// expected). The helper names and label patterns asserted absent here are +// therefore a naming contract with that work -- renaming an emitted helper or +// thunk label means updating the patterns below in the same change. + +export const asmChecks: pxt.Map = { + + "boolbaseline.ts": (asm) => { + // Conditions are materialized as tagged values and narrowed by a call + // into the runtime at each test site. + assertAtLeast(asm, /bl numops::toBoolDecr/g, 12, "calls to numops::toBoolDecr"); + + // Helpers introduced by boolean condition lowering. Absent here. + assertAbsent(asm, [ + "_numops_toBool", + "_numops_toBoolDecr", + "_pxt_fromBool", + "_pxt_boolean_bang", + ]); + }, + + "ifacebaseline.ts": (asm) => { + // The program does reach the generic interface/map runtime entries. + assertAtLeast(asm, /bl pxtrt::(mapGet|mapSet|lookupMapKey)/g, 4, + "generic map runtime calls"); + + // Specializations introduced by interface dispatch specialization. + // Absent here: every access goes through the generic runtime path. + assertAbsent(asm, [ + "_pxt_map_set_by_string", + ]); + assertNoMatch(asm, /ldfldchk_/g, "checked-field-load thunks (ldfldchk_)"); + assertNoMatch(asm, /ifacecall\d+_.*_i\d+/g, "interface call thunks"); + assertNoMatch(asm, /mapset_i/g, "specialized map-store thunks (mapset_i)"); + assertNoMatch(asm, /^\s*\S*_iface:/gm, "_iface: proc labels"); + }, + + "sizebaseline.ts": (asm, res) => { + chai.assert(hexSize(res) > 0, "empty hex output"); + // Baseline measured on this fixture; see assertWithin on why the band + // is wide. + assertWithin(codeSize(asm), 5592, 15, "generated code size"); + }, +}; + +// --- external case programs ---------------------------------------------- + +/** + * Semantic case programs that live outside tests/thumb-test/cases. These are + * lang-test0 files that the compile-test suite executes on the JS backend; + * compiling them here proves the same source also survives the native emitter + * and the thumb assembler, and makes them available as an on-device payload. + * + * Keys are paths relative to the repository root. The runner prepends the + * lang-test0 prelude, which supplies assert() and msg(). + * + * The expectations are deliberately light. These programs assert language + * semantics rather than codegen shape, so the check here is only that the + * emitter produced real code for them. + */ +export const externalCases: pxt.Map = { + + "tests/compile-test/lang-test0/54conditiontruthiness.ts": (asm) => { + chai.assert(codeSize(asm) > 0, "no code generated"); + }, + + "tests/compile-test/lang-test0/55conditionlowering.ts": (asm) => { + chai.assert(codeSize(asm) > 0, "no code generated"); + }, + + "tests/compile-test/lang-test0/56ifacedispatch.ts": (asm) => { + chai.assert(codeSize(asm) > 0, "no code generated"); + }, +}; diff --git a/tests/thumb-test/cases/boolbaseline.ts b/tests/thumb-test/cases/boolbaseline.ts new file mode 100644 index 000000000000..80e496819500 --- /dev/null +++ b/tests/thumb-test/cases/boolbaseline.ts @@ -0,0 +1,28 @@ +// Exercises conditions in if/while, &&, ||, and ! over numbers, booleans, +// strings and arrays. Everything feeds a module-level accumulator so no +// condition site can be dropped as unused. + +let acc = 0 +let flag = true +let text = "ab" +let n = 3 +let arr = [1, 2] + +function classify(v: number, on: boolean, txt: string): number { + let r = 0 + if (v > 2 && on) r += 1 + if (!on || v < 0) r += 2 + while (v > 0) { + r += v + v -= 1 + } + if (txt) r += 4 + if (!txt) r += 8 + return r +} + +acc += classify(n, flag, text) +acc += classify(0, !flag, "") +if (arr.length > 1) acc += 16 +if (flag && arr.length > 0 && text.length > 1) acc += 32 +if (!flag || !text) acc += 64 diff --git a/tests/thumb-test/cases/ifacebaseline.ts b/tests/thumb-test/cases/ifacebaseline.ts new file mode 100644 index 000000000000..a5a14823c72f --- /dev/null +++ b/tests/thumb-test/cases/ifacebaseline.ts @@ -0,0 +1,71 @@ +// Exercises interface-typed field reads, interface-dispatched method calls, +// repeated object-literal keys, an overridden toString, and a typed index +// signature. Everything feeds a module-level accumulator so no access site can +// be dropped as unused. + +interface Shape { + size: number + scale(by: number): number + toString(): string +} + +class Box implements Shape { + size: number + label: string + constructor(size: number, label: string) { + this.size = size + this.label = label + } + scale(by: number): number { + this.size = this.size * by + return this.size + } + toString(): string { + return this.label + this.size + } +} + +class Dot implements Shape { + size: number + constructor() { + this.size = 1 + } + scale(by: number): number { + this.size = this.size + by + return this.size + } + toString(): string { + return "dot" + } +} + +let acc = 0 +let shapes: Shape[] = [new Box(2, "b"), new Dot(), new Box(5, "c"), new Dot()] + +// checked field loads of one field +acc += shapes[0].size +acc += shapes[1].size +acc += shapes[2].size +acc += shapes[3].size +acc += shapes[0].size + shapes[1].size +acc += shapes[2].size + shapes[3].size + +// interface-dispatched calls of one method +acc += shapes[0].scale(2) +acc += shapes[1].scale(3) +acc += shapes[2].scale(4) +acc += shapes[3].scale(5) + +// object-literal stores of one key +let recs = [{ size: 1 }, { size: 2 }, { size: 3 }, { size: 4 }] +for (let r of recs) acc += r.size + +// overridden toString +acc += shapes[0].toString().length +acc += shapes[1].toString().length + +// typed index signature +let table: { [k: string]: number } = {} +table["a"] = acc +table["b"] = acc + 1 +acc += table["a"] + table["b"] diff --git a/tests/thumb-test/cases/sizebaseline.ts b/tests/thumb-test/cases/sizebaseline.ts new file mode 100644 index 000000000000..ae65b45fa2bb --- /dev/null +++ b/tests/thumb-test/cases/sizebaseline.ts @@ -0,0 +1,45 @@ +// A fixed dispatch-heavy program whose emitted code size is tracked. Keep this +// program stable: changing it invalidates the size baseline in asmchecks.ts. + +interface Op { + apply(v: number): number +} + +class AddOp implements Op { + constructor(public k: number) { } + apply(v: number) { return v + this.k } +} + +class MulOp implements Op { + constructor(public k: number) { } + apply(v: number) { return v * this.k } +} + +class ClampOp implements Op { + constructor(public lo: number, public hi: number) { } + apply(v: number) { return v < this.lo ? this.lo : (v > this.hi ? this.hi : v) } +} + +let acc = 0 +const ops: Op[] = [new AddOp(3), new MulOp(2), new ClampOp(0, 100), new AddOp(-1), new MulOp(5)] + +function runAll(v: number): number { + for (const o of ops) v = o.apply(v) + return v +} + +for (let i = 0; i < 5; ++i) acc += runAll(i) + +const names = ["add", "mul", "clamp"] +let joined = "" +for (const n of names) joined = joined + n + ":" +acc += joined.length + +const counts: { [k: string]: number } = {} +for (const n of names) counts[n] = (counts[n] || 0) + acc +for (const n of names) acc += counts[n] + +const nums = [5, 3, 9, 1, 7] +nums.sort((a, b) => a - b) +for (const v of nums) acc = acc + v * 2 +acc += nums.indexOf(9) diff --git a/tests/thumb-test/fixtures/microbit-mbcodal.json.gz b/tests/thumb-test/fixtures/microbit-mbcodal.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..9aa554368b786075bbd6bcd281f04ca34ccfb7ee GIT binary patch literal 488859 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 z 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ËptzS=F=>7-mM>yhMCr7VWo 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
    0JAp^+J1 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%0DSdL2u72j}xW%2Imw@ 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 z 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

    UtOhtN<}8Cbv+zB+wsz7 zc>8-i0r48trP%6M0vwYLXVUv}LiKWod;PlGo7>*RnrdGp(l|o24&loNM;ECLc8O@o zjW7bu`^4%{8(NpYtQmF+V`IF4zb(CB08;nN1ug;4rWiffxF6x?g_88JRs+nPFynfEhhnrA(5=+n|J^N_w##L7z_a({9Mt`S?#sL6}J>TS*7mb0oM(Ob?3D)4*s zQdT+;W9!AaoH1Uk#Y5aOqi{gM7Qyi;&~>GCx`K;fRZF|W_?TNswS`6rZT8kPTq;#d zGZ&*$4}1~2C@*kTpbW%3ss;lqYxtE=*$HiSPvwYRR%}AVq8KC2w76crVP}BYVhTit z9ZMuFe0dC5sZ`=Rt*bX3_Y3+@sQ`P^??2Nc{JjeBSINJ?7CG_PmG3L1e)D%?7~6$W zjx`Xu;Wt5IoUD_ugj1k_tT1>g{&FBn(rT*LDmma%PzUnyCjE*2+LJ{HA|yWS8ef7B zhw7Zd^FbtHf?R55-38NhL$A`wGK(DV+jIna#XV#td~flhlmZZ%{OBsq(GJ((TtPS- z#;oKZ=`H>xXTS$mK&cgaasC&It21WP1mqkNc}7bdv>-e{0uCEacAv< zcl(Cg@Gf_+ZTAYC#M8l31%PtW^KrsK#{+*-*aB%2_M>#%aMuoyn-C&qWs1$SQyrYF z^oGXs;+5K&4>enCz+bZ^UBFZftsq^Jd2HL6n|?BCRNq<{z~M# zu{4p%wXu=P!2054Q+kiZePc6wzU4T?-E(!l)@D|}1)})1iVTVZwVj4dQ-+y=MqCc` zCGksCZ>aYJs?WD*9YjcjQqlJ?K!P5|9<#MWi8K~f`Qo^KQkNn!oT^UYwh@s6gQ#Jn zt?htKDJf++#ik?7rF=ithw0AiLJmA-WV{~;KfcgsG+J{|t8=L&cbIQYC&fc_@^gLR zlQ@g{@T%io#Wi$+R4wW?4PP7-Bj!BNmkweBc5_)uUd=$;naZ1CSpUn{&XNZ!6kEUArEJr!@lbD+pnmo9$kWgyP7 z`pNH64{xM;qLQuY4s`b67h#P}nLt^bGTQi(Tf_3_*vpg+cf38n4qbTcvSeu=aQ<@i z!bYOE=0rzQ+z6|%JT7O8K9b}e|x;gUI;9ly=NlF-+x6%fzu&X6drhZ1ut|A+I z!i?kjk#Qo9C<82E&4{yI_HJXHFhS`eIv%ot}bG zu~RHcp80#_(_7%Y@OT3gOxkGFg`i5@E3^_$0NyrkbB3!HNVL&l(^xRsa+#Lw5t+&h z1pNeQ>Xb|lUjXflI@>H)Btxo&k(axHx8C|4`=9RDZC@f{-#5m$bTkwHG%c)6RsREC z_)YXLU=mgS#w1En@6@e%v4s2%A`KqDmW`jTwGlP8a6^HbSY#623R7ec6g^mR&EaQ9 zOIymIDp{|@7UG1_wd0~?q3bY+@^hrN-aP(Y(x2Z`vBNehZpypdO}dMxdD{fZkF|2l0~hc~ zpp>t4S-S?$xy{wj z@+GmVXZT9vGJLaMPW3ph>=95Qrg}#z^WNyU;5eIZ_J;Dstr{{PDVK*>gIM(wC=pT+ zm69p=D7>AT#NV=#aW&9!4kd-WZ`i7Ng6>Gn?()JtzWY4bv&_Qiy;^UqQu~+n$r0qI zx~IN(h+EA-U(gp2XCJrp1b-8}GUOeSzw9r&3#vrfqvdWEgdgcHDXGssJBwZH$*6Bg zRg)^n*+i6xMozx&L5;%?=Jz9 zJzwwiPmNPfW#w3j!4Qvn>Bf=BaD@sIYZRNPI0gO!Z33EgBTLb zYZvuwwM82|fh-$5t$Tm4-+OVgOu>D|y&0n1h+@y;?FrvM(_3A2yyrMF7r4^*qX2^l zw&LIdXT`zBX6S=t`n%!1_X1+muVn$X2uk;umn-YSFuV;VYyBRpy={9_vSu|@3F`t4r39;*EC2a8{0nX5zSQ8S!)7&9$v6}(iah&C8=;KmMhc90Bs^0wO zxms|t=;tdvm?Ura-4#=%M;|zNXJ{bT^oeqz)RT*lz6 zeB3MSOQ4@(OYn7kA@6f9F1}QbOBDUx5<3sHA+<8M@1~E}_-C>bMeeLRxpJ>8Rk}H0 z$+|47vT_j*w(!dAuekY8SH~E=?p3ly@Av#O*vM$@?*ZyNSg?i5ME-Iq+xQI|TjK6M{72FfL=Y226mHYvk(=Js-flwEB76o&otu@i{_tYjx8AD9p7^J~IMn_UdIdjLy z>3n>|hEWf=G*vhhNazFdiQA1%O2Fx;^-=vp+28}wtoW?6BjHn*VjA*7S@R#j(A!zq z<2ZkDlXcB18|*TCWsW*Ha`fsDU&xuru%q{TpNMp?-|ku3siZnA6^c;{MCuDMM)}q~ZR=E466^d_- zWg+6mruU?{n;ukNF&ARl72ss zetLZ;Uf>6WmDOo^4i`mv<0XDSP<4zc%S`w^hxqF2yJL~DyYZ!0j$js zg6pq#A(CQnRi6!L5O^3q=VPD~4fc(+iN#Y$(0eMYC`Vja)9l!^;?ob15EdOAeh1;y zUD!XA(HGnol5_4VX@Tp1=HK-1|2`*uvG2b}Yxuq7H<mh86ah+#{j?l_`@$h>LSUD z)oZ@RFF*c-zK}os@?$UV{VxR=gZ|-{U%URb)qm>z*XBjw>c5KWeV?~K!SIlDMKi4w@`N(-h4qY^(gntgpJ!#bIZ!N!ieoOzw?#)m}y; zu1uXnq-HkfutI_|7+D}0`*K<_ty6@9y;)#0jauBc>U^iF+(Z}wWKqp{42@Nf$qD@F z3ZiG_4m+KtZ!duclERF5wq;e2YV8MZk#u-0qsa(WwtA@_&!&=I5pE`*L0Ao(jV^qZ zdV|>F1Xei*QK?R_XXSl-#cFRVwyEB4RLKUq(K=qnU$T2$sqtA6rT0DGvUQ*Pj`2aM zBS}Q{rPV-g(EePirdWc=V~EEhqrWMn=6qxYzFI0Mm(xac(Hs$x?HbjbP.json.gz. + * + * Strategy: load the compiled pxt CLI bundle (built/pxt.js), monkey-patch + * ts.pxtc.compile, then drive the CLI's own "build" command inside a scratch + * project in the pxt-microbit checkout. The CLI assembles the full + * CompileOptions -- including extinfo.hexinfo, which is the piece that native + * compilation cannot proceed without -- and the patch intercepts it before any + * code is emitted. The hex runtime comes from pxt-microbit/built/hexcache, so + * no network and no C++ toolchain are involved. + * + * Usage: + * node tests/thumb-test/scripts/capture-fixture.js + * + * Environment: + * PXT_TARGET_DIR target checkout to capture from + * (default: sibling ../pxt-microbit) + */ + +"use strict"; + +const fs = require("fs"); +const path = require("path"); +const zlib = require("zlib"); + +const pxtDir = path.resolve(__dirname, "..", "..", ".."); +const targetDir = path.resolve( + process.env.PXT_TARGET_DIR || path.join(pxtDir, "..", "pxt-microbit")); +const variant = "mbcodal"; +const fixtureName = "microbit-" + variant; +const fixturePath = path.join( + pxtDir, "tests", "thumb-test", "fixtures", fixtureName + ".json.gz"); +const projectDir = path.join(targetDir, "projects", "thumb-fixture"); + +// Fields of extinfo that are only needed by the C++ build service. They are +// large and never read by pxtc.compile. +const EXTINFO_DROP = ["compileData", "generatedFiles", "extensionFiles"]; + +function fail(msg) { + console.error("capture-fixture: " + msg); + process.exit(1); +} + +function makeScratchProject() { + // Stamping the current target version keeps the target's "upgrades" rules + // from injecting extra dependencies (they are all gated on older versions). + // Without the stamp the project reads as version 0.0.0, pxt-microbit's + // missingPackage rules match it, and the build dies with an error like + // "Package not installed: microphone". + const targetVersion = + JSON.parse(fs.readFileSync(path.join(targetDir, "package.json"), "utf8")).version; + + fs.mkdirSync(projectDir, { recursive: true }); + fs.writeFileSync(path.join(projectDir, "pxt.json"), JSON.stringify({ + name: "thumb-fixture", + description: "Scratch project used to capture the thumb-test fixture.", + dependencies: { core: "file:../../libs/core" }, + files: ["main.ts"], + targetVersions: { target: targetVersion }, + supportedTargets: ["microbit"] + }, null, 4) + "\n"); + // Deliberately trivial: the captured program text is replaced per test case. + fs.writeFileSync(path.join(projectDir, "main.ts"), "let x = 1\n"); +} + +function stripOptions(opts) { + const out = { + target: opts.target, + extinfo: opts.extinfo, + fileSystem: opts.fileSystem, + sourceFiles: opts.sourceFiles, + jres: opts.jres, + name: opts.name, + bannedCategories: opts.bannedCategories, + embedMeta: opts.embedMeta, + embedBlob: opts.embedBlob, + hexinfo: undefined + }; + delete out.hexinfo; + + if (!out.extinfo || !out.extinfo.hexinfo || !out.extinfo.hexinfo.hex) + fail("captured options have no extinfo.hexinfo -- native build did not " + + "resolve a hex runtime (is built/hexcache populated?)"); + + out.extinfo = Object.assign({}, out.extinfo); + for (const k of EXTINFO_DROP) + delete out.extinfo[k]; + + // Other variants carry a second full hex image and are not exercised here. + delete out.otherMultiVariants; + + return out; +} + +function writeFixture(opts) { + const captured = stripOptions(opts); + const meta = { + capturedAt: new Date().toISOString(), + target: (global.pxt && global.pxt.appTarget && global.pxt.appTarget.id) || "unknown", + targetVersion: (global.pxt && global.pxt.appTarget && global.pxt.appTarget.versions + && global.pxt.appTarget.versions.target) || "unknown", + variant: variant, + sha: captured.extinfo.sha + }; + const json = JSON.stringify({ meta: meta, options: captured }); + const gz = zlib.gzipSync(Buffer.from(json, "utf8"), { level: 9 }); + fs.mkdirSync(path.dirname(fixturePath), { recursive: true }); + fs.writeFileSync(fixturePath, gz); + + console.log(""); + console.log("capture-fixture: wrote " + fixturePath); + console.log(" raw json: " + json.length + " bytes"); + console.log(" gzipped: " + gz.length + " bytes (" + + (gz.length / 1024 / 1024).toFixed(2) + " MB)"); + console.log(" sha: " + meta.sha); + console.log(" variant: " + meta.variant); + console.log(" hex lines: " + captured.extinfo.hexinfo.hex.length); + console.log(" fs entries: " + Object.keys(captured.fileSystem).length); + console.log(" isNative: " + captured.target.isNative + + " nativeType=" + captured.target.nativeType); +} + +function main() { + if (!fs.existsSync(path.join(targetDir, "pxtarget.json"))) + fail("no pxtarget.json in " + targetDir + " (set PXT_TARGET_DIR)"); + if (!fs.existsSync(path.join(pxtDir, "built", "pxt.js"))) + fail("missing " + path.join(pxtDir, "built", "pxt.js") + " -- run npm run build first"); + + makeScratchProject(); + process.chdir(projectDir); + + // Selects the V2/CODAL-only variant. This is a variant selector rather than + // a real compile switch; see pxt.setCompileSwitch. + process.env.PXT_COMPILE_SWITCHES = "csv---" + variant; + + const cli = require(path.join(pxtDir, "built", "pxt.js")); + if (!cli || typeof cli.mainCli !== "function") + fail("built/pxt.js did not export mainCli"); + + const pxtc = global.ts.pxtc; + const origCompile = pxtc.compile; + let captured = false; + + pxtc.compile = function (opts) { + if (!captured && opts && opts.target && opts.target.isNative) { + captured = true; + writeFixture(opts); + // The emitted binary is of no interest; stop before the assembler runs. + process.exit(0); + } + return origCompile.apply(this, arguments); + }; + + cli.mainCli(targetDir, ["build"]).then(() => { + if (!captured) + fail("build finished without a native compile -- nothing captured"); + }, err => { + fail("build failed: " + (err && err.stack || err)); + }); +} + +main(); diff --git a/tests/thumb-test/thumbrunner.ts b/tests/thumb-test/thumbrunner.ts new file mode 100644 index 000000000000..67727325a604 --- /dev/null +++ b/tests/thumb-test/thumbrunner.ts @@ -0,0 +1,137 @@ +/// +/// + +import * as fs from 'fs'; +import * as path from 'path'; +import * as zlib from 'zlib'; + +import "mocha"; +import * as chai from "chai"; + +import { asmChecks, externalCases } from "./asmchecks"; + +const testDir = path.join(process.cwd(), "tests", "thumb-test"); +const casesDir = path.join(testDir, "cases"); +const fixturePath = path.join(testDir, "fixtures", "microbit-mbcodal.json.gz"); +const langTestPreludePath = path.join(process.cwd(), "tests", "compile-test", + "lang-test0", "lang-test0.ts"); + +// Native compilation runs the whole emitter plus the in-process assembler. +const TIMEOUT_MS = 30000; + +function initGlobals() { + let g = global as any + g.pxt = pxt; + g.ts = ts; + g.pxtc = pxtc; + g.btoa = (str: string) => Buffer.from(str, "binary").toString("base64"); + g.atob = (str: string) => Buffer.from(str, "base64").toString("binary"); +} + +initGlobals(); + +/** + * The fixture holds a CompileOptions environment captured from a real native + * build of the micro:bit target (see scripts/capture-fixture.js). It is kept as + * text so each case can parse its own copy and mutate it freely; the compiler + * writes back into the options it is given. + */ +function loadFixtureText(): string { + chai.assert(fs.existsSync(fixturePath), + "missing fixture " + fixturePath + " -- see tests/thumb-test/README.md"); + return zlib.gunzipSync(fs.readFileSync(fixturePath)).toString("utf8"); +} + +function optionsFor(fixtureText: string, programText: string): pxtc.CompileOptions { + const opts: pxtc.CompileOptions = JSON.parse(fixtureText).options; + + opts.fileSystem[pxt.MAIN_TS] = programText; + + opts.target.isNative = true; + opts.target.nativeType = pxtc.NATIVE_TYPE_THUMB; + opts.target.switches = opts.target.switches || {}; + // Emits the code-size stats header at the top of the listing. + opts.target.switches.size = true; + + return opts; +} + +/** + * The lang-test0 case files are written against the helpers in lang-test0.ts: + * assert(), msg() and a few shared globals. That file is small and uses only + * console.log, control.dmesg and core types, all of which the micro:bit + * fixture provides, so it is prepended verbatim instead of being restated + * here -- a hand-written stand-in would drift from the prelude the JS-side + * suite actually runs against. + */ +function langTestPrelude(): string { + chai.assert(fs.existsSync(langTestPreludePath), + "missing lang-test0 prelude " + langTestPreludePath); + return fs.readFileSync(langTestPreludePath, "utf8"); +} + +function describeDiagnostics(res: pxtc.CompileResult): string { + return res.diagnostics.map(d => { + const where = d.fileName ? d.fileName + "(" + (d.line + 1) + "," + (d.column + 1) + "): " : ""; + return where + "TS" + d.code + ": " + ts.flattenDiagnosticMessageText(d.messageText, "\n"); + }).join("\n"); +} + +describe("thumb codegen", () => { + const fixtureText = loadFixtureText(); + + const caseFiles = fs.readdirSync(casesDir) + .filter(f => f[0] !== "." && f.substr(-3) === ".ts") + .sort(); + + chai.assert(caseFiles.length > 0, "no case programs in " + casesDir); + + caseFiles.forEach(caseFile => { + it("compiles " + caseFile + " to thumb", function () { + this.timeout(TIMEOUT_MS); + + const check = asmChecks[caseFile]; + chai.assert(!!check, + "no expectation for " + caseFile + " -- add an entry to asmchecks.ts"); + + const programText = fs.readFileSync(path.join(casesDir, caseFile), "utf8"); + const opts = optionsFor(fixtureText, programText); + + const res = pxtc.compile(opts); + chai.assert(res.success, + "native compile of " + caseFile + " failed:\n" + describeDiagnostics(res)); + + const asm = res.outfiles[pxtc.BINARY_ASM]; + chai.assert(!!asm, "no " + pxtc.BINARY_ASM + " in compile result"); + + check(asm, res); + }); + }); + + // Semantic case programs kept elsewhere in the tree; see externalCases. + // They are compiled and assembled here, not executed. + const externalPaths = Object.keys(externalCases).sort(); + + externalPaths.forEach(relPath => { + it("compiles " + relPath + " to thumb", function () { + this.timeout(TIMEOUT_MS); + + const fullPath = path.join(process.cwd(), relPath); + chai.assert(fs.existsSync(fullPath), + "missing external case " + fullPath); + + const programText = langTestPrelude() + "\n" + + fs.readFileSync(fullPath, "utf8"); + const opts = optionsFor(fixtureText, programText); + + const res = pxtc.compile(opts); + chai.assert(res.success, + "native compile of " + relPath + " failed:\n" + describeDiagnostics(res)); + + const asm = res.outfiles[pxtc.BINARY_ASM]; + chai.assert(!!asm, "no " + pxtc.BINARY_ASM + " in compile result"); + + externalCases[relPath](asm, res); + }); + }); +}); diff --git a/tests/thumb-test/tsconfig.json b/tests/thumb-test/tsconfig.json new file mode 100644 index 000000000000..877a13256b5b --- /dev/null +++ b/tests/thumb-test/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "es2017", + "noImplicitAny": true, + "noImplicitReturns": true, + "declaration": true, + // rootDir keeps the emit at built/tests/thumb-test/, which is where the + // gulp test task looks for the runner. + "rootDir": "..", + "outDir": "../../built/tests", + "newLine": "LF", + "module": "commonjs", + "lib": [ + "dom", + "dom.iterable", + "es2017", + "ES2018.Promise" + ], + "types": [ + "chai", + "mocha", + "node" + ], + "sourceMap": false, + "skipLibCheck": true + }, + "files": [ + "thumbrunner.ts", + "asmchecks.ts" + ] +} From 0bff27a02c4f7c55585b2bcb04679fea2078f3f3 Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Sun, 30 Aug 2026 12:52:21 -0700 Subject: [PATCH 02/10] Add hw-ab: hardware A/B comparison tooling for micro:bit Cross-platform node scripts (macOS/Linux/Windows) to build candidate and reference hexes, flash a micro:bit, capture serial, and diff the traces, with a gcStats-based soak mode for leak detection. Driven by one wrapper: npm run hwab -- ab truthiness. --- package.json | 3 +- tests/hw-ab/.gitignore | 1 + tests/hw-ab/README.md | 332 ++++++++++++++++++++++++ tests/hw-ab/build-ab.js | 307 +++++++++++++++++++++++ tests/hw-ab/diff-ab.js | 218 ++++++++++++++++ tests/hw-ab/gen-project.js | 282 +++++++++++++++++++++ tests/hw-ab/hwab.js | 368 +++++++++++++++++++++++++++ tests/hw-ab/run-capture.js | 500 +++++++++++++++++++++++++++++++++++++ 8 files changed, 2010 insertions(+), 1 deletion(-) create mode 100644 tests/hw-ab/.gitignore create mode 100644 tests/hw-ab/README.md create mode 100644 tests/hw-ab/build-ab.js create mode 100644 tests/hw-ab/diff-ab.js create mode 100644 tests/hw-ab/gen-project.js create mode 100644 tests/hw-ab/hwab.js create mode 100644 tests/hw-ab/run-capture.js diff --git a/package.json b/package.json index 75ca88695405..1fd606b43a94 100644 --- a/package.json +++ b/package.json @@ -183,6 +183,7 @@ "update": "gulp update", "watch-streamer": "cd docs/static/streamer && tsc -t es6 --watch", "prepare": "node ./scripts/npm-prepare.js", - "compile-aw": "gh aw compile --strict" + "compile-aw": "gh aw compile --strict", + "hwab": "node tests/hw-ab/hwab.js" } } diff --git a/tests/hw-ab/.gitignore b/tests/hw-ab/.gitignore new file mode 100644 index 000000000000..89f9ac04aac6 --- /dev/null +++ b/tests/hw-ab/.gitignore @@ -0,0 +1 @@ +out/ diff --git a/tests/hw-ab/README.md b/tests/hw-ab/README.md new file mode 100644 index 000000000000..a24978ee207b --- /dev/null +++ b/tests/hw-ab/README.md @@ -0,0 +1,332 @@ +# hw-ab: hardware A/B comparison on micro:bit + +Build a candidate and a reference compiler's hexes from one checkout, run both +on a real micro:bit, and diff what the board prints. One board, three commands: + + npm run hwab -- build --v2-only --ref-switches "" + npm run hwab -- ab truthiness # also: ab lowering, ab iface + npm run hwab -- capture soak candidate --soak 30 # GC/leak watch + +Needs a micro:bit on USB and the prerequisites below. + +The programs it runs are the codegen corpus files from +`tests/compile-test/lang-test0/` named in `gen-project.js`'s `CASES` table +(coverage map: `README-codegen.md` there). + +## Contents + +| file | what it does | +| --- | --- | +| `hwab.js` | one entry point for the whole workflow; the normal interface | +| `gen-project.js` | writes one device project per case (its `CASES` table, plus soak) under `/projects/hw-ab/` | +| `build-ab.js` | builds candidate and reference hexes into `out/` | +| `run-capture.js` | flashes one hex and captures its serial output | +| `diff-ab.js` | normalizes and diffs two captures | + +`out/` is generated and gitignored. + +To add a case: add one entry to the `CASES` table in `gen-project.js`. +Everything downstream -- the build, `hwab`, the `cases` listing -- reads the +generated `cases.txt`, so nothing else needs editing. + +## Commands + +Every artifact is at a derived path -- case `C` on side `S` is +`out//.hex` and `out//.log` -- so `hwab.js` derives them and only +the case name is ever typed. A case may be named exactly or by any unique +substring of its name: `truthiness` and `iface` resolve, while an ambiguous +substring like `condition` is rejected with the candidate list. + +| command | what it does | +| --- | --- | +| `build [args...]` | builds the hexes; every argument passes through to `build-ab.js` | +| `capture [side] [--timeout ] [--soak ]` | flashes one hex and captures its serial output; side is `candidate` (default) or `reference`; `--soak` is for (and required by) the soak case | +| `diff ` | diffs the case's candidate and reference captures | +| `ab [--timeout ]` | capture candidate, capture reference, diff -- the whole per-case loop on one board | +| `cases` | lists the known cases and which hexes and logs exist right now | +| `help` | the usage summary | + +Two invocation forms: + + npm run hwab -- cases + node tests/hw-ab/hwab.js cases # cwd-independent + +Exit codes are the underlying script's, verbatim; `ab` reports the first +failing stage's. + +The underlying scripts remain directly invocable as `node tests/hw-ab/.js` +for scripting and debugging -- the wrapper only assembles their arguments, and +each script's own `--help` documents its full contract. + +## Prerequisites + +- `pxt` and `pxt-microbit` sibling checkouts, npm-linked, `pxt` CLI on PATH. +- A current `npm run build` in `pxt` -- rebuild after compiler changes. +- A populated `pxt-microbit/built/hexcache/`, so builds need no toolchain or + build service. +- One micro:bit on USB, MICROBIT drive mounted (see Platforms). + +## Two reference strategies + +**Switch-based.** One checkout, two builds: the candidate with no compile +switches, the reference with the opt-out switches that turn the change under +test off, named explicitly via `--ref-switches` (there is no default -- the +right names depend on which change is being tested). Fast, and the two hexes +are guaranteed to differ in nothing else. + +Two constraints: + +1. The compiler must actually implement the switches. PXT parses + `PXT_COMPILE_SWITCHES` name-agnostically -- an unknown switch name is + accepted silently and then never read. A misspelled or not-yet-implemented + switch therefore produces a "reference" that is a second candidate build. + `build-ab.js` compares the two hexes and refuses to continue if they are + byte-identical, rather than letting you diff a build against itself. +2. It only covers changes that are gated behind those switches. An ungated + change is in both builds and the comparison cannot see it. + +**Git-based.** Build the reference from a reference commit. Slower (a full +`npm run build` of pxt per side) but it covers every change, gated or not. This +is the gold standard; use it whenever ungated changes are in play. + + # reference side + git -C checkout + (cd && npm run build) + npm run hwab -- build --reference-only --v2-only + + # candidate side + git -C checkout + (cd && npm run build) + npm run hwab -- build --candidate-only --v2-only + +The two runs fill `out//reference.hex` and `candidate.hex` side by side +-- `out/` is preserved between runs -- and `ab ` / `diff ` then +work as usual. The preservation cuts both ways: a stale hex from an earlier +run pairs silently with a fresh one, so check `sizes.txt` if in doubt. + +## Full A/B walkthrough + +Switch-based, V2/CODAL only, naming the opt-out switches of the change under +test: + + cd + npm run hwab -- build --v2-only --ref-switches "" + +That generates the projects, builds both sides of every case, and writes +`out//{candidate,reference}.hex` plus `out/sizes.txt` (byte size and +sha256 per hex). Then, for each semantic case: + + npm run hwab -- ab truthiness + npm run hwab -- ab lowering + npm run hwab -- ab iface + +One `ab` run is the whole loop for one case on one board: it flashes the +candidate hex and captures until the board reports its verdict, then flashes the +reference hex and captures again, then diffs the two logs. It stops at the first +stage that fails and names that stage. The stages are also available one at a +time -- `capture candidate`, `capture reference`, `diff ` -- +which is what to reach for when the two sides are run on different boards or at +different times. + +`run-capture.js` exits 0 on `HWAB PASS`, 1 on `ASSERT` (printing the failing +assertion id), 2 on timeout, 3 on a host/board problem. `diff-ab.js` exits +nonzero on divergence and prints a unified diff of the normalized lines. + +A pass on both sides is not the whole story, which is why `ab` diffs even when +both captures passed: the trace lines between the banners can differ while the +final verdict does not. + +### What the device prints + + HWAB START once, after a 10 s startup delay + from the prelude's msg() + HWAB PASS repeated every 2 s, forever + +The 10 second delay and the repeating PASS both exist for the same reason: +serial capture cannot begin until the board re-enumerates after flashing, so a +program that printed its verdict once and immediately would race the capture. + +On failure the generated `assert` prints `ASSERT ` and then panics 45. The +host prelude's `assert` throws instead, and an uncaught throw on device is just +panic 999, which does not say which assertion failed -- `gen-project.js` +rewrites the prelude's assert at generation time to get a legible failure. The +rewrite is bracketed by `---- hw-ab generated replacement ----` comments in the +generated `main.ts`. + +## Soak procedure + +The `soak` project loops forever over the allocation shapes the corpus +exercises -- strings built in condition position, a map grown by computed key, +polymorphic interface dispatch over mixed class/literal receivers -- and every +five seconds forces a collection and prints the collector's own numbers: + + HWAB SOAK free= min= total= numgc= + +Those come from `control.gcStats()` (declared in +`pxt-common-packages/libs/base/gcstats.ts`, backed by `getGCStats` in +`gc.cpp`), read after an explicit `control.gc()` so that `lastFreeBytes` is +current rather than left over from whenever the runtime last collected. +`free` is `lastFreeBytes`, `min` is `minFreeBytes` (the low-water mark since +boot), `total` is the total heap in bytes, `numgc` is the collection count. + +Run both sides for at least 30 minutes each: + + npm run hwab -- capture soak candidate --soak 30 + npm run hwab -- capture soak reference --soak 30 + npm run hwab -- diff soak + +`--soak` mode exits 0 if `HWAB SOAK` lines were still arriving at the end and +1 if output stalled. The soak program has no pass/fail verdict, so `hwab` +refuses a plain capture of it (and `ab soak`) rather than running a capture +that can only time out. + +What a leak looks like: + +- `free` trends down across the run while `numgc` keeps climbing. A healthy run + oscillates around a stable `free` -- the workload allocates and the collector + reclaims it -- and `min` settles rather than falling monotonically. +- Eventually the board stops printing. That is an out-of-memory panic: the LED + matrix shows a sad face with 020 or 021. +- Compare time-to-failure, not just pass/fail. `HWAB SOAK` lines carry elapsed + milliseconds precisely so the two builds can be compared on how long they + lasted. + +`diff-ab.js` masks the elapsed and heap numbers before diffing, since they vary +legitimately between two runs of the same build; it prints the final soak line +from each log side by side for eyeballing. Heap trend analysis is out of scope +for the diff -- read the logs directly for that. + +### PXT_GC_STRESS (advanced) + +`pxt-common-packages/libs/base/gc.cpp` has a commented-out +`//#define PXT_GC_STRESS 1` near line 47. Enabling it makes the runtime collect +far more aggressively, which surfaces missing GC roots and premature frees in +minutes instead of hours -- a value that survives normal execution because a +collection never happened to run at the wrong moment will be collected out from +under the code almost immediately. + +This changes C++, not TypeScript, so it does not take effect through the +hexcache path used above. It requires a real runtime rebuild: either a local +CODAL toolchain (`pxt buildtarget` / `pxt build --local` with arm-none-eabi-gcc +and the CODAL sources fetched) or a cloud rebuild against a modified +common-packages. Budget the setup time before reaching for it, and remember to +revert the define -- a stress build's timing is not comparable with a normal +build's. + +## Interpreting device panics + +| number | meaning | +| --- | --- | +| 45 | an `assert` in the generated program failed; the id is on serial | +| 999 | unhandled thrown value (a `throw` that reached the top) | +| 020 / 021 | out of memory | + +A panic 999 in a generated case project means something threw that was not an +assertion -- the case files raise exceptions deliberately in a few places, so a +999 points at an exception escaping a `try` that should have caught it. + +## Troubleshooting + +**`no MICROBIT volume within 30s`** -- the drive is not mounted. Check the +cable is a data cable, not charge-only. If a `MAINTENANCE` drive appears +instead, DAPLink is in bootloader mode and its interface firmware needs +reflashing. See the Platforms section for where each platform looks and how to +point the script somewhere else. + +**`no found`** -- mass storage came up but the serial port did +not. Unplug and replug; if it persists the DAPLink interface firmware is likely +out of date. Note that no pxt CLI command can substitute here: `pxt console` +and `hidserial` speak HF2, and the micro:bit is DAPLink, so the capture has to +read the serial device directly. + +**`more than one `** -- another USB serial device is attached +and the capture cannot tell which board is which. Unplug the others, or name +the right one with `MICROBIT_SERIAL`. + +**`candidate and reference hexes are byte-identical`** -- the reference build +differs from the candidate only by compile switches, and those switches changed +nothing. Almost always this means the compiler on this branch does not +implement them: an unrecognised switch name is accepted silently and never +read. Check the spelling against what the compiler reads, or switch to the +git-based reference strategy. + +**Empty capture / timeout** -- the capture attached after the program had +already printed, or the board reset. The repeating PASS banner normally covers +this; an empty log with a sad face on the matrix means the program panicked +before reaching its verdict. + +**Timeout with bytes but no lines (garbage in the log)** -- the port was read +with the wrong line settings, so every byte decodes as noise. The script guards +against the usual cause on each platform (see the ordering paragraph under +Platforms). If it still happens, something else has the port open and is +reconfiguring it, or the device is not the micro:bit. + +**Build fails with `Package not installed: `** -- the generated +`pxt.json` stamps the current target version so pxt-microbit's upgrade rules do +not inject extra dependencies. If the stamp is missing the project reads as +version 0.0.0 and those rules fire. Regenerate with `gen-project.js`. + +## Platforms + +Only `run-capture.js` touches the hardware; it detects the platform itself. +Everything else is platform-independent node: + +| | macOS | Linux | Windows | +| --- | --- | --- | --- | +| MICROBIT volume | `/Volumes/MICROBIT` | `/media/$USER/MICROBIT`, `/run/media/$USER/MICROBIT`, `/media/MICROBIT` | the drive letter whose volume label is `MICROBIT`, from `Get-CimInstance Win32_LogicalDisk` | +| serial device | `/dev/cu.usbmodem*` | `/dev/ttyACM*` | the `COM` port whose name matches mbed/DAPLink/USB Serial, from `Get-CimInstance Win32_SerialPort`; opened as `\\.\COM` | +| line settings | `stty -f 115200 raw -echo` | `stty -F 115200 raw -echo` | `mode COM: BAUD=115200 PARITY=n DATA=8 STOP=1 to=off xon=off dtr=on rts=on` | + +Two environment variables override the discovery when it needs help: +`MICROBIT_VOLUME` (path or drive of the mounted drive, e.g. `/Volumes/MICROBIT` +or `E:`) and `MICROBIT_SERIAL` (serial device to read, e.g. `/dev/ttyACM0` or +`COM5`). Both accept exactly what the platform's own tools print. + +Ordering differs by platform and matters. On POSIX the device is opened first +and the settings are applied second: terminal settings reset when the last open +of a tty closes, and `stty` opens and closes the device itself, so the held fd +is what makes 115200/raw survive to the reader. On Windows the configuration +belongs to the port rather than to a handle, so `mode` runs before the handle is +opened. `dtr=on` is not optional there -- a CDC device may transmit nothing +until DTR is asserted. + +Linux permissions: opening `/dev/ttyACM*` usually requires membership in the +`dialout` group (`sudo usermod -a -G dialout $USER`, then log in again). + +### Windows troubleshooting + +**No MICROBIT drive letter.** Check what Windows sees: + + powershell -NoProfile -Command "Get-CimInstance Win32_LogicalDisk | Select-Object DeviceID,VolumeName" + +If no volume is labelled `MICROBIT` the board is not in mass-storage mode -- the +cable may be charge-only, or a `MAINTENANCE` label means DAPLink is in +bootloader mode and needs its interface firmware reflashed. If the drive is +there under a different label, point the script at it with `MICROBIT_VOLUME=E:`. + +**No COM port.** Check what the port is called: + + powershell -NoProfile -Command "Get-CimInstance Win32_SerialPort | Select-Object DeviceID,Name" + +Device Manager lists the same port under Ports (COM & LPT). If the port exists +but its name does not mention mbed, DAPLink or USB Serial, name it directly with +`MICROBIT_SERIAL=COM5`. If there is no port at all, the DAPLink interface +firmware or its Windows serial driver is missing. + +**`mode` fails.** Another program is holding the port -- the MakeCode editor's +serial view, PuTTY, Tera Term, the Arduino IDE. Close it and rerun; only one +program may configure and read the port at a time. + +WSL2 also works, through the Linux path: pass the board through with +[usbipd-win](https://github.com/dorssel/usbipd-win) so the board appears as +`/dev/ttyACM*`, and mount the Windows-side MICROBIT drive into WSL +(`sudo mount -t drvfs E: /mnt/microbit`, then `MICROBIT_VOLUME=/mnt/microbit`). +The native Windows path needs none of that. + +**Manual (no setup, any platform).** Copy the hex onto the MICROBIT drive in +Explorer or Finder, then watch the board's serial port at 115200 8N1 in any +serial terminal (PuTTY, or the MakeCode editor's serial view). The verdict is +readable by eye: the program prints `HWAB START `, then either +`HWAB PASS ` repeatedly or `ASSERT ` followed by a sad face and 45 on +the LED matrix; the soak build prints `HWAB SOAK` lines whose `free=` value +should stay flat. diff --git a/tests/hw-ab/build-ab.js b/tests/hw-ab/build-ab.js new file mode 100644 index 000000000000..319067efcba0 --- /dev/null +++ b/tests/hw-ab/build-ab.js @@ -0,0 +1,307 @@ +/* + * Builds candidate and reference hexes for every hw-ab device project. + * + * The candidate is this checkout's compiler with no switches. The reference is + * the same compiler with opt-out switches set, which is only meaningful when + * the compiler actually implements them; see the identical-hash guard below. + */ + +"use strict"; + +const fs = require("fs"); +const path = require("path"); +const crypto = require("crypto"); +const { spawnSync } = require("child_process"); + +const isWindows = process.platform === "win32"; + +const hwabDir = __dirname; +const pxtDir = path.resolve(hwabDir, "..", ".."); +const targetSpec = process.env.PXT_TARGET_DIR || path.join(pxtDir, "..", "pxt-microbit"); +const outDir = path.join(hwabDir, "out"); + +const USAGE = [ + "Usage: node tests/hw-ab/build-ab.js [options]", + "", + "Builds the hw-ab device projects twice -- once as the candidate (this", + "checkout's compiler, no switches) and once as the reference -- and collects the", + "hexes into tests/hw-ab/out//{candidate,reference}.hex.", + "", + "Options:", + " --ref-switches \"\" compile switches for the reference build; required", + " when both sides build in one run. Name the opt-out", + " switches of the codegen change under test -- there", + " is no default, because a wrong or missing switch", + " name silently builds a second candidate (see", + " below).", + " --v2-only build only the V2/CODAL variant, by adding the", + " csv---mbcodal variant selector to BOTH builds", + " --candidate-only build only the candidate", + " --reference-only build only the reference; without --ref-switches", + " this builds the current checkout as-is and files", + " it under reference.hex (the git-based strategy)", + " -h, --help this text", + "", + "Environment:", + " PXT_TARGET_DIR target checkout (default: sibling ../pxt-microbit)", + "", + "Two reference strategies", + "------------------------", + "Switch-based (--ref-switches): one checkout, two builds, fast. It only", + "works if the compiler on this branch implements the named opt-out switches.", + "PXT parses PXT_COMPILE_SWITCHES name-agnostically, so an unknown switch is", + "accepted silently and never read -- the \"reference\" is then byte-identical to", + "the candidate. This script detects that and fails; it does not guess.", + "", + "It also only covers changes that are gated behind those switches. Any ungated", + "change is present in both builds and invisible to the comparison.", + "", + "Git-based (gold standard): build the reference from a reference commit.", + "", + " # reference side", + " git -C checkout && npm run build", + " node tests/hw-ab/build-ab.js --reference-only --v2-only", + "", + " # candidate side", + " git -C checkout && npm run build", + " node tests/hw-ab/build-ab.js --candidate-only --v2-only", + "", + "The two runs fill out//reference.hex and candidate.hex side by side;", + "out/ is preserved between runs. That also means a stale hex from an earlier", + "run will happily pair with a fresh one -- check sizes.txt if in doubt.", + "", + "Exit codes: 0 built, 1 usage or build error, 3 identical-hash guard tripped." +].join("\n"); + +function usage(stream) { + stream.write(USAGE + "\n"); +} + +function fail(msg) { + process.stderr.write("build-ab: " + msg + "\n"); + process.exit(1); +} + +let refSwitches = ""; +let v2Only = false; +let doCandidate = true; +let doReference = true; + +const argv = process.argv.slice(2); +for (let i = 0; i < argv.length; i++) { + const arg = argv[i]; + if (arg === "--ref-switches") { + if (i + 1 >= argv.length) fail("--ref-switches needs a value"); + refSwitches = argv[++i]; + } else if (arg === "--v2-only") { + v2Only = true; + } else if (arg === "--candidate-only") { + doReference = false; + } else if (arg === "--reference-only") { + doCandidate = false; + } else if (arg === "-h" || arg === "--help") { + usage(process.stdout); + process.exit(0); + } else { + usage(process.stderr); + fail("unknown argument: " + arg); + } +} + +if (!doCandidate && !doReference) + fail("--candidate-only and --reference-only are mutually exclusive"); + +// A switch-less reference is only a hazard when the candidate builds in the +// same run -- it would be a second candidate and the A/B would compare a +// build with itself. Reference-only with no switches is the git-based +// strategy: the current checkout IS the reference. +if (doReference && doCandidate && !refSwitches) + fail("building both sides in one run needs --ref-switches \"\" " + + "naming the opt-out switches of the change under test, or use the " + + "git-based strategy (--reference-only / --candidate-only per " + + "checkout; see --help)"); + +let targetDir = ""; +try { + const resolved = fs.realpathSync(targetSpec); + if (fs.statSync(resolved).isDirectory()) targetDir = resolved; +} catch (e) { + targetDir = ""; +} +if (!targetDir || !fs.existsSync(path.join(targetDir, "pxtarget.json"))) + fail("no pxtarget.json in '" + targetSpec + "' (set PXT_TARGET_DIR)"); + +// A PATH lookup, not a trial run: `pxt --version` exits nonzero when it is not +// invoked inside a target checkout, so its exit status cannot answer "is the +// CLI installed". +function onPath(cmd) { + const dirs = (process.env.PATH || "").split(path.delimiter).filter(Boolean); + const exts = isWindows + ? (process.env.PATHEXT || ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean) + : [""]; + for (const dir of dirs) { + for (const ext of exts) { + try { + fs.accessSync(path.join(dir, cmd + ext), fs.constants.X_OK); + return true; + } catch (e) { /* keep looking */ } + } + } + return false; +} + +if (!onPath("pxt")) + fail("no 'pxt' on PATH -- install the pxt CLI (npm i -g pxt)"); +if (!fs.existsSync(path.join(pxtDir, "built", "pxt.js"))) + fail("missing " + path.join(pxtDir, "built", "pxt.js") + + " -- run 'npm run build' in " + pxtDir + " first"); + +const projRoot = path.join(targetDir, "projects", "hw-ab"); + +function sha256(file) { + return crypto.createHash("sha256").update(fs.readFileSync(file)).digest("hex"); +} + +function nowSeconds() { + return Math.floor(Date.now() / 1000); +} + +function pad(s, width) { + return s.length >= width ? s : s + " ".repeat(width - s.length); +} + +// The variant selector is not a compile switch; it picks the V2/CODAL-only +// build instead of the universal V1+V2 hex. It must be identical on both sides. +const variantSw = v2Only ? "csv---mbcodal" : ""; + +function joinSwitches(a, b) { + return a && b ? a + "," + b : a + b; +} + +process.stdout.write("build-ab: pxt " + pxtDir + "\n"); +process.stdout.write("build-ab: target " + targetDir + "\n"); +process.stdout.write("build-ab: variant " + (variantSw || "") + "\n"); +process.stdout.write("build-ab: ref sw " + + (!doReference ? "" : refSwitches || "") + "\n"); +process.stdout.write("\n"); + +const gen = spawnSync(process.execPath, [path.join(hwabDir, "gen-project.js")], + { stdio: "inherit" }); +if (gen.error) fail("could not run gen-project.js: " + gen.error.message); +if (gen.status !== 0) process.exit(gen.status === null ? 1 : gen.status); +const casesFile = path.join(projRoot, "cases.txt"); +if (!fs.existsSync(casesFile)) fail("gen-project.js produced no cases.txt"); +process.stdout.write("\n"); + +function buildOne(caseName, mode, switches) { + const proj = path.join(projRoot, caseName); + const dest = path.join(outDir, caseName, mode + ".hex"); + const logPath = path.join(outDir, caseName, mode + ".build.log"); + + if (!fs.existsSync(proj)) fail("missing project " + proj); + fs.mkdirSync(path.dirname(dest), { recursive: true }); + + // A stale built/ can hand back the previous mode's output. + fs.rmSync(path.join(proj, "built"), { recursive: true, force: true }); + + process.stdout.write("build-ab: " + pad(caseName, 22) + " " + pad(mode, 10) + + " switches=" + (switches || "") + "\n"); + const t0 = nowSeconds(); + + const env = Object.assign({}, process.env); + if (switches) env.PXT_COMPILE_SWITCHES = switches; + else delete env.PXT_COMPILE_SWITCHES; + + // shell:true on Windows so the pxt.cmd shim resolves; the log fd is handed + // to both stdout and stderr so the two interleave as they did on a console. + const logFd = fs.openSync(logPath, "w"); + let res; + try { + res = spawnSync("pxt", ["build"], { + cwd: proj, + env: env, + stdio: ["ignore", logFd, logFd], + shell: isWindows + }); + } finally { + fs.closeSync(logFd); + } + + if (res.error || res.status !== 0) { + const log = fs.existsSync(logPath) ? fs.readFileSync(logPath, "utf8") : ""; + const lines = log.split("\n"); + if (lines.length && lines[lines.length - 1] === "") lines.pop(); + for (const line of lines) process.stderr.write(" | " + line + "\n"); + if (res.error) process.stderr.write(" | " + res.error.message + "\n"); + fail(caseName + "/" + mode + " build failed (log above)"); + } + const t1 = nowSeconds(); + + const binary = path.join(proj, "built", "binary.hex"); + if (!fs.existsSync(binary)) fail(caseName + "/" + mode + " built no binary.hex"); + fs.copyFileSync(binary, dest); + process.stdout.write("build-ab: -> " + dest + " (" + + fs.statSync(dest).size + " bytes, " + (t1 - t0) + "s)\n"); +} + +fs.mkdirSync(outDir, { recursive: true }); +const sizesFile = path.join(outDir, "sizes.txt"); +fs.writeFileSync(sizesFile, [ + "# hw-ab build " + new Date().toISOString().replace(/\.[0-9]{3}Z$/, "Z"), + "# variant: " + (variantSw || "universal"), + "# reference switches: " + refSwitches, + "# case mode bytes sha256", + "" +].join("\n")); + +const identical = []; +const cases = fs.readFileSync(casesFile, "utf8").split("\n") + .map(l => l.replace(/\r$/, "")) + .filter(l => l.length > 0); + +for (const caseName of cases) { + fs.mkdirSync(path.join(outDir, caseName), { recursive: true }); + + if (doCandidate) buildOne(caseName, "candidate", variantSw); + if (doReference) buildOne(caseName, "reference", joinSwitches(variantSw, refSwitches)); + + for (const mode of ["candidate", "reference"]) { + const hex = path.join(outDir, caseName, mode + ".hex"); + if (!fs.existsSync(hex)) continue; + fs.appendFileSync(sizesFile, caseName + " " + mode + " " + + fs.statSync(hex).size + " " + sha256(hex) + "\n"); + } + + if (doCandidate && doReference) { + if (sha256(path.join(outDir, caseName, "candidate.hex")) === + sha256(path.join(outDir, caseName, "reference.hex"))) { + identical.push(caseName); + } + } + process.stdout.write("\n"); +} + +process.stdout.write("build-ab: sizes -> " + sizesFile + "\n"); + +if (identical.length) { + process.stderr.write([ + "", + "build-ab: ERROR -- candidate and reference hexes are byte-identical for:", + "build-ab: " + identical.join(" "), + "", + "The reference build differs from the candidate only by the compile switches", + "\"" + refSwitches + "\". Identical output means those switches changed nothing.", + "The likely cause is that the compiler on this branch does not implement them:", + "PXT_COMPILE_SWITCHES is parsed name-agnostically, so an unrecognised switch", + "name is accepted silently and then never read, and the \"reference\" build is", + "just a second candidate build.", + "", + "Check that the switch names are spelled as the compiler reads them, or use the", + "git-based reference strategy instead (build-ab.js --help). An A/B run against", + "an identical hex would compare a build with itself and always report \"same\".", + "" + ].join("\n")); + process.exit(3); +} + +process.stdout.write("build-ab: done\n"); diff --git a/tests/hw-ab/diff-ab.js b/tests/hw-ab/diff-ab.js new file mode 100644 index 000000000000..308283fe2b27 --- /dev/null +++ b/tests/hw-ab/diff-ab.js @@ -0,0 +1,218 @@ +/* + * Compares two hw-ab serial captures. + * + * Only the lines that carry a verdict or a trace are compared: HWAB banners, + * ASSERT failures, and the prelude's own msg() progress lines. Everything a + * capture picks up incidentally is dropped, and the parts of a line that vary + * legitimately between two runs of the same build -- elapsed milliseconds and + * heap byte counts on soak lines -- are masked before the comparison. + */ + +"use strict"; + +const fs = require("fs"); + +const USAGE = [ + "Usage: node tests/hw-ab/diff-ab.js ", + "", + "Normalizes two run-capture.js logs and diffs them.", + "", + "Normalization:", + " - CR stripped, blank lines dropped", + " - everything before the first \"HWAB START\" banner is discarded, since a", + " capture can attach part way through a line", + " - HWAB banners, ASSERT failures and the lang-test0 msg() trace lines are all", + " compared; a leading \"[12345]\" or \"123ms\" timestamp is stripped", + " - \"HWAB SOAK free=.. min=.. total=.. numgc=..\" collapses to", + " \"HWAB SOAK \" -- soak timing and heap numbers vary between runs", + " and are not a divergence", + " - repeated identical lines collapse to one (the PASS banner and the START", + " banner both repeat by design)", + "", + "Soak heap trend is out of scope. The final heap line from each log is printed", + "side by side so the two can be eyeballed, but it does not affect the exit code.", + "", + "Exit codes: 0 identical, 1 divergence (a unified diff is printed), 2 usage." +].join("\n"); + +function usage(stream) { + stream.write(USAGE + "\n"); +} + +// Splits file text into lines the way the line tools do: a trailing newline +// terminates the last line rather than starting an empty one, while a final +// unterminated fragment is still a line. +function splitLines(text) { + const lines = text.split("\n"); + if (lines.length && lines[lines.length - 1] === "") lines.pop(); + return lines; +} + +function normalize(file) { + const raw = splitLines(fs.readFileSync(file, "utf8").replace(/\r/g, "")); + + // Serial capture can attach part way through a line, so the sync point is + // the first HWAB START banner; everything before it is discarded. A log + // with no banner at all (capture attached after the program had run) keeps + // all of its lines except the first, which is the one that can be a + // fragment. + let start = 0; + for (let i = 0; i < raw.length; i++) { + if (raw[i].indexOf("HWAB START") >= 0) { start = i + 1; break; } + } + const from = start ? start : 2; + + const out = []; + let prev = null; + for (let i = from - 1; i < raw.length; i++) { + const line = raw[i] + .replace(/^\[[0-9]+\][ \t]*/, "") + .replace(/^[0-9]+ms[ \t]+/, "") + .replace(/^HWAB SOAK [0-9]+ .*$/, "HWAB SOAK "); + // Blank lines are dropped without resetting the duplicate filter. + if (!/[^ \t]/.test(line)) continue; + if (line === prev) continue; + out.push(line); + prev = line; + } + return out; +} + +function finalHeap(file) { + const lines = splitLines(fs.readFileSync(file, "utf8").replace(/\r/g, "")); + let last = ""; + for (const line of lines) { + if (line.indexOf("HWAB SOAK ") >= 0) last = line; + } + return last || "(no soak lines)"; +} + +// Longest common subsequence over whole lines; the logs compared here are a few +// hundred lines at most, so the quadratic table is not worth avoiding. +function lcsTable(a, b) { + const rows = a.length + 1; + const cols = b.length + 1; + const table = new Uint32Array(rows * cols); + for (let i = a.length - 1; i >= 0; i--) { + for (let j = b.length - 1; j >= 0; j--) { + table[i * cols + j] = a[i] === b[j] + ? table[(i + 1) * cols + (j + 1)] + 1 + : Math.max(table[(i + 1) * cols + j], table[i * cols + (j + 1)]); + } + } + return table; +} + +// Returns the edit script as {op, line} entries, op in " ", "-", "+". +function diffLines(a, b) { + const cols = b.length + 1; + const table = lcsTable(a, b); + const script = []; + let i = 0, j = 0; + while (i < a.length && j < b.length) { + if (a[i] === b[j]) { + script.push({ op: " ", line: a[i] }); i++; j++; + } else if (table[(i + 1) * cols + j] >= table[i * cols + (j + 1)]) { + script.push({ op: "-", line: a[i] }); i++; + } else { + script.push({ op: "+", line: b[j] }); j++; + } + } + while (i < a.length) script.push({ op: "-", line: a[i++] }); + while (j < b.length) script.push({ op: "+", line: b[j++] }); + return script; +} + +// A range of zero lines is reported against the line before it, and a range of +// one line omits the count -- the conventions unified diff readers expect. +function range(start, len) { + if (len === 0) return (start - 1) + ",0"; + if (len === 1) return String(start); + return start + "," + len; +} + +function unifiedDiff(a, b, labelA, labelB, context) { + const script = diffLines(a, b); + if (!script.some(e => e.op !== " ")) return null; + + // Group the script into hunks: every changed entry plus `context` unchanged + // entries on each side, merged when their context windows touch. + const changed = []; + script.forEach((e, idx) => { if (e.op !== " ") changed.push(idx); }); + const hunks = []; + let k = 0; + while (k < changed.length) { + let lo = Math.max(0, changed[k] - context); + let hi = Math.min(script.length - 1, changed[k] + context); + k++; + while (k < changed.length && changed[k] - context <= hi + 1) { + hi = Math.min(script.length - 1, changed[k] + context); + k++; + } + hunks.push([lo, hi]); + } + + // Lines of each file consumed before each script entry, so a hunk header + // can name the 1-based line each side starts at. + const aBefore = new Array(script.length); + const bBefore = new Array(script.length); + let an = 0, bn = 0; + script.forEach((e, idx) => { + aBefore[idx] = an; + bBefore[idx] = bn; + if (e.op !== "+") an++; + if (e.op !== "-") bn++; + }); + + const out = ["--- " + labelA, "+++ " + labelB]; + for (const [lo, hi] of hunks) { + let aLen = 0, bLen = 0; + for (let idx = lo; idx <= hi; idx++) { + if (script[idx].op !== "+") aLen++; + if (script[idx].op !== "-") bLen++; + } + out.push("@@ -" + range(aBefore[lo] + 1, aLen) + + " +" + range(bBefore[lo] + 1, bLen) + " @@"); + for (let idx = lo; idx <= hi; idx++) { + out.push(script[idx].op + script[idx].line); + } + } + return out.join("\n") + "\n"; +} + +function main(argv) { + if (argv.length !== 2) { usage(process.stderr); return 2; } + for (const f of argv) { + let ok = false; + try { ok = fs.statSync(f).isFile(); } catch (e) { ok = false; } + if (!ok) { + process.stderr.write("diff-ab: no such log: " + f + "\n"); + return 2; + } + } + + const a = argv[0]; + const b = argv[1]; + const na = normalize(a); + const nb = normalize(b); + + if (na.concat(nb).some(l => l.indexOf("HWAB SOAK") >= 0)) { + process.stdout.write("diff-ab: final soak line\n"); + process.stdout.write(" A (" + a + "): " + finalHeap(a) + "\n"); + process.stdout.write(" B (" + b + "): " + finalHeap(b) + "\n"); + process.stdout.write("\n"); + } + + const d = unifiedDiff(na, nb, "A " + a, "B " + b, 3); + if (!d) { + process.stdout.write( + "diff-ab: identical (" + na.length + " normalized line(s))\n"); + return 0; + } + + process.stderr.write("diff-ab: DIVERGENCE\n"); + process.stderr.write(d); + return 1; +} + +process.exitCode = main(process.argv.slice(2)); diff --git a/tests/hw-ab/gen-project.js b/tests/hw-ab/gen-project.js new file mode 100644 index 000000000000..0d7e6346324f --- /dev/null +++ b/tests/hw-ab/gen-project.js @@ -0,0 +1,282 @@ +/* + * Generates micro:bit device projects for the hardware A/B comparison. + * + * Each project is a standalone pxt project under + * /projects/hw-ab// that can be built with `pxt build` and + * flashed to a board. One project is generated per semantic case file in + * tests/compile-test/lang-test0 (the case files cannot be merged: their + * top-level names collide), plus a `soak` project used for leak detection. + * + * A generated main.ts is: + * + * header banner + startup delay so a serial capture can attach + * prelude tests/compile-test/lang-test0/lang-test0.ts, with its throwing + * `assert` textually replaced by one that prints "ASSERT " to + * serial and then panics 45 (the lang-test1 convention). A thrown + * string on device surfaces only as panic 999, which carries no + * identity; the rewrite is what makes a device failure legible. + * body the case file text, verbatim + * footer prints "HWAB PASS " on a loop and never resets + * + * The trailing PASS loop and the startup delay both exist because serial + * capture cannot begin until the board has re-enumerated after flashing: a + * program that printed its result once, early, would race the capture. + * + * Usage: + * node tests/hw-ab/gen-project.js + * + * Environment: + * PXT_TARGET_DIR target checkout to generate into + * (default: sibling ../pxt-microbit) + */ + +"use strict"; + +const fs = require("fs"); +const path = require("path"); + +const pxtDir = path.resolve(__dirname, "..", ".."); +const targetDir = path.resolve( + process.env.PXT_TARGET_DIR || path.join(pxtDir, "..", "pxt-microbit")); +const langTest0Dir = path.join(pxtDir, "tests", "compile-test", "lang-test0"); +const outRoot = path.join(targetDir, "projects", "hw-ab"); + +// Milliseconds the device idles before running anything, so that the host has +// time to reopen the serial device after the post-flash reset. +const START_DELAY_MS = 10000; +// Interval of the trailing PASS heartbeat and of the soak progress line. +const PASS_INTERVAL_MS = 2000; +const SOAK_INTERVAL_MS = 5000; + +// case name -> lang-test0 source file +const CASES = { + "conditiontruthiness": "54conditiontruthiness.ts", + "conditionlowering": "55conditionlowering.ts", + "ifacedispatch": "56ifacedispatch.ts" +}; + +// Exact text of the host prelude's assert. Matching it exactly rather than by +// regex is deliberate: if the prelude changes shape, generation fails loudly +// instead of silently emitting a program whose failures are invisible. +const HOST_ASSERT = + "function assert(cond: boolean, m?: string) {\n" + + " if (!cond) {\n" + + " throw `assertion failed: ${m || \"\"}`;\n" + + " }\n" + + "}\n"; + +const DEVICE_ASSERT = + "// ---- hw-ab generated replacement -------------------------------------\n" + + "// The host prelude's assert throws. An uncaught throw on device is just\n" + + "// panic 999, which does not say which assertion failed, so the device\n" + + "// build prints the assertion id to serial first and then panics 45.\n" + + "//% shim=pxtrt::panic\n" + + "function panic(code2: number): void { }\n" + + "\n" + + "function assert(cond: boolean, m?: string) {\n" + + " if (!cond) {\n" + + " console.log(\"ASSERT \" + (m || \"?\"))\n" + + " control.dmesg(\"ASSERT \" + (m || \"?\"))\n" + + " panic(45)\n" + + " }\n" + + "}\n" + + "// ---- end hw-ab generated replacement ----------------------------------\n"; + +function fail(msg) { + console.error("gen-project: " + msg); + process.exit(1); +} + +function targetVersion() { + // Stamping the current target version keeps the target's "upgrades" rules + // from injecting extra dependencies (they are all gated on older + // versions). Without the stamp the project reads as version 0.0.0, + // pxt-microbit's missingPackage rules match it, and the build dies with an + // error like "Package not installed: microphone". + const pkg = path.join(targetDir, "package.json"); + return JSON.parse(fs.readFileSync(pkg, "utf8")).version; +} + +function devicePrelude() { + const src = fs.readFileSync(path.join(langTest0Dir, "lang-test0.ts"), "utf8"); + if (src.indexOf(HOST_ASSERT) < 0) + fail("lang-test0.ts prelude no longer contains the expected throwing " + + "assert -- update HOST_ASSERT in gen-project.js"); + return src.replace(HOST_ASSERT, DEVICE_ASSERT); +} + +function header(name) { + return [ + "// Generated by tests/hw-ab/gen-project.js -- do not edit.", + "// Case: " + name, + "", + "// Serial capture cannot start until the board re-enumerates after", + "// flashing, so nothing is printed for the first " + START_DELAY_MS + " ms.", + "basic.pause(" + START_DELAY_MS + ")", + "console.log(\"HWAB START " + name + "\")", + "control.dmesg(\"HWAB START " + name + "\")", + "" + ].join("\n"); +} + +function footer(name) { + return [ + "", + "// Reaching here means every assertion held. Repeat the verdict so a", + "// capture that attached late still sees it, and never reset.", + "while (true) {", + " console.log(\"HWAB PASS " + name + "\")", + " control.dmesg(\"HWAB PASS " + name + "\")", + " basic.pause(" + PASS_INTERVAL_MS + ")", + "}", + "" + ].join("\n"); +} + +// The soak body is written here rather than imported from the case files: it +// needs the allocation shapes those files exercise, not their assertions, and +// it has to run forever. The three shapes are the ones whose codegen the A/B +// is about -- string building in condition position, growth of a dynamically +// keyed map, and polymorphic interface dispatch over mixed receivers. +function soakBody() { + return [ + "namespace Soak {", + " interface SoakIface {", + " soakVal(): number", + " }", + "", + " class SoakClass implements SoakIface {", + " n: number", + " constructor(n: number) {", + " this.n = n", + " }", + " soakVal(): number {", + " return this.n", + " }", + " }", + "", + " function useSoak(v: SoakIface): number {", + " return v.soakVal() + 1", + " }", + "", + " // Freshly built strings and arrays evaluated in condition position.", + " function churnConditions() {", + " let s = \"x\"", + " let i = 0", + " while ((s + i).length < 24) {", + " i++", + " s = s + \"y\"", + " }", + " const base = [1, 2, 3, 4, 5]", + " let k = 0", + " let seen = 0", + " while (base.slice(0, (k % 5) + 1).length > 0 && k < 200) {", + " seen += base.slice(k % 5).length", + " k++", + " }", + " assert(seen == 600, \"soak:slice\")", + " let m = 0", + " while (({ v: m }).v < 150 || m < 0) m++", + " assert(m == 150, \"soak:obj\")", + " }", + "", + " // A map grown by computed key, then discarded.", + " function churnMap() {", + " const o: any = {}", + " for (let i = 0; i < 60; i++) o[\"soakKey\" + i] = i", + " let tot = 0", + " for (let i = 0; i < 60; i++) tot += o[\"soakKey\" + i]", + " assert(tot == 1770, \"soak:map\")", + " }", + "", + " // The same call site over class instances and object literals.", + " function churnDispatch() {", + " const mixed: SoakIface[] = []", + " for (let i = 0; i < 40; i++) {", + " if (i % 2 == 0) mixed.push(new SoakClass(i))", + " else mixed.push({ soakVal: () => i })", + " }", + " let tot = 0", + " for (const mm of mixed) tot += useSoak(mm)", + " assert(tot == 820, \"soak:dispatch\")", + " }", + "", + " // Free bytes reported after a forced collection. Undefined until", + " // the first GC has run, hence the explicit control.gc() call.", + " function heapMetric(): string {", + " control.gc()", + " const st = control.gcStats()", + " if (!st) return \"free=na\"", + " return \"free=\" + st.lastFreeBytes +", + " \" min=\" + st.minFreeBytes +", + " \" total=\" + st.totalBytes +", + " \" numgc=\" + st.numGC", + " }", + "", + " export function run() {", + " const t0 = control.millis()", + " let next = 0", + " while (true) {", + " churnConditions()", + " churnMap()", + " churnDispatch()", + " const el = control.millis() - t0", + " if (el >= next) {", + " const line = \"HWAB SOAK \" + el + \" \" + heapMetric()", + " console.log(line)", + " control.dmesg(line)", + " next = el + " + SOAK_INTERVAL_MS, + " }", + " }", + " }", + "}", + "", + "Soak.run()", + "" + ].join("\n"); +} + +function writeProject(name, mainTs, version) { + const dir = path.join(outRoot, name); + fs.mkdirSync(dir, { recursive: true }); + fs.writeFileSync(path.join(dir, "pxt.json"), JSON.stringify({ + name: "hw-ab-" + name, + description: "hw-ab device project (generated) -- " + name, + dependencies: { core: "file:../../../libs/core" }, + files: ["main.ts"], + targetVersions: { target: version }, + supportedTargets: ["microbit"] + }, null, 4) + "\n"); + fs.writeFileSync(path.join(dir, "main.ts"), mainTs); + console.log("gen-project: " + dir + " (" + mainTs.length + " bytes main.ts)"); + return dir; +} + +function main() { + if (!fs.existsSync(path.join(targetDir, "pxtarget.json"))) + fail("no pxtarget.json in " + targetDir + " (set PXT_TARGET_DIR)"); + + const version = targetVersion(); + const prelude = devicePrelude(); + const names = []; + + for (const name of Object.keys(CASES)) { + const caseFile = path.join(langTest0Dir, CASES[name]); + if (!fs.existsSync(caseFile)) + fail("missing case file " + caseFile); + const body = fs.readFileSync(caseFile, "utf8"); + writeProject(name, header(name) + prelude + "\n" + body + "\n" + footer(name), + version); + names.push(name); + } + + // The soak program never passes or fails; it prints progress until the + // operator stops it or the heap gives out. + writeProject("soak", header("soak") + prelude + "\n" + soakBody(), version); + names.push("soak"); + + fs.writeFileSync(path.join(outRoot, "cases.txt"), names.join("\n") + "\n"); + console.log("gen-project: " + names.length + " projects in " + outRoot); +} + +main(); diff --git a/tests/hw-ab/hwab.js b/tests/hw-ab/hwab.js new file mode 100644 index 000000000000..51436b47a88b --- /dev/null +++ b/tests/hw-ab/hwab.js @@ -0,0 +1,368 @@ +/* + * One entry point for the hw-ab workflow. + * + * The underlying scripts take full paths, which are long enough to mistype and + * are fully derivable from a case name and a side: every artifact of case C on + * side S lives at tests/hw-ab/out//.{hex,log}. This wrapper does that + * derivation, resolves a case name from any unique substring of it, and hands + * the result to build-ab.js / run-capture.js / diff-ab.js unchanged. + * + * It adds no behaviour of its own beyond the `ab` sequence: each command is a + * single child process whose exit code is passed through verbatim, so the exit + * codes documented for those scripts are the exit codes seen here. + * + * Paths are resolved from this file's location, never from the working + * directory, so the command works from anywhere. + */ + +"use strict"; + +const fs = require("fs"); +const path = require("path"); +const { spawnSync } = require("child_process"); + +const hwabDir = __dirname; +const pxtDir = path.resolve(hwabDir, "..", ".."); +const outDir = path.join(hwabDir, "out"); + +// Same resolution as gen-project.js and build-ab.js: PXT_TARGET_DIR, else the +// sibling pxt-microbit checkout. +const targetSpec = process.env.PXT_TARGET_DIR || path.join(pxtDir, "..", "pxt-microbit"); + +const SIDES = ["candidate", "reference"]; + +// The soak program (generated by gen-project.js alongside the CASES table) +// prints HWAB SOAK heap telemetry forever and never a HWAB PASS verdict, so a +// plain capture of it +// can only time out, and a soak-mode capture of any other case can only +// report a stall. Both mismatches are refused up front. +const SOAK_CASE = "soak"; + +const USAGE = [ + "Usage: node tests/hw-ab/hwab.js [args]", + " npm run hwab -- [args]", + "", + "One entry point for the hw-ab hardware A/B workflow. Hex and log paths are", + "derived from the case name and the side, so only the case is ever typed:", + "case C on side S is tests/hw-ab/out//.{hex,log}.", + "", + "Commands:", + " build [args...] build the hexes; every argument is passed to", + " build-ab.js unchanged (--help lists them)", + " capture [side] flash one hex and capture its serial output;", + " [--timeout ] side is candidate (default) or reference.", + " [--soak ] --soak is for the soak case, which prints", + " heap telemetry instead of a verdict", + " diff diff the case's candidate and reference logs", + " ab [--timeout ] the whole per-case loop on one board: capture", + " candidate, capture reference, then diff", + " cases list the known cases and which hexes and logs", + " exist right now", + " help this text", + "", + "A case may be named exactly or by any unique substring of its name, so", + "\"truthiness\" and \"iface\" resolve; an ambiguous substring like \"condition\"", + "is rejected with the candidate list rather than guessed.", + "", + "Examples:", + " npm run hwab -- build --v2-only --ref-switches \"\"", + " npm run hwab -- ab truthiness", + " node tests/hw-ab/hwab.js ab truthiness", + "", + "Exit codes: the invoked script's own code, verbatim; `ab` reports the first", + "failing stage's. 0 for help, 2 for an unknown command or bad arguments." +].join("\n"); + +function usage(stream) { + stream.write(USAGE + "\n"); +} + +// Exit 2 is this wrapper's own "you asked for something I cannot turn into a +// command" code; it never overlaps with a child's, because no child runs. +function fail(msg) { + process.stderr.write("hwab: " + msg + "\n"); + process.exit(2); +} + +function say(msg) { + process.stdout.write("hwab: " + msg + "\n"); +} + +// ---- case names ----------------------------------------------------------- + +function targetDir() { + try { + const resolved = fs.realpathSync(targetSpec); + if (fs.statSync(resolved).isDirectory()) return resolved; + } catch (e) { /* no target checkout */ } + return ""; +} + +function isDir(p) { + try { return fs.statSync(p).isDirectory(); } catch (e) { return false; } +} + +// The generated cases.txt is authoritative -- it is what build-ab.js iterates. +// out/ is the fallback for a checkout with no target beside it, and is enough +// for anything that only reads already-built artifacts. +function knownCases() { + const target = targetDir(); + if (target) { + const casesFile = path.join(target, "projects", "hw-ab", "cases.txt"); + if (fs.existsSync(casesFile)) { + const names = fs.readFileSync(casesFile, "utf8").split("\n") + .map(l => l.replace(/\r$/, "")) + .filter(l => l.length > 0); + if (names.length) return { names: names, source: casesFile }; + } + } + if (isDir(outDir)) { + const names = fs.readdirSync(outDir) + .filter(e => isDir(path.join(outDir, e))).sort(); + if (names.length) return { names: names, source: outDir }; + } + fail("no cases known yet -- neither " + + path.join(targetSpec, "projects", "hw-ab", "cases.txt") + " nor " + + outDir + " lists any.\n" + + " Run the build first: npm run hwab -- build --candidate-only --v2-only"); +} + +function resolveCase(name) { + const known = knownCases(); + if (known.names.indexOf(name) >= 0) return name; + const hits = known.names.filter(n => n.indexOf(name) >= 0); + if (hits.length === 1) return hits[0]; + if (hits.length > 1) + fail("'" + name + "' matches more than one case: " + hits.join(" ") + "\n" + + " Name one of them exactly, or use a substring that only one contains."); + fail("no case matches '" + name + "'. Known cases (from " + known.source + "):\n" + + " " + known.names.join(" ")); +} + +function resolveSide(name) { + if (SIDES.indexOf(name) >= 0) return name; + fail("'" + name + "' is not a side -- expected " + SIDES.join(" or ")); +} + +function hexPath(caseName, side) { + return path.join(outDir, caseName, side + ".hex"); +} + +function logPath(caseName, side) { + return path.join(outDir, caseName, side + ".log"); +} + +function buildHint(side) { + return side === "reference" + ? "npm run hwab -- build --v2-only --ref-switches \"\"" + : "npm run hwab -- build --candidate-only --v2-only"; +} + +function requireHex(caseName, side) { + const hex = hexPath(caseName, side); + let ok = false; + try { ok = fs.statSync(hex).isFile(); } catch (e) { ok = false; } + if (!ok) + fail("no " + side + " hex for " + caseName + " at " + hex + "\n" + + " Build it first: " + buildHint(side)); + return hex; +} + +// ---- child processes ------------------------------------------------------ + +// Never shell:true: the child is always node running a script whose path this +// process computed, and a path with a space in it must not be re-parsed by a +// shell. spawnSync with an argument array is also the form that behaves the +// same on Windows as it does elsewhere. +function run(script, args) { + const res = spawnSync(process.execPath, + [path.join(hwabDir, script)].concat(args), { stdio: "inherit" }); + if (res.error) { + process.stderr.write("hwab: could not run " + script + ": " + + res.error.message + "\n"); + return 1; + } + return res.status === null ? 1 : res.status; +} + +// ---- commands ------------------------------------------------------------- + +function cmdBuild(argv) { + return run("build-ab.js", argv); +} + +function cmdCapture(argv) { + let caseArg = null; + let side = null; + const passthrough = []; + + let soakMinutes = null; + + for (let i = 0; i < argv.length; i++) { + const arg = argv[i]; + if (arg === "--timeout") { + if (i + 1 >= argv.length) fail(arg + " needs a value"); + passthrough.push(arg, argv[++i]); + } else if (arg === "--soak") { + if (i + 1 >= argv.length) fail(arg + " needs a value"); + soakMinutes = argv[++i]; + if (!/^[1-9][0-9]*$/.test(soakMinutes)) + fail("--soak needs a positive whole number of minutes"); + passthrough.push(arg, soakMinutes); + } else if (arg.charAt(0) === "-") { + fail("unknown option: " + arg); + } else if (caseArg === null) { + caseArg = arg; + } else if (side === null) { + side = arg; + } else { + fail("unexpected argument: " + arg); + } + } + + if (caseArg === null) fail("capture needs a case name (see: hwab.js cases)"); + const caseName = resolveCase(caseArg); + side = side === null ? "candidate" : resolveSide(side); + + if (caseName === SOAK_CASE && soakMinutes === null) + fail("the soak program prints no verdict, so a plain capture of it can " + + "only time out.\n Give a duration: npm run hwab -- capture soak " + + side + " --soak "); + if (caseName !== SOAK_CASE && soakMinutes !== null) + fail("--soak is for the soak case; " + caseName + " prints HWAB PASS, " + + "not HWAB SOAK -- use a plain capture"); + + const hex = requireHex(caseName, side); + const log = logPath(caseName, side); + say("capture " + caseName + " " + side); + return run("run-capture.js", [hex, log].concat(passthrough)); +} + +function cmdDiff(argv) { + if (argv.length < 1) fail("diff needs a case name (see: hwab.js cases)"); + if (argv.length > 1) fail("unexpected argument: " + argv[1]); + const caseName = resolveCase(argv[0]); + + const missing = SIDES.filter(s => !fs.existsSync(logPath(caseName, s))); + if (missing.length) + fail("no " + missing.join(" and ") + " capture for " + caseName + ":\n" + + missing.map(s => " " + logPath(caseName, s)).join("\n") + "\n" + + " Capture it first: " + + missing.map(s => "npm run hwab -- capture " + caseName + " " + s).join(" ; ")); + + return run("diff-ab.js", [logPath(caseName, "candidate"), + logPath(caseName, "reference")]); +} + +function cmdAb(argv) { + let caseArg = null; + const passthrough = []; + + for (let i = 0; i < argv.length; i++) { + const arg = argv[i]; + if (arg === "--timeout") { + if (i + 1 >= argv.length) fail("--timeout needs a value"); + passthrough.push(arg, argv[++i]); + } else if (arg.charAt(0) === "-") { + fail("unknown option: " + arg); + } else if (caseArg === null) { + caseArg = arg; + } else { + fail("unexpected argument: " + arg); + } + } + + if (caseArg === null) fail("ab needs a case name (see: hwab.js cases)"); + const caseName = resolveCase(caseArg); + if (caseName === SOAK_CASE) + fail("the soak program prints no pass/fail verdict, so there is " + + "nothing for ab to sequence.\n" + + " Run each side for a duration, then compare:\n" + + " npm run hwab -- capture soak candidate --soak \n" + + " npm run hwab -- capture soak reference --soak \n" + + " npm run hwab -- diff soak"); + // Both hexes are checked up front: the run flashes the board twice, and + // discovering the second hex is missing after the first flash wastes the + // whole capture. + for (const side of SIDES) requireHex(caseName, side); + + // One board, so the sides run in turn; run-capture.js does the flash and + // waits for the board to come back each time. + const stages = SIDES.map(side => ({ + name: "capture " + side, + run: () => run("run-capture.js", + [hexPath(caseName, side), logPath(caseName, side)].concat(passthrough)) + })); + stages.push({ + name: "diff", + run: () => run("diff-ab.js", + [logPath(caseName, "candidate"), logPath(caseName, "reference")]) + }); + + for (const stage of stages) { + say("ab " + caseName + ": " + stage.name); + const code = stage.run(); + if (code !== 0) { + process.stderr.write("hwab: ab " + caseName + " FAILED at stage '" + + stage.name + "' (exit " + code + ")\n"); + return code; + } + } + say("ab " + caseName + ": OK -- both sides passed and the captures agree"); + return 0; +} + +function pad(s, width) { + return s.length >= width ? s : s + " ".repeat(width - s.length); +} + +function cmdCases() { + const known = knownCases(); + const headers = ["case", "cand.hex", "cand.log", "ref.hex", "ref.log"]; + const rows = known.names.map(name => [ + name, + fs.existsSync(hexPath(name, "candidate")) ? "yes" : "-", + fs.existsSync(logPath(name, "candidate")) ? "yes" : "-", + fs.existsSync(hexPath(name, "reference")) ? "yes" : "-", + fs.existsSync(logPath(name, "reference")) ? "yes" : "-" + ]); + + const widths = headers.map((h, i) => + rows.reduce((w, r) => Math.max(w, r[i].length), h.length)); + const line = cells => + cells.map((c, i) => pad(c, widths[i])).join(" ").replace(/ +$/, ""); + + process.stdout.write("hwab: cases from " + known.source + "\n"); + process.stdout.write("hwab: artifacts in " + outDir + "\n"); + process.stdout.write("\n"); + process.stdout.write(line(headers) + "\n"); + process.stdout.write(widths.map(w => "-".repeat(w)).join(" ") + "\n"); + for (const row of rows) process.stdout.write(line(row) + "\n"); + return 0; +} + +// ---- dispatch ------------------------------------------------------------- + +function main(argv) { + const cmd = argv[0]; + const rest = argv.slice(1); + + if (!cmd || cmd === "help" || cmd === "-h" || cmd === "--help") { + usage(process.stdout); + return 0; + } + + switch (cmd) { + case "build": return cmdBuild(rest); + case "capture": return cmdCapture(rest); + case "diff": return cmdDiff(rest); + case "ab": return cmdAb(rest); + case "cases": return cmdCases(); + } + + usage(process.stderr); + process.stderr.write("\nhwab: unknown command: " + cmd + "\n"); + return 2; +} + +process.exitCode = main(process.argv.slice(2)); diff --git a/tests/hw-ab/run-capture.js b/tests/hw-ab/run-capture.js new file mode 100644 index 000000000000..9e5bc8ccf642 --- /dev/null +++ b/tests/hw-ab/run-capture.js @@ -0,0 +1,500 @@ +/* + * Flashes a hex to an attached micro:bit and captures its serial output. + * + * micro:bit boards speak USB-CDC through DAPLink. No pxt CLI command can attach + * to that (pxt console / hidserial are HF2-only), so the capture is done by + * setting the line discipline with the platform's own tool (stty / mode) and + * reading the device directly. + */ + +"use strict"; + +const fs = require("fs"); +const path = require("path"); +const { spawnSync } = require("child_process"); + +const VOLUME_WAIT = 30; // seconds to wait for the board to appear +const REMOUNT_WAIT = 60; // seconds to wait for the board to come back after flashing +const UNMOUNT_GRACE = 15; // seconds to wait for the drive to go away while programming + +const USAGE = [ + "Usage: node tests/hw-ab/run-capture.js [--timeout ] [--soak ]", + "", + "Copies to the attached micro:bit, waits for it to re-enumerate, opens its", + "USB-CDC serial device at 115200 8N1 raw, and appends everything it prints to", + ".", + "", + "Normal mode (default, --timeout 120):", + " stops at the first \"HWAB PASS\" or \"ASSERT\" line, or at the timeout.", + " exit 0 HWAB PASS seen", + " exit 1 ASSERT seen (the failing line is printed)", + " exit 2 timeout with neither", + " exit 3 no board, no serial device, or more than one serial device", + "", + "Soak mode (--soak ):", + " captures for the whole duration and then checks whether HWAB SOAK lines were", + " still arriving at the end.", + " exit 0 still printing", + " exit 1 output stalled (the program panicked or hung)", + "", + "Platforms: macOS, Linux and Windows are detected automatically (where the drive", + "mounts, how the serial device is named, which tool sets the line settings).", + "When discovery needs help -- an unusual mount point, several serial devices --", + "override it:", + " MICROBIT_VOLUME path or drive of the mounted MICROBIT drive", + " MICROBIT_SERIAL serial device to read (/dev/cu.usbmodem1102, COM5, ...)", + "See the Platforms section of tests/hw-ab/README.md." +].join("\n"); + +function usage(stream) { + stream.write(USAGE + "\n"); +} + +function fail(msg) { + process.stderr.write("run-capture: " + msg + "\n"); + process.exit(3); +} + +// ---- arguments ------------------------------------------------------------ + +const argv = process.argv.slice(2); +if (argv.indexOf("-h") >= 0 || argv.indexOf("--help") >= 0) { + usage(process.stdout); + process.exit(0); +} +if (argv.length < 2) { + usage(process.stderr); + process.exit(3); +} + +const hex = argv[0]; +const logFile = argv[1]; +let timeout = 120; +let soakMin = 0; + +for (let i = 2; i < argv.length; i++) { + const arg = argv[i]; + if (arg === "--timeout") { + if (i + 1 >= argv.length) fail("--timeout needs a value"); + timeout = argv[++i]; + } else if (arg === "--soak") { + if (i + 1 >= argv.length) fail("--soak needs a value"); + soakMin = argv[++i]; + } else { + usage(process.stderr); + fail("unknown argument: " + arg); + } +} + +let hexIsFile = false; +try { hexIsFile = fs.statSync(hex).isFile(); } catch (e) { hexIsFile = false; } +if (!hexIsFile) fail("no such hex: " + hex); +if (!/^[0-9]+$/.test(String(timeout))) fail("--timeout must be an integer"); +if (!/^[0-9]+$/.test(String(soakMin))) fail("--soak must be an integer"); +timeout = parseInt(timeout, 10); +soakMin = parseInt(soakMin, 10); +if (soakMin > 0) timeout = soakMin * 60; + +// ---- platform ------------------------------------------------------------- + +// Platform differences live here: where the mass-storage volume appears, how +// the USB-CDC serial device is named, and which tool sets the line settings. +// MICROBIT_VOLUME / MICROBIT_SERIAL override the discovery. +const platform = process.platform; +const isWindows = platform === "win32"; + +const WIN_VOLUME_PS = + "(Get-CimInstance Win32_LogicalDisk | " + + "Where-Object {$_.VolumeName -eq 'MICROBIT'}).DeviceID"; +const WIN_SERIAL_PS = + "(Get-CimInstance Win32_SerialPort | " + + "Where-Object {$_.Name -match 'mbed|DAPLink|USB Serial'}) | " + + "ForEach-Object DeviceID"; + +let staticVolumes = null; // fixed candidate list, or null when discovery is dynamic +let volumeDesc = ""; // what the "no volume" message says was looked at +let devDesc = ""; // what the serial messages call the device +let sttyFlag = ""; + +if (platform === "darwin") { + staticVolumes = ["/Volumes/MICROBIT"]; + devDesc = "/dev/cu.usbmodem* device"; + sttyFlag = "-f"; +} else if (platform === "linux") { + const user = process.env.USER || "root"; + staticVolumes = ["/media/" + user + "/MICROBIT", + "/run/media/" + user + "/MICROBIT", + "/media/MICROBIT"]; + devDesc = "/dev/ttyACM* device"; + sttyFlag = "-F"; +} else if (isWindows) { + devDesc = "mbed/DAPLink/USB Serial COM port"; +} else { + fail("unsupported platform '" + platform + + "' -- see the Platforms section of tests/hw-ab/README.md"); +} + +function powershellLines(script) { + const res = spawnSync("powershell", ["-NoProfile", "-Command", script], + { encoding: "utf8" }); + if (res.error || res.status !== 0) return []; + return String(res.stdout || "").split(/\r?\n/) + .map(s => s.trim()).filter(s => s.length > 0); +} + +// "E:" from Windows tools names a drive plus its current directory; "E:\" is +// the root, which is what a path join and an existence test need. +function driveRoot(v) { + return /^[A-Za-z]:$/.test(v) ? v + "\\" : v; +} + +if (process.env.MICROBIT_VOLUME) { + staticVolumes = [isWindows + ? driveRoot(process.env.MICROBIT_VOLUME) + : process.env.MICROBIT_VOLUME]; +} +volumeDesc = staticVolumes + ? staticVolumes.join(" ") + : "the drive whose volume label is MICROBIT"; + +function volumeCandidates() { + if (staticVolumes) return staticVolumes; + return powershellLines(WIN_VOLUME_PS).map(driveRoot); +} + +function isDir(p) { + try { return fs.statSync(p).isDirectory(); } catch (e) { return false; } +} + +function findVolume() { + for (const v of volumeCandidates()) { + if (isDir(v)) return v; + } + return null; +} + +// ---- small helpers -------------------------------------------------------- + +function nowSeconds() { + return Math.floor(Date.now() / 1000); +} + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +async function waitForVolume(seconds) { + const deadline = nowSeconds() + seconds; + while (nowSeconds() < deadline) { + const v = findVolume(); + if (v) return v; + await sleep(1000); + } + return null; +} + +// The log is read back as latin1 so that undecodable serial noise survives a +// round trip and is reported byte for byte. +function readLog() { + try { return fs.readFileSync(logFile, "latin1"); } catch (e) { return ""; } +} + +function splitLines(text) { + const lines = text.split("\n"); + if (lines.length && lines[lines.length - 1] === "") lines.pop(); + return lines; +} + +function firstMatch(text, needle) { + for (const line of splitLines(text)) { + if (line.indexOf(needle) >= 0) return line; + } + return null; +} + +function countMatches(text, needle) { + let n = 0; + for (const line of splitLines(text)) { + if (line.indexOf(needle) >= 0) n++; + } + return n; +} + +function countLines(text) { + let n = 0; + for (let i = 0; i < text.length; i++) if (text[i] === "\n") n++; + return n; +} + +// The trailing bytes of the last n lines, exactly as `tail -n ` emits them. +function tailBytes(text, n) { + let i = text.length - 1; + if (i >= 0 && text[i] === "\n") i--; + let count = 0; + for (; i >= 0; i--) { + if (text[i] === "\n") { + count++; + if (count === n) return text.slice(i + 1); + } + } + return text; +} + +function writeRaw(stream, text) { + stream.write(Buffer.from(text, "latin1")); +} + +// ---- capture -------------------------------------------------------------- + +let devFd = null; +let logFd = null; +let pumpTimer = null; +let stopped = false; + +function cleanup() { + stopped = true; + if (pumpTimer !== null) { clearInterval(pumpTimer); pumpTimer = null; } + if (logFd !== null) { try { fs.closeSync(logFd); } catch (e) { /* closed */ } logFd = null; } + if (devFd !== null) { try { fs.closeSync(devFd); } catch (e) { /* closed */ } devFd = null; } +} + +const READ_BUF = Buffer.allocUnsafe(4096); + +// Drains whatever the device has buffered into the log, so that a poll of the +// log file sees bytes as they arrive. The read must not block: an outstanding +// blocking read holds a worker thread that node waits for on the way out, which +// would leave the script hanging past its own verdict. On POSIX the fd carries +// O_NONBLOCK and a quiet port raises EAGAIN; on Windows the mode-configured +// handle returns what it has rather than waiting for a full buffer. +function pump() { + while (!stopped && devFd !== null && logFd !== null) { + let bytes; + try { + bytes = fs.readSync(devFd, READ_BUF, 0, READ_BUF.length, null); + } catch (e) { + return; // EAGAIN while the port is quiet, or the device went away + } + if (bytes <= 0) return; + try { fs.writeSync(logFd, READ_BUF, 0, bytes); } catch (e) { return; } + } +} + +function startReader() { + // Frequently enough that a burst at 115200 baud cannot outrun the tty's own + // input buffer between polls. + pumpTimer = setInterval(pump, 50); +} + +async function main() { + const volume = await waitForVolume(VOLUME_WAIT); + if (!volume) { + process.stderr.write( + "run-capture: no MICROBIT volume within " + VOLUME_WAIT + "s (looked at:\n" + + volumeDesc + ").\n" + + "\n" + + "Plug a micro:bit into USB and wait for the MICROBIT drive to mount. If the\n" + + "board is plugged in and the drive is absent, the cable may be charge-only, or\n" + + "the board may be in a bad state -- unplug it, hold the reset button while\n" + + "plugging it back in, and look for a MAINTENANCE drive (that means DAPLink is\n" + + "in bootloader mode and needs its firmware reflashed). If the drive is mounted\n" + + "somewhere this script did not look, point it there with MICROBIT_VOLUME.\n"); + process.exit(3); + } + + process.stdout.write("run-capture: flashing " + hex + " -> " + volume + "\n"); + try { + fs.copyFileSync(hex, path.join(volume, path.basename(hex))); + } catch (e) { + fail("copy to " + volume + " failed"); + } + if (!isWindows) { + // Best effort: push the copy out of the page cache before the drive + // goes away. Windows has no equivalent that is worth spawning. + spawnSync("sync", [], { stdio: "ignore" }); + } + + // DAPLink unmounts the drive while it programs, then remounts and resets the + // board. Wait for the drive to go away (best effort -- flashing a small hex + // can be quicker than this poll) and then for it to come back. + const graceDeadline = nowSeconds() + UNMOUNT_GRACE; + while (nowSeconds() < graceDeadline && isDir(volume)) await sleep(1000); + if (!await waitForVolume(REMOUNT_WAIT)) + fail(volume + " did not remount within " + REMOUNT_WAIT + "s after flashing"); + process.stdout.write("run-capture: flashed, board remounted\n"); + + // The generated programs idle for ~10s before printing, which is the window + // this discovery and the line-settings setup have to fit into. + let devs; + if (process.env.MICROBIT_SERIAL) { + devs = [process.env.MICROBIT_SERIAL]; + // A COM port is not a filesystem entry, so it can only be checked by + // opening it, which happens below. + if (!isWindows && !fs.existsSync(devs[0])) + fail("MICROBIT_SERIAL=" + process.env.MICROBIT_SERIAL + " does not exist"); + } else if (isWindows) { + devs = powershellLines(WIN_SERIAL_PS); + } else { + const prefix = platform === "darwin" ? "cu.usbmodem" : "ttyACM"; + let entries = []; + try { entries = fs.readdirSync("/dev"); } catch (e) { entries = []; } + devs = entries.filter(e => e.indexOf(prefix) === 0).sort() + .map(e => "/dev/" + e); + } + + if (devs.length === 0) { + process.stderr.write( + "run-capture: no " + devDesc + " found.\n" + + "\n" + + "The MICROBIT drive mounted, so DAPLink's mass storage is up but its serial\n" + + "port is not. Unplug and replug the board; if that does not help the DAPLink\n" + + "interface firmware is likely out of date and needs updating. On Linux, also\n" + + "check that your user may open serial devices (typically the dialout group).\n"); + process.exit(3); + } + if (devs.length > 1) { + process.stderr.write("run-capture: more than one " + devDesc + ":\n"); + for (const d of devs) process.stderr.write(" " + d + "\n"); + process.stderr.write( + "\n" + + "Only one board may be attached, otherwise the capture could read the wrong one.\n" + + "Unplug the other USB serial devices and rerun, or name the right device with\n" + + "MICROBIT_SERIAL.\n"); + process.exit(3); + } + + const dev = devs[0]; + process.stdout.write("run-capture: serial " + dev + "\n"); + + if (isWindows) { + // Windows keeps the port configuration with the port, so `mode` is + // applied before the handle is opened. The \\.\ prefix is required for + // COM10 and above and harmless below it. + const port = dev.replace(/^\\\\\.\\/, ""); + const cmd = "mode " + port + + ": BAUD=115200 PARITY=n DATA=8 STOP=1 to=off xon=off dtr=on rts=on"; + const res = spawnSync(cmd, { shell: true, stdio: "ignore" }); + if (res.error || res.status !== 0) + fail("mode failed on " + dev + " (is another program holding the port?)"); + try { + devFd = fs.openSync("\\\\.\\" + port, "r"); + } catch (e) { + devFd = null; + fail("cannot open " + dev); + } + } else { + // Hold the device open for the whole capture. Terminal settings reset + // when the last open of a tty closes, and stty performs its own + // open/close -- so without this held fd the 115200/raw settings would be + // gone by the time the reader opens the port, and it would read garbage + // at the default rate. The fd is opened first so the settings apply to + // the held-open port, and every byte is read from this same fd. + try { + devFd = fs.openSync(dev, fs.constants.O_RDONLY | fs.constants.O_NONBLOCK); + } catch (e) { + devFd = null; + fail("cannot open " + dev); + } + const res = spawnSync("stty", [sttyFlag, dev, "115200", "raw", "-echo"], + { stdio: "ignore" }); + if (res.error || res.status !== 0) + fail("stty failed on " + dev + " (is another program holding the port?)"); + } + + fs.mkdirSync(path.dirname(path.resolve(logFile)), { recursive: true }); + logFd = fs.openSync(logFile, "w"); + startReader(); + + const deadline = nowSeconds() + timeout; + + if (soakMin > 0) { + process.stdout.write( + "run-capture: soak for " + soakMin + " minute(s) -> " + logFile + "\n"); + // Snapshot the SOAK line count 60s before the end; if it has not grown + // by the deadline the program stopped printing, which is how a leak ends. + let checkpoint = deadline - 60; + if (checkpoint <= nowSeconds()) checkpoint = deadline - Math.floor(timeout / 4); + let before = null; + while (nowSeconds() < deadline) { + if (before === null && nowSeconds() >= checkpoint) + before = countMatches(readLog(), "HWAB SOAK"); + await sleep(5000); + } + cleanup(); + const content = readLog(); + const after = countMatches(content, "HWAB SOAK"); + if (before === null) before = 0; + process.stdout.write("run-capture: HWAB SOAK lines: " + before + + " at checkpoint, " + after + " at end\n"); + const assertLine = firstMatch(content, "ASSERT "); + if (assertLine !== null) { + process.stderr.write("run-capture: FAIL -- assertion during soak:\n"); + writeRaw(process.stderr, assertLine + "\n"); + process.exit(1); + } + if (after > before) { + process.stdout.write( + "run-capture: PASS -- still printing after " + soakMin + " minute(s)\n"); + writeRaw(process.stdout, tailBytes(content, 1)); + process.exit(0); + } + process.stderr.write( + "run-capture: FAIL -- output stalled before the end of the soak.\n" + + "The board stopped printing HWAB SOAK lines, which is what an out-of-memory\n" + + "panic looks like from the host side (the LED matrix will show a sad face and a\n" + + "number; 020/021 are the memory panics). Last captured lines:\n"); + writeRaw(process.stderr, tailBytes(content, 5)); + process.exit(1); + } + + process.stdout.write( + "run-capture: capturing up to " + timeout + "s -> " + logFile + "\n"); + while (nowSeconds() < deadline) { + const content = readLog(); + const assertLine = firstMatch(content, "ASSERT "); + if (assertLine !== null) { + cleanup(); + process.stderr.write("run-capture: FAIL -- assertion failed on device:\n"); + writeRaw(process.stderr, assertLine + "\n"); + process.stderr.write("run-capture: the board shows a sad face and 45.\n"); + process.exit(1); + } + const passLine = firstMatch(content, "HWAB PASS"); + if (passLine !== null) { + cleanup(); + writeRaw(process.stdout, + "run-capture: PASS -- " + passLine.replace(/\r/g, "") + "\n"); + process.exit(0); + } + await sleep(1000); + } + + cleanup(); + const content = readLog(); + const logLines = countLines(content); + const logBytes = content.length; + process.stderr.write( + "run-capture: TIMEOUT -- no HWAB PASS and no ASSERT within " + timeout + "s.\n" + + "Captured " + logLines + " line(s), " + logBytes + " byte(s). Last lines:\n"); + writeRaw(process.stderr, tailBytes(content, 5)); + if (logLines === 0 && logBytes > 0) { + process.stderr.write( + "\n" + + "Bytes arrived but formed no complete line -- usually undecodable garbage from\n" + + "wrong serial line settings (baud or framing). Check that nothing else has the\n" + + "port open and reconfigures it, and that the device really is the micro:bit.\n"); + } + process.stderr.write( + "\n" + + "If the log is empty the capture attached after the program had already run, or\n" + + "the board reset. If the board shows a sad face the program panicked before\n" + + "reaching its verdict; read the number off the matrix (999 = unhandled throw,\n" + + "020/021 = out of memory).\n"); + process.exit(2); +} + +process.on("exit", cleanup); + +main().catch(err => { + cleanup(); + fail(err && err.message ? err.message : String(err)); +}); From fd5844b98e23828f910e36fbde249b29dba60c8c Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Sun, 30 Aug 2026 13:39:43 -0700 Subject: [PATCH 03/10] Harden hw-ab serial capture against stale and cross-case output Findings from running the capture against a real micro:bit: - DAPLink buffers serial while no host is reading, so a fresh capture can open onto the previously flashed program's output, including its PASS banner. Verdicts are now read only from the flashed program's own HWAB START banner onward, and --expect (passed by hwab) requires the banner and verdict to name the flashed case. Timeout diagnostics report ignored foreign output and point at FAIL.TXT when no banner appears. - Panic does not flush the serial FIFO, which truncated the assert id on the wire. The generated device assert now drains for 250 ms between logging the id and panicking. --- tests/hw-ab/README.md | 5 +++ tests/hw-ab/gen-project.js | 3 ++ tests/hw-ab/hwab.js | 6 ++- tests/hw-ab/run-capture.js | 84 ++++++++++++++++++++++++++++++-------- 4 files changed, 78 insertions(+), 20 deletions(-) diff --git a/tests/hw-ab/README.md b/tests/hw-ab/README.md index a24978ee207b..448414f332d8 100644 --- a/tests/hw-ab/README.md +++ b/tests/hw-ab/README.md @@ -146,6 +146,11 @@ The 10 second delay and the repeating PASS both exist for the same reason: serial capture cannot begin until the board re-enumerates after flashing, so a program that printed its verdict once and immediately would race the capture. +Verdicts are read only from the case's own `HWAB START` banner onward, and +`hwab` passes the expected case name through: DAPLink buffers serial while no +host is reading, so the first bytes after opening the port can belong to the +previously flashed program -- including its PASS banner. + On failure the generated `assert` prints `ASSERT ` and then panics 45. The host prelude's `assert` throws instead, and an uncaught throw on device is just panic 999, which does not say which assertion failed -- `gen-project.js` diff --git a/tests/hw-ab/gen-project.js b/tests/hw-ab/gen-project.js index 0d7e6346324f..b9741064a12a 100644 --- a/tests/hw-ab/gen-project.js +++ b/tests/hw-ab/gen-project.js @@ -77,6 +77,9 @@ const DEVICE_ASSERT = " if (!cond) {\n" + " console.log(\"ASSERT \" + (m || \"?\"))\n" + " control.dmesg(\"ASSERT \" + (m || \"?\"))\n" + + " // Panic does not flush serial; without this drain pause the tail\n" + + " // of the assert id is lost, and the id is the failure report.\n" + + " basic.pause(250)\n" + " panic(45)\n" + " }\n" + "}\n" + diff --git a/tests/hw-ab/hwab.js b/tests/hw-ab/hwab.js index 51436b47a88b..fed4137c9a76 100644 --- a/tests/hw-ab/hwab.js +++ b/tests/hw-ab/hwab.js @@ -235,7 +235,8 @@ function cmdCapture(argv) { const hex = requireHex(caseName, side); const log = logPath(caseName, side); say("capture " + caseName + " " + side); - return run("run-capture.js", [hex, log].concat(passthrough)); + return run("run-capture.js", + [hex, log, "--expect", caseName].concat(passthrough)); } function cmdDiff(argv) { @@ -291,7 +292,8 @@ function cmdAb(argv) { const stages = SIDES.map(side => ({ name: "capture " + side, run: () => run("run-capture.js", - [hexPath(caseName, side), logPath(caseName, side)].concat(passthrough)) + [hexPath(caseName, side), logPath(caseName, side), + "--expect", caseName].concat(passthrough)) })); stages.push({ name: "diff", diff --git a/tests/hw-ab/run-capture.js b/tests/hw-ab/run-capture.js index 9e5bc8ccf642..e5f73f0484a9 100644 --- a/tests/hw-ab/run-capture.js +++ b/tests/hw-ab/run-capture.js @@ -18,12 +18,19 @@ const REMOUNT_WAIT = 60; // seconds to wait for the board to come back after const UNMOUNT_GRACE = 15; // seconds to wait for the drive to go away while programming const USAGE = [ - "Usage: node tests/hw-ab/run-capture.js [--timeout ] [--soak ]", + "Usage: node tests/hw-ab/run-capture.js [--timeout ]", + " [--soak ] [--expect ]", "", "Copies to the attached micro:bit, waits for it to re-enumerate, opens its", "USB-CDC serial device at 115200 8N1 raw, and appends everything it prints to", ".", "", + "Verdicts are read only from the first \"HWAB START\" banner onward: DAPLink", + "buffers serial while no host is reading, so the first bytes after opening the", + "port can belong to the previously flashed program -- including its PASS", + "banner. --expect additionally requires the banner (and the verdict) to", + "name that case.", + "", "Normal mode (default, --timeout 120):", " stops at the first \"HWAB PASS\" or \"ASSERT\" line, or at the timeout.", " exit 0 HWAB PASS seen", @@ -71,6 +78,7 @@ const hex = argv[0]; const logFile = argv[1]; let timeout = 120; let soakMin = 0; +let expectCase = ""; for (let i = 2; i < argv.length; i++) { const arg = argv[i]; @@ -80,6 +88,9 @@ for (let i = 2; i < argv.length; i++) { } else if (arg === "--soak") { if (i + 1 >= argv.length) fail("--soak needs a value"); soakMin = argv[++i]; + } else if (arg === "--expect") { + if (i + 1 >= argv.length) fail("--expect needs a value"); + expectCase = argv[++i]; } else { usage(process.stderr); fail("unknown argument: " + arg); @@ -220,6 +231,28 @@ function countMatches(text, needle) { return n; } +// Verdict lines are only meaningful from the flashed program's own START +// banner onward: the port can open onto buffered output from the previously +// flashed program (DAPLink keeps transmitting into its buffer while no host +// reads), and that output can contain a PASS banner. Returns null until the +// banner has been seen. +function startNeedle() { + return "HWAB START" + (expectCase ? " " + expectCase : ""); +} + +function verdictBody(content) { + const lines = splitLines(content); + for (let i = 0; i < lines.length; i++) { + if (lines[i].indexOf(startNeedle()) >= 0) + return lines.slice(i).join("\n"); + } + return null; +} + +function firstHwabLine(text) { + return firstMatch(text, "HWAB "); +} + function countLines(text) { let n = 0; for (let i = 0; i < text.length; i++) if (text[i] === "\n") n++; @@ -416,11 +449,11 @@ async function main() { let before = null; while (nowSeconds() < deadline) { if (before === null && nowSeconds() >= checkpoint) - before = countMatches(readLog(), "HWAB SOAK"); + before = countMatches(verdictBody(readLog()) || "", "HWAB SOAK"); await sleep(5000); } cleanup(); - const content = readLog(); + const content = verdictBody(readLog()) || ""; const after = countMatches(content, "HWAB SOAK"); if (before === null) before = 0; process.stdout.write("run-capture: HWAB SOAK lines: " + before + @@ -448,22 +481,25 @@ async function main() { process.stdout.write( "run-capture: capturing up to " + timeout + "s -> " + logFile + "\n"); + const passNeedle = "HWAB PASS" + (expectCase ? " " + expectCase : ""); while (nowSeconds() < deadline) { - const content = readLog(); - const assertLine = firstMatch(content, "ASSERT "); - if (assertLine !== null) { - cleanup(); - process.stderr.write("run-capture: FAIL -- assertion failed on device:\n"); - writeRaw(process.stderr, assertLine + "\n"); - process.stderr.write("run-capture: the board shows a sad face and 45.\n"); - process.exit(1); - } - const passLine = firstMatch(content, "HWAB PASS"); - if (passLine !== null) { - cleanup(); - writeRaw(process.stdout, - "run-capture: PASS -- " + passLine.replace(/\r/g, "") + "\n"); - process.exit(0); + const body = verdictBody(readLog()); + if (body !== null) { + const assertLine = firstMatch(body, "ASSERT "); + if (assertLine !== null) { + cleanup(); + process.stderr.write("run-capture: FAIL -- assertion failed on device:\n"); + writeRaw(process.stderr, assertLine + "\n"); + process.stderr.write("run-capture: the board shows a sad face and 45.\n"); + process.exit(1); + } + const passLine = firstMatch(body, passNeedle); + if (passLine !== null) { + cleanup(); + writeRaw(process.stdout, + "run-capture: PASS -- " + passLine.replace(/\r/g, "") + "\n"); + process.exit(0); + } } await sleep(1000); } @@ -476,6 +512,18 @@ async function main() { "run-capture: TIMEOUT -- no HWAB PASS and no ASSERT within " + timeout + "s.\n" + "Captured " + logLines + " line(s), " + logBytes + " byte(s). Last lines:\n"); writeRaw(process.stderr, tailBytes(content, 5)); + if (verdictBody(content) === null) { + process.stderr.write( + "\nNo \"" + startNeedle() + "\" banner was seen, so no verdict could be read.\n"); + const stray = firstHwabLine(content); + if (stray !== null) { + process.stderr.write( + "HWAB output from another program was ignored (stale serial buffer from\n" + + "the previously flashed program, or the flash did not take -- check the\n" + + "MICROBIT drive for FAIL.TXT). First ignored line:\n"); + writeRaw(process.stderr, stray + "\n"); + } + } if (logLines === 0 && logBytes > 0) { process.stderr.write( "\n" + From 18b30952ba5be678107b46e784db36ffd38a5bb6 Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Sun, 30 Aug 2026 16:42:13 -0700 Subject: [PATCH 04/10] add 521 flash error guidance --- tests/hw-ab/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/hw-ab/README.md b/tests/hw-ab/README.md index 448414f332d8..529cbe62c2de 100644 --- a/tests/hw-ab/README.md +++ b/tests/hw-ab/README.md @@ -225,6 +225,7 @@ build's. | 45 | an `assert` in the generated program failed; the id is on serial | | 999 | unhandled thrown value (a `throw` that reached the top) | | 020 / 021 | out of memory | +| 521 | the flash itself failed (DAPLink could not decode the hex); the program never ran -- re-flash | A panic 999 in a generated case project means something threw that was not an assertion -- the case files raise exceptions deliberately in a few places, so a @@ -232,6 +233,11 @@ assertion -- the case files raise exceptions deliberately in a few places, so a ## Troubleshooting +**Sad face with 521 right after flashing** -- DAPLink rejected the incoming +hex (a flash-time checksum failure). The program never ran, so the capture +times out with no banner. Intermittent; a re-flash nearly always succeeds. +If it repeats back to back, unplug and replug the board before retrying. + **`no MICROBIT volume within 30s`** -- the drive is not mounted. Check the cable is a data cable, not charge-only. If a `MAINTENANCE` drive appears instead, DAPLink is in bootloader mode and its interface firmware needs From 3cafe3c4259144a6678b5b147f01cf45325ab2af Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Sun, 30 Aug 2026 17:41:29 -0700 Subject: [PATCH 05/10] harden hw-ab capture and diff against flash failures and serial artifacts --- tests/hw-ab/README.md | 40 ++++++--- tests/hw-ab/build-ab.js | 29 +++++-- tests/hw-ab/diff-ab.js | 35 +++++++- tests/hw-ab/gen-project.js | 22 +++-- tests/hw-ab/run-capture.js | 165 +++++++++++++++++++++++++++---------- 5 files changed, 219 insertions(+), 72 deletions(-) diff --git a/tests/hw-ab/README.md b/tests/hw-ab/README.md index 529cbe62c2de..8bbe3810a8f7 100644 --- a/tests/hw-ab/README.md +++ b/tests/hw-ab/README.md @@ -80,8 +80,11 @@ Two constraints: `PXT_COMPILE_SWITCHES` name-agnostically -- an unknown switch name is accepted silently and then never read. A misspelled or not-yet-implemented switch therefore produces a "reference" that is a second candidate build. - `build-ab.js` compares the two hexes and refuses to continue if they are - byte-identical, rather than letting you diff a build against itself. + `build-ab.js` compares the two hexes of every case and refuses to continue + when all of them are byte-identical, rather than letting you diff a build + against itself. Some cases identical is not that failure -- a switch only + changes the programs that use what it gates -- so those are reported as a + note and the build succeeds. 2. It only covers changes that are gated behind those switches. An ungated change is in both builds and the comparison cannot see it. @@ -129,8 +132,13 @@ which is what to reach for when the two sides are run on different boards or at different times. `run-capture.js` exits 0 on `HWAB PASS`, 1 on `ASSERT` (printing the failing -assertion id), 2 on timeout, 3 on a host/board problem. `diff-ab.js` exits -nonzero on divergence and prints a unified diff of the normalized lines. +assertion id), 2 on timeout, 3 on a host/board problem. A timeout with no +banner at all means the program never ran, so it re-flashes once before +reporting. `diff-ab.js` exits nonzero on divergence and prints a unified diff of +the normalized lines; normalization drops what belongs to the capture rather +than to the build -- a final line cut short when the capture stopped, and +banners naming a different case, which are the previous program's output +arriving out of DAPLink's buffer. A pass on both sides is not the whole story, which is why `ab` diffs even when both captures passed: the trace lines between the banners can differ while the @@ -140,11 +148,13 @@ final verdict does not. HWAB START once, after a 10 s startup delay from the prelude's msg() - HWAB PASS repeated every 2 s, forever + HWAB PASS repeated every 2 s for about a minute The 10 second delay and the repeating PASS both exist for the same reason: serial capture cannot begin until the board re-enumerates after flashing, so a program that printed its verdict once and immediately would race the capture. +Only that first minute can be raced, so the heartbeat stops there and the board +idles quietly rather than streaming serial until it is unplugged. Verdicts are read only from the case's own `HWAB START` banner onward, and `hwab` passes the expected case name through: DAPLink buffers serial while no @@ -235,8 +245,10 @@ assertion -- the case files raise exceptions deliberately in a few places, so a **Sad face with 521 right after flashing** -- DAPLink rejected the incoming hex (a flash-time checksum failure). The program never ran, so the capture -times out with no banner. Intermittent; a re-flash nearly always succeeds. -If it repeats back to back, unplug and replug the board before retrying. +times out with no banner, which is the case `run-capture.js` re-flashes once by +itself; it also prints `FAIL.TXT` from the MICROBIT drive when DAPLink left one +there. Reaching the report means both attempts were rejected: unplug and replug +the board before retrying. **`no MICROBIT volume within 30s`** -- the drive is not mounted. Check the cable is a data cable, not charge-only. If a `MAINTENANCE` drive appears @@ -254,12 +266,14 @@ read the serial device directly. and the capture cannot tell which board is which. Unplug the others, or name the right one with `MICROBIT_SERIAL`. -**`candidate and reference hexes are byte-identical`** -- the reference build -differs from the candidate only by compile switches, and those switches changed -nothing. Almost always this means the compiler on this branch does not -implement them: an unrecognised switch name is accepted silently and never -read. Check the spelling against what the compiler reads, or switch to the -git-based reference strategy. +**`candidate and reference hexes are byte-identical for every case`** -- the +reference build differs from the candidate only by compile switches, and those +switches changed nothing anywhere. Almost always this means the compiler on +this branch does not implement them: an unrecognised switch name is accepted +silently and never read. Check the spelling against what the compiler reads, or +switch to the git-based reference strategy. The per-case +`no codegen difference for ` note is the benign version of the same +observation and does not stop the build. **Empty capture / timeout** -- the capture attached after the program had already printed, or the board reset. The repeating PASS banner normally covers diff --git a/tests/hw-ab/build-ab.js b/tests/hw-ab/build-ab.js index 319067efcba0..37261edc57b3 100644 --- a/tests/hw-ab/build-ab.js +++ b/tests/hw-ab/build-ab.js @@ -51,7 +51,9 @@ const USAGE = [ "works if the compiler on this branch implements the named opt-out switches.", "PXT parses PXT_COMPILE_SWITCHES name-agnostically, so an unknown switch is", "accepted silently and never read -- the \"reference\" is then byte-identical to", - "the candidate. This script detects that and fails; it does not guess.", + "the candidate for every case, which this script detects and fails on. Identical", + "output for only some cases is normal (the switch gates a feature those programs", + "do not use) and is reported as a note.", "", "It also only covers changes that are gated behind those switches. Any ungated", "change is present in both builds and invisible to the comparison.", @@ -255,6 +257,7 @@ fs.writeFileSync(sizesFile, [ ].join("\n")); const identical = []; +let pairs = 0; const cases = fs.readFileSync(casesFile, "utf8").split("\n") .map(l => l.replace(/\r$/, "")) .filter(l => l.length > 0); @@ -273,6 +276,7 @@ for (const caseName of cases) { } if (doCandidate && doReference) { + pairs++; if (sha256(path.join(outDir, caseName, "candidate.hex")) === sha256(path.join(outDir, caseName, "reference.hex"))) { identical.push(caseName); @@ -283,18 +287,22 @@ for (const caseName of cases) { process.stdout.write("build-ab: sizes -> " + sizesFile + "\n"); -if (identical.length) { +// Some pairs identical is expected: a switch only changes the programs that use +// the feature it gates. Every pair identical is the failure mode worth catching +// -- the switch names buy nothing, so the A/B would compare a build with itself. +if (identical.length && identical.length === pairs) { process.stderr.write([ "", - "build-ab: ERROR -- candidate and reference hexes are byte-identical for:", + "build-ab: ERROR -- candidate and reference hexes are byte-identical for every", + "build-ab: case:", "build-ab: " + identical.join(" "), "", "The reference build differs from the candidate only by the compile switches", - "\"" + refSwitches + "\". Identical output means those switches changed nothing.", - "The likely cause is that the compiler on this branch does not implement them:", - "PXT_COMPILE_SWITCHES is parsed name-agnostically, so an unrecognised switch", - "name is accepted silently and then never read, and the \"reference\" build is", - "just a second candidate build.", + "\"" + refSwitches + "\". Identical output everywhere means those switches changed", + "nothing at all. The likely cause is that the compiler on this branch does not", + "implement them: PXT_COMPILE_SWITCHES is parsed name-agnostically, so an", + "unrecognised switch name is accepted silently and then never read, and the", + "\"reference\" build is just a second candidate build.", "", "Check that the switch names are spelled as the compiler reads them, or use the", "git-based reference strategy instead (build-ab.js --help). An A/B run against", @@ -304,4 +312,9 @@ if (identical.length) { process.exit(3); } +for (const caseName of identical) { + process.stdout.write("build-ab: note -- no codegen difference for " + caseName + + " under these switches\n"); +} + process.stdout.write("build-ab: done\n"); diff --git a/tests/hw-ab/diff-ab.js b/tests/hw-ab/diff-ab.js index 308283fe2b27..5fc65dc54e3a 100644 --- a/tests/hw-ab/diff-ab.js +++ b/tests/hw-ab/diff-ab.js @@ -6,6 +6,10 @@ * capture picks up incidentally is dropped, and the parts of a line that vary * legitimately between two runs of the same build -- elapsed milliseconds and * heap byte counts on soak lines -- are masked before the comparison. + * + * Two capture artifacts are also dropped, since both are properties of the + * capture rather than of the build: a final line the capture cut short, and a + * banner belonging to the previously flashed program. */ "use strict"; @@ -21,6 +25,11 @@ const USAGE = [ " - CR stripped, blank lines dropped", " - everything before the first \"HWAB START\" banner is discarded, since a", " capture can attach part way through a line", + " - an unterminated final line is dropped -- it means the capture stopped", + " mid-line, which is not a divergence", + " - the case name comes from the log's own \"HWAB START\" banner; HWAB lines", + " naming a different case are the previous program's, buffered by DAPLink,", + " and are dropped", " - HWAB banners, ASSERT failures and the lang-test0 msg() trace lines are all", " compared; a leading \"[12345]\" or \"123ms\" timestamp is stripped", " - \"HWAB SOAK free=.. min=.. total=.. numgc=..\" collapses to", @@ -48,8 +57,20 @@ function splitLines(text) { return lines; } +// Case name carried by an "HWAB START " or "HWAB PASS " line, or +// "" for any other line (HWAB SOAK carries no case name). +function hwabCase(line) { + const m = /HWAB (?:START|PASS)[ \t]+([^ \t]+)/.exec(line); + return m ? m[1] : ""; +} + function normalize(file) { - const raw = splitLines(fs.readFileSync(file, "utf8").replace(/\r/g, "")); + const text = fs.readFileSync(file, "utf8").replace(/\r/g, ""); + const raw = splitLines(text); + + // A capture stopped mid-line leaves an unterminated fragment; where the + // capture happened to stop is not a divergence. + if (raw.length && !/\n$/.test(text)) raw.pop(); // Serial capture can attach part way through a line, so the sync point is // the first HWAB START banner; everything before it is discarded. A log @@ -57,8 +78,13 @@ function normalize(file) { // all of its lines except the first, which is the one that can be a // fragment. let start = 0; + let caseName = ""; for (let i = 0; i < raw.length; i++) { - if (raw[i].indexOf("HWAB START") >= 0) { start = i + 1; break; } + if (raw[i].indexOf("HWAB START") >= 0) { + start = i + 1; + caseName = hwabCase(raw[i]); + break; + } } const from = start ? start : 2; @@ -71,6 +97,11 @@ function normalize(file) { .replace(/^HWAB SOAK [0-9]+ .*$/, "HWAB SOAK "); // Blank lines are dropped without resetting the duplicate filter. if (!/[^ \t]/.test(line)) continue; + // A whole banner from the previously flashed program can survive the + // discard above, buffered by DAPLink and emitted after this program's + // own START. It names the other case, which is how it is recognised. + const lineCase = hwabCase(line); + if (caseName && lineCase && lineCase !== caseName) continue; if (line === prev) continue; out.push(line); prev = line; diff --git a/tests/hw-ab/gen-project.js b/tests/hw-ab/gen-project.js index b9741064a12a..4c0f802528ce 100644 --- a/tests/hw-ab/gen-project.js +++ b/tests/hw-ab/gen-project.js @@ -16,11 +16,13 @@ * string on device surfaces only as panic 999, which carries no * identity; the rewrite is what makes a device failure legible. * body the case file text, verbatim - * footer prints "HWAB PASS " on a loop and never resets + * footer prints "HWAB PASS " for a bounded window, then idles + * without resetting * * The trailing PASS loop and the startup delay both exist because serial * capture cannot begin until the board has re-enumerated after flashing: a - * program that printed its result once, early, would race the capture. + * program that printed its result once, early, would race the capture. The + * window is bounded because only that first minute can be raced. * * Usage: * node tests/hw-ab/gen-project.js @@ -47,6 +49,12 @@ const START_DELAY_MS = 10000; // Interval of the trailing PASS heartbeat and of the soak progress line. const PASS_INTERVAL_MS = 2000; const SOAK_INTERVAL_MS = 5000; +// How long the PASS heartbeat runs before the program goes quiet. It only has +// to outlast the post-flash re-enumeration the capture waits for; streaming +// past that is noise, and a board transmitting indefinitely is suspected of +// aggravating flash failures. +const PASS_WINDOW_MS = 60000; +const PASS_REPEATS = Math.round(PASS_WINDOW_MS / PASS_INTERVAL_MS); // case name -> lang-test0 source file const CASES = { @@ -125,13 +133,17 @@ function header(name) { function footer(name) { return [ "", - "// Reaching here means every assertion held. Repeat the verdict so a", - "// capture that attached late still sees it, and never reset.", - "while (true) {", + "// Reaching here means every assertion held. Repeat the verdict for", + "// " + Math.round(PASS_WINDOW_MS / 1000) + "s so a capture that could only attach after the board", + "// re-enumerated still sees it, then go quiet without resetting.", + "for (let hwabI = 0; hwabI < " + PASS_REPEATS + "; hwabI++) {", " console.log(\"HWAB PASS " + name + "\")", " control.dmesg(\"HWAB PASS " + name + "\")", " basic.pause(" + PASS_INTERVAL_MS + ")", "}", + "while (true) {", + " basic.pause(1000)", + "}", "" ].join("\n"); } diff --git a/tests/hw-ab/run-capture.js b/tests/hw-ab/run-capture.js index e5f73f0484a9..79f6a16640c9 100644 --- a/tests/hw-ab/run-capture.js +++ b/tests/hw-ab/run-capture.js @@ -32,7 +32,10 @@ const USAGE = [ "name that case.", "", "Normal mode (default, --timeout 120):", - " stops at the first \"HWAB PASS\" or \"ASSERT\" line, or at the timeout.", + " stops at the first \"HWAB PASS\" or \"ASSERT\" line, or at the timeout. A", + " timeout with no banner at all means the program never ran -- usually a flash", + " DAPLink rejected -- so the whole flash and capture is retried once, and only", + " the second result is reported. Budget twice the timeout for that case.", " exit 0 HWAB PASS seen", " exit 1 ASSERT seen (the failing line is printed)", " exit 2 timeout with neither", @@ -283,6 +286,28 @@ let devFd = null; let logFd = null; let pumpTimer = null; let stopped = false; +let volumePath = null; // volume the current attempt flashed through + +// DAPLink writes FAIL.TXT to the volume when it rejects an incoming hex (a +// decode failure surfaces as panic 521), and the program then never runs. +// Returns the file's text, or null when there is none or the volume has gone. +function readFailTxt() { + if (!volumePath) return null; + let name = null; + try { + for (const entry of fs.readdirSync(volumePath)) { + if (/^fail\.txt$/i.test(entry)) { name = entry; break; } + } + } catch (e) { + return null; // unmounted, or not readable + } + if (!name) return null; + try { + return fs.readFileSync(path.join(volumePath, name), "latin1"); + } catch (e) { + return null; + } +} function cleanup() { stopped = true; @@ -314,13 +339,19 @@ function pump() { function startReader() { // Frequently enough that a burst at 115200 baud cannot outrun the tty's own - // input buffer between polls. + // input buffer between polls. Clearing `stopped` is what lets a second + // attempt read after the first one's cleanup. + stopped = false; pumpTimer = setInterval(pump, 50); } -async function main() { - const volume = await waitForVolume(VOLUME_WAIT); - if (!volume) { +// One full flash-and-capture cycle: copy the hex, wait for the board to come +// back, open its serial device and read until a verdict or the timeout. Returns +// the outcome for report(). Host and board problems still exit through fail() +// here -- a second attempt at a missing board finds the same missing board. +async function attempt() { + volumePath = await waitForVolume(VOLUME_WAIT); + if (!volumePath) { process.stderr.write( "run-capture: no MICROBIT volume within " + VOLUME_WAIT + "s (looked at:\n" + volumeDesc + ").\n" + @@ -334,11 +365,11 @@ async function main() { process.exit(3); } - process.stdout.write("run-capture: flashing " + hex + " -> " + volume + "\n"); + process.stdout.write("run-capture: flashing " + hex + " -> " + volumePath + "\n"); try { - fs.copyFileSync(hex, path.join(volume, path.basename(hex))); + fs.copyFileSync(hex, path.join(volumePath, path.basename(hex))); } catch (e) { - fail("copy to " + volume + " failed"); + fail("copy to " + volumePath + " failed"); } if (!isWindows) { // Best effort: push the copy out of the page cache before the drive @@ -350,9 +381,9 @@ async function main() { // board. Wait for the drive to go away (best effort -- flashing a small hex // can be quicker than this poll) and then for it to come back. const graceDeadline = nowSeconds() + UNMOUNT_GRACE; - while (nowSeconds() < graceDeadline && isDir(volume)) await sleep(1000); + while (nowSeconds() < graceDeadline && isDir(volumePath)) await sleep(1000); if (!await waitForVolume(REMOUNT_WAIT)) - fail(volume + " did not remount within " + REMOUNT_WAIT + "s after flashing"); + fail(volumePath + " did not remount within " + REMOUNT_WAIT + "s after flashing"); process.stdout.write("run-capture: flashed, board remounted\n"); // The generated programs idle for ~10s before printing, which is the window @@ -454,29 +485,12 @@ async function main() { } cleanup(); const content = verdictBody(readLog()) || ""; - const after = countMatches(content, "HWAB SOAK"); - if (before === null) before = 0; - process.stdout.write("run-capture: HWAB SOAK lines: " + before + - " at checkpoint, " + after + " at end\n"); - const assertLine = firstMatch(content, "ASSERT "); - if (assertLine !== null) { - process.stderr.write("run-capture: FAIL -- assertion during soak:\n"); - writeRaw(process.stderr, assertLine + "\n"); - process.exit(1); - } - if (after > before) { - process.stdout.write( - "run-capture: PASS -- still printing after " + soakMin + " minute(s)\n"); - writeRaw(process.stdout, tailBytes(content, 1)); - process.exit(0); - } - process.stderr.write( - "run-capture: FAIL -- output stalled before the end of the soak.\n" + - "The board stopped printing HWAB SOAK lines, which is what an out-of-memory\n" + - "panic looks like from the host side (the LED matrix will show a sad face and a\n" + - "number; 020/021 are the memory panics). Last captured lines:\n"); - writeRaw(process.stderr, tailBytes(content, 5)); - process.exit(1); + return { + kind: "soak", + before: before === null ? 0 : before, + after: countMatches(content, "HWAB SOAK"), + content: content + }; } process.stdout.write( @@ -488,39 +502,89 @@ async function main() { const assertLine = firstMatch(body, "ASSERT "); if (assertLine !== null) { cleanup(); - process.stderr.write("run-capture: FAIL -- assertion failed on device:\n"); - writeRaw(process.stderr, assertLine + "\n"); - process.stderr.write("run-capture: the board shows a sad face and 45.\n"); - process.exit(1); + return { kind: "assert", line: assertLine }; } const passLine = firstMatch(body, passNeedle); if (passLine !== null) { cleanup(); - writeRaw(process.stdout, - "run-capture: PASS -- " + passLine.replace(/\r/g, "") + "\n"); - process.exit(0); + return { kind: "pass", line: passLine }; } } await sleep(1000); } cleanup(); - const content = readLog(); + const timedOut = readLog(); + return { + kind: "timeout", + content: timedOut, + noBanner: verdictBody(timedOut) === null + }; +} + +function reportSoak(result) { + const content = result.content; + process.stdout.write("run-capture: HWAB SOAK lines: " + result.before + + " at checkpoint, " + result.after + " at end\n"); + const assertLine = firstMatch(content, "ASSERT "); + if (assertLine !== null) { + process.stderr.write("run-capture: FAIL -- assertion during soak:\n"); + writeRaw(process.stderr, assertLine + "\n"); + process.exit(1); + } + if (result.after > result.before) { + process.stdout.write( + "run-capture: PASS -- still printing after " + soakMin + " minute(s)\n"); + writeRaw(process.stdout, tailBytes(content, 1)); + process.exit(0); + } + process.stderr.write( + "run-capture: FAIL -- output stalled before the end of the soak.\n" + + "The board stopped printing HWAB SOAK lines, which is what an out-of-memory\n" + + "panic looks like from the host side (the LED matrix will show a sad face and a\n" + + "number; 020/021 are the memory panics). Last captured lines:\n"); + writeRaw(process.stderr, tailBytes(content, 5)); + process.exit(1); +} + +// Turns an attempt's outcome into the script's output and exit code. +function report(result) { + if (result.kind === "soak") reportSoak(result); + if (result.kind === "assert") { + process.stderr.write("run-capture: FAIL -- assertion failed on device:\n"); + writeRaw(process.stderr, result.line + "\n"); + process.stderr.write("run-capture: the board shows a sad face and 45.\n"); + process.exit(1); + } + if (result.kind === "pass") { + writeRaw(process.stdout, + "run-capture: PASS -- " + result.line.replace(/\r/g, "") + "\n"); + process.exit(0); + } + + const content = result.content; const logLines = countLines(content); const logBytes = content.length; process.stderr.write( "run-capture: TIMEOUT -- no HWAB PASS and no ASSERT within " + timeout + "s.\n" + "Captured " + logLines + " line(s), " + logBytes + " byte(s). Last lines:\n"); writeRaw(process.stderr, tailBytes(content, 5)); - if (verdictBody(content) === null) { + if (result.noBanner) { process.stderr.write( "\nNo \"" + startNeedle() + "\" banner was seen, so no verdict could be read.\n"); + const failText = readFailTxt(); + if (failText !== null) { + process.stderr.write( + "DAPLink left FAIL.TXT on " + volumePath + ": it rejected the hex, so the\n" + + "program never ran.\n"); + writeRaw(process.stderr, failText.replace(/[\r\n]+$/, "") + "\n"); + } const stray = firstHwabLine(content); if (stray !== null) { process.stderr.write( "HWAB output from another program was ignored (stale serial buffer from\n" + - "the previously flashed program, or the flash did not take -- check the\n" + - "MICROBIT drive for FAIL.TXT). First ignored line:\n"); + "the previously flashed program, or the flash did not take). First\n" + + "ignored line:\n"); writeRaw(process.stderr, stray + "\n"); } } @@ -540,6 +604,19 @@ async function main() { process.exit(2); } +async function main() { + let result = await attempt(); + // A timeout with no banner means the program never spoke, and the usual + // cause is a rejected flash (DAPLink error 521), which is intermittent and + // clears on a re-flash. A timeout after a banner is a real verdict about a + // program that did run, so it is reported as it stands. + if (result.kind === "timeout" && result.noBanner) { + process.stderr.write("run-capture: no banner -- re-flashing once\n"); + result = await attempt(); + } + report(result); +} + process.on("exit", cleanup); main().catch(err => { From 16df08dc11cb453a45e3eeab5a34e111f04fd360 Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Sun, 30 Aug 2026 17:55:04 -0700 Subject: [PATCH 06/10] add checked-field-load baseline case --- .../compile-test/lang-test0/README-codegen.md | 20 +++++++- tests/thumb-test/asmchecks.ts | 19 ++++++++ tests/thumb-test/cases/fieldbaseline.ts | 48 +++++++++++++++++++ 3 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 tests/thumb-test/cases/fieldbaseline.ts diff --git a/tests/compile-test/lang-test0/README-codegen.md b/tests/compile-test/lang-test0/README-codegen.md index 8a121df9a03e..1f3118e5b617 100644 --- a/tests/compile-test/lang-test0/README-codegen.md +++ b/tests/compile-test/lang-test0/README-codegen.md @@ -38,6 +38,7 @@ The corpus is sized for two optimization families: | Reference imbalance on an operand consumed by a condition (allocation in a loop header, re-evaluated every iteration) | `55conditionlowering.ts` `testFreshOperands` -- string concatenation, array literal, `slice`, object literal and ternary operands all built inside the header | testlang (wrong final state), hw-ab (allocator/GC failure) | `fresh:concat`, `fresh:arrlit`, `fresh:slicelen`, `fresh:obj`, `fresh:strcmp`, `fresh:tern`; on device, a memory panic instead of an assert | | A condition abandoned part way through by an exception, and conditions used again after the stack unwinds | `55conditionlowering.ts` `testExceptionsInConditions` | testlang, hw-ab | `exn:right`, `exn:left`, `exn:and`, `exn:andshort`, `exn:after`, `exn:loop`; the message carries the actual trace, e.g. `exn:right t!c` | | Threshold miscounting in a count-gated specialization -- members just below and just above the gate behaving differently | `56ifacedispatch.ts` `testThresholds` (`qzLo` 2 sites vs `qzHi` 5+, `qzFew` 4 reads vs `qzMany` 6+) and `testStores` (`qzRare` 2 stores vs `qzHot` 4) | testlang, hw-ab | `th:lo1`, `th:hi1`..`th:hi5`, `th:few*`, `th:many*`, `th:agree`, `st:rare`, `st:hot` | +| The same miscounting for the checked-field-load gate, which counts per class field rather than per interface member and so is not reachable from the semantic layer | `tests/thumb-test/cases/fieldbaseline.ts`, one class whose `qzTally` is read above the gate and `qzSpare` below it, with `asmchecks.ts` counting the inline checked-load sequences by field offset | testthumb | `expected at least 6 inline checked loads of qzTally, found N`, or `listing unexpectedly contains N checked-field-load thunks (ldfldchk_)` | | Arity holes in wrapper-skip -- one member name declared at two arities by two unrelated interfaces | `56ifacedispatch.ts` `testArityCollision`, with the two dispatches interleaved in a loop so neither can be hoisted | testlang, hw-ab | `ar:one1`, `ar:two1`, `ar:mixed` | | A missing trailing argument on a dynamic call (the documented default-parameter constraint) | `56ifacedispatch.ts` `testDefaults` | testlang, hw-ab | `opt:concrete`, `opt:dynagree`, `opt:safe1`..`opt:safe4`, `opt:iface2`, `opt:any2` | | Get and call sharing a dispatch bucket -- one member name that is a field on one type and a method on another | `56ifacedispatch.ts` `testGetCallCollision`, through both interface-typed and `any`-typed references | testlang, hw-ab | `gc:get1`, `gc:call1`, `gc:agree`, `gc:get2`, `gc:call2`, `gc:type` | @@ -46,7 +47,7 @@ The corpus is sized for two optimization families: | Index-signature store fast path misrouting -- a declared field reached through `{ [k: string]: number }`, versus a real map | `56ifacedispatch.ts` `testStores` (`st:idx:*` against a class instance, `st:grow*` against a run-time-keyed map); also in `ifacebaseline.ts` | testlang, testthumb (shape), hw-ab | `st:idx:literal`, `st:idx:class:set`, `st:idx:class:rmw`, `st:grow0`, `st:growsum` | | Stores and accessor calls through interface-typed references, including inherited fields and `super` | `56ifacedispatch.ts` `testStores` | testlang, hw-ab | `st:prop:class`, `st:acc:set`, `st:acc:rmw`, `st:inh:ifaceset`, `st:super:iface`, `st:base:call` | | Dynamic member get on an `any`, by dot, by string literal and by computed key | `56ifacedispatch.ts` `testDynamicGet` | testlang, hw-ab | `dg:dot`, `dg:literal`, `dg:computed`, `dg:missing`, `dg:inst1`..`dg:inst3`, `dg:instcall` | -| Silent optimization loss -- an expected helper, thunk or dispatch sequence quietly stops being emitted, or an unexpected one appears | `tests/thumb-test/cases/boolbaseline.ts` and `ifacebaseline.ts`, whose entries in `asmchecks.ts` name the exact helpers that must and must not appear | testthumb | chai failure from `assertAtLeast` / `assertAbsent` / `assertNoMatch`, e.g. `expected at least 12 calls to numops::toBoolDecr, found 0` or `listing unexpectedly mentions _pxt_map_set_by_string` | +| Silent optimization loss -- an expected helper, thunk or dispatch sequence quietly stops being emitted, or an unexpected one appears | `tests/thumb-test/cases/boolbaseline.ts`, `ifacebaseline.ts` and `fieldbaseline.ts`, whose entries in `asmchecks.ts` name the exact helpers that must and must not appear | testthumb | chai failure from `assertAtLeast` / `assertAbsent` / `assertNoMatch`, e.g. `expected at least 12 calls to numops::toBoolDecr, found 0` or `listing unexpectedly mentions _pxt_map_set_by_string` | | Large silent swing in generated code size | `tests/thumb-test/cases/sizebaseline.ts` via `codeSize` and `assertWithin` | testthumb | `generated code size is N, outside the band lo..hi` | | Invalid Thumb emission -- an unencodable instruction or a stack imbalance | Every thumb-test case, plus every semantic file registered in `externalCases` in `asmchecks.ts`, compiled natively with the lang-test0 prelude | testthumb | `native compile of failed:` followed by the code-9200 diagnostics from the in-process assembler | @@ -133,7 +134,7 @@ sequence codegen chose. ### `tests/thumb-test/cases/ifacebaseline.ts` The dispatch counterpart. Two classes implement one interface; the program does -repeated checked field loads of a single field, repeated interface-dispatched +repeated interface-typed reads of a single field, repeated interface-dispatched calls of a single method, repeated object-literal stores of a single key, an overridden `toString`, and a typed index signature -- each repeated enough times to cross a plausible count gate. Everything feeds a module-level accumulator. @@ -142,6 +143,21 @@ program reaches and on the presence or absence of the specialized forms: checked-field-load thunks, interface-call thunks, specialized map-store thunks, `_iface` proc labels and the by-string map-set helper. +### `tests/thumb-test/cases/fieldbaseline.ts` + +The field-access counterpart, and the only case that reaches the checked field +load path at all: `ifacebaseline.ts`'s field reads have interface-typed +receivers, so they lower to interface dispatch instead. A field read is checked +whenever its receiver is not `this`, so this program keeps every receiver in a +class-typed variable or parameter and reads `qzTally` at six static sites and +`qzSpare` at four, straddling the count gate that decides whether the checked +sequence is hoisted into a per-field thunk. Both fields live on one class that +implements no interface and has no subclass -- an overridden field is treated as +slow and routed through interface dispatch, which would take the reads out of +the path this case exists to pin. Its `asmchecks.ts` entry counts the inline +validate-then-load sequences separately per field, by the load offset, and +asserts the thunk form is absent. + ### `tests/thumb-test/cases/sizebaseline.ts` A fixed dispatch-heavy program -- an interface with three implementations diff --git a/tests/thumb-test/asmchecks.ts b/tests/thumb-test/asmchecks.ts index 2ab2a3a33ca3..f2b8370f96b9 100644 --- a/tests/thumb-test/asmchecks.ts +++ b/tests/thumb-test/asmchecks.ts @@ -129,6 +129,25 @@ export const asmChecks: pxt.Map = { assertNoMatch(asm, /^\s*\S*_iface:/gm, "_iface: proc labels"); }, + "fieldbaseline.ts": (asm) => { + // Checked field loads are emitted inline here: a call into the class's + // validate helper immediately followed by the load. QzCell declares two + // fields, so their offsets are fixed at #4 (qzTally) and #8 (qzSpare), + // and the offset in the sequence is what tells the two apart. The + // floors are the exact read-site counts in the case program -- 6 above + // the count gate and 4 below it -- so a read that stops taking the + // checked path fails here instead of quietly making the case vacuous. + assertAtLeast(asm, /bl _inst_QzCell\S*_validate\S*\n\s*ldr r0, \[r0, #4\]/g, 6, + "inline checked loads of qzTally"); + assertAtLeast(asm, /bl _inst_QzCell\S*_validate\S*\n\s*ldr r0, \[r0, #8\]/g, 4, + "inline checked loads of qzSpare"); + + // Count-gated checked-field-load specialization. Absent here: qzTally + // is calibrated to sit above the gate, so a thunk of any kind means the + // specialization started firing in this tree. + assertNoMatch(asm, /ldfldchk_/g, "checked-field-load thunks (ldfldchk_)"); + }, + "sizebaseline.ts": (asm, res) => { chai.assert(hexSize(res) > 0, "empty hex output"); // Baseline measured on this fixture; see assertWithin on why the band diff --git a/tests/thumb-test/cases/fieldbaseline.ts b/tests/thumb-test/cases/fieldbaseline.ts new file mode 100644 index 000000000000..5b038316a295 --- /dev/null +++ b/tests/thumb-test/cases/fieldbaseline.ts @@ -0,0 +1,48 @@ +// Exercises checked field loads through class-typed receivers. A field read +// takes the checked path whenever its receiver is not `this`, and the +// count-gated checked-field-load specialization keys on how many static read +// sites one class field has, so `qzTally` sits above a plausible gate and +// `qzSpare` below it. Everything feeds a module-level accumulator so no read +// site can be dropped as unused. +// +// Constraints this program must keep, or the case stops testing what it names: +// +// - The class implements no interface and has no subclass, so neither field is +// treated as overridden. An overridden field routes its reads through +// interface dispatch instead of the checked field path -- that is the shape +// `ifacebaseline.ts` covers, and it would make this case vacuous. +// - No receiver is `this`. A `this`-receiver read is unchecked and is not +// counted, so moving a read into a method silently drops it from the count. +// - The field names are unique to this program. Adding or removing one read of +// either name moves it relative to the gate. + +class QzCell { + qzTally: number + qzSpare: number + constructor(tally: number, spare: number) { + this.qzTally = tally + this.qzSpare = spare + } +} + +let acc = 0 +let cellA = new QzCell(1, 2) +let cellB = new QzCell(3, 4) +let cellC = new QzCell(5, 6) + +function addTally(cell: QzCell) { + acc += cell.qzTally +} + +// qzTally: 6 checked read sites, above the gate. +acc += cellA.qzTally +acc += cellB.qzTally +acc += cellC.qzTally +acc += cellA.qzTally + cellB.qzTally +addTally(cellC) + +// qzSpare: 4 checked read sites, below the gate. +acc += cellA.qzSpare +acc += cellB.qzSpare +acc += cellC.qzSpare +acc += cellA.qzSpare From 55dd0ae46809c731233408f780792f6a256b1b52 Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Sun, 30 Aug 2026 19:56:20 -0700 Subject: [PATCH 07/10] diff-ab: take the expected case from context, not log content - the diff takes its expected case from --case or the log's directory instead of log content; DAPLink's buffer can replay a previous program's entire run, START banner included, which fooled content derivation - a stale fragment glued to the front of the expected START banner is cut off - verified against the capture logs that produced the false divergence, plus synthetic glued and genuinely divergent pairs --- tests/hw-ab/README.md | 7 ++-- tests/hw-ab/diff-ab.js | 77 +++++++++++++++++++++++++++++++----------- tests/hw-ab/hwab.js | 6 ++-- 3 files changed, 66 insertions(+), 24 deletions(-) diff --git a/tests/hw-ab/README.md b/tests/hw-ab/README.md index 8bbe3810a8f7..0729ddd5abd8 100644 --- a/tests/hw-ab/README.md +++ b/tests/hw-ab/README.md @@ -136,9 +136,10 @@ assertion id), 2 on timeout, 3 on a host/board problem. A timeout with no banner at all means the program never ran, so it re-flashes once before reporting. `diff-ab.js` exits nonzero on divergence and prints a unified diff of the normalized lines; normalization drops what belongs to the capture rather -than to the build -- a final line cut short when the capture stopped, and -banners naming a different case, which are the previous program's output -arriving out of DAPLink's buffer. +than to the build -- a final line cut short when the capture stopped, and the +previous program's output arriving out of DAPLink's buffer, which can include +that program's entire run. The expected case therefore comes from `--case` +(passed by `hwab`) or the log's directory, never from log content. A pass on both sides is not the whole story, which is why `ab` diffs even when both captures passed: the trace lines between the banners can differ while the diff --git a/tests/hw-ab/diff-ab.js b/tests/hw-ab/diff-ab.js index 5fc65dc54e3a..9819d73a6690 100644 --- a/tests/hw-ab/diff-ab.js +++ b/tests/hw-ab/diff-ab.js @@ -15,21 +15,26 @@ "use strict"; const fs = require("fs"); +const path = require("path"); const USAGE = [ - "Usage: node tests/hw-ab/diff-ab.js ", + "Usage: node tests/hw-ab/diff-ab.js [--case ]", "", "Normalizes two run-capture.js logs and diffs them.", "", "Normalization:", " - CR stripped, blank lines dropped", - " - everything before the first \"HWAB START\" banner is discarded, since a", - " capture can attach part way through a line", + " - the expected case comes from --case, else from the log's parent", + " directory (the out//.log layout); everything before its", + " \"HWAB START \" banner is discarded, including a stale prefix glued", + " to the banner line. DAPLink's buffer can hold a previous program's", + " entire run, START banner included, so content cannot name its own case.", + " With no --case and no such banner, the first START of any case is the", + " sync point.", " - an unterminated final line is dropped -- it means the capture stopped", " mid-line, which is not a divergence", - " - the case name comes from the log's own \"HWAB START\" banner; HWAB lines", - " naming a different case are the previous program's, buffered by DAPLink,", - " and are dropped", + " - HWAB lines naming a different case are the previous program's, buffered", + " by DAPLink, and are dropped", " - HWAB banners, ASSERT failures and the lang-test0 msg() trace lines are all", " compared; a leading \"[12345]\" or \"123ms\" timestamp is stripped", " - \"HWAB SOAK free=.. min=.. total=.. numgc=..\" collapses to", @@ -64,7 +69,7 @@ function hwabCase(line) { return m ? m[1] : ""; } -function normalize(file) { +function normalize(file, expectedCase) { const text = fs.readFileSync(file, "utf8").replace(/\r/g, ""); const raw = splitLines(text); @@ -72,20 +77,41 @@ function normalize(file) { // capture happened to stop is not a divergence. if (raw.length && !/\n$/.test(text)) raw.pop(); - // Serial capture can attach part way through a line, so the sync point is - // the first HWAB START banner; everything before it is discarded. A log - // with no banner at all (capture attached after the program had run) keeps - // all of its lines except the first, which is the one that can be a - // fragment. + // Serial capture can attach part way through a line, and DAPLink's buffer + // can hold a previous program's entire run, START banner included -- so + // when the expected case is known, the sync point is ITS banner, and a + // stale fragment glued to the front of that line is cut off. Only with no + // expected case (or a log that never prints its banner) does the first + // START of any case stand in. A log with no banner at all keeps all of + // its lines except the first, which is the one that can be a fragment. let start = 0; let caseName = ""; + const wanted = expectedCase ? "HWAB START " + expectedCase : null; for (let i = 0; i < raw.length; i++) { - if (raw[i].indexOf("HWAB START") >= 0) { + const at = wanted ? raw[i].indexOf(wanted) : -1; + if (at >= 0) { + raw[i] = raw[i].substr(at); + start = i + 1; + caseName = expectedCase; + break; + } + if (!wanted && raw[i].indexOf("HWAB START") >= 0) { start = i + 1; caseName = hwabCase(raw[i]); break; } } + if (!start && wanted) { + // Expected banner never seen: fall back to any-case sync so a log from + // outside the out// layout still normalizes. + for (let i = 0; i < raw.length; i++) { + if (raw[i].indexOf("HWAB START") >= 0) { + start = i + 1; + caseName = hwabCase(raw[i]); + break; + } + } + } const from = start ? start : 2; const out = []; @@ -212,8 +238,18 @@ function unifiedDiff(a, b, labelA, labelB, context) { } function main(argv) { - if (argv.length !== 2) { usage(process.stderr); return 2; } - for (const f of argv) { + let expectedCase = ""; + const files = []; + for (let i = 0; i < argv.length; i++) { + if (argv[i] === "--case") { + if (i + 1 >= argv.length) { usage(process.stderr); return 2; } + expectedCase = argv[++i]; + } else { + files.push(argv[i]); + } + } + if (files.length !== 2) { usage(process.stderr); return 2; } + for (const f of files) { let ok = false; try { ok = fs.statSync(f).isFile(); } catch (e) { ok = false; } if (!ok) { @@ -222,10 +258,13 @@ function main(argv) { } } - const a = argv[0]; - const b = argv[1]; - const na = normalize(a); - const nb = normalize(b); + const a = files[0]; + const b = files[1]; + // Without --case, the out//.log layout names the case; a log + // from elsewhere falls back to content sync inside normalize(). + if (!expectedCase) expectedCase = path.basename(path.dirname(a)); + const na = normalize(a, expectedCase); + const nb = normalize(b, expectedCase); if (na.concat(nb).some(l => l.indexOf("HWAB SOAK") >= 0)) { process.stdout.write("diff-ab: final soak line\n"); diff --git a/tests/hw-ab/hwab.js b/tests/hw-ab/hwab.js index fed4137c9a76..cc9c5d0c5330 100644 --- a/tests/hw-ab/hwab.js +++ b/tests/hw-ab/hwab.js @@ -252,7 +252,8 @@ function cmdDiff(argv) { missing.map(s => "npm run hwab -- capture " + caseName + " " + s).join(" ; ")); return run("diff-ab.js", [logPath(caseName, "candidate"), - logPath(caseName, "reference")]); + logPath(caseName, "reference"), + "--case", caseName]); } function cmdAb(argv) { @@ -298,7 +299,8 @@ function cmdAb(argv) { stages.push({ name: "diff", run: () => run("diff-ab.js", - [logPath(caseName, "candidate"), logPath(caseName, "reference")]) + [logPath(caseName, "candidate"), logPath(caseName, "reference"), + "--case", caseName]) }); for (const stage of stages) { From 41d52abe3d949134a27830f7dd3846d3aae2679d Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Sun, 30 Aug 2026 20:31:59 -0700 Subject: [PATCH 08/10] soak: fast-fail unflashed runs, fix loop-variable capture in the soak program - a soak whose program never prints (a failed flash) gives up after a 90s grace instead of consuming the whole soak window, which hands it to the existing re-flash retry - the soak program's object literals capture a call parameter instead of the let loop variable, whose closure capture sees the loop's final value (issue filed: https://github.com/microsoft/pxt/issues/11563); its dispatch sanity assert now holds - verified: the corrected dispatch sum on the simulator; soak telemetry flowing through the changed capture path on hardware --- tests/hw-ab/gen-project.js | 10 +++++++++- tests/hw-ab/run-capture.js | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/tests/hw-ab/gen-project.js b/tests/hw-ab/gen-project.js index 4c0f802528ce..0b354611f8d7 100644 --- a/tests/hw-ab/gen-project.js +++ b/tests/hw-ab/gen-project.js @@ -205,11 +205,19 @@ function soakBody() { " }", "", " // The same call site over class instances and object literals.", + " // The literal's lambda captures a call parameter rather than the", + " // loop variable: a closure over a `let` loop variable sees the", + " // loop's final value in static TypeScript, unlike standard", + " // TypeScript.", + " function mkSoakLit(v: number): SoakIface {", + " return { soakVal: () => v }", + " }", + "", " function churnDispatch() {", " const mixed: SoakIface[] = []", " for (let i = 0; i < 40; i++) {", " if (i % 2 == 0) mixed.push(new SoakClass(i))", - " else mixed.push({ soakVal: () => i })", + " else mixed.push(mkSoakLit(i))", " }", " let tot = 0", " for (const mm of mixed) tot += useSoak(mm)", diff --git a/tests/hw-ab/run-capture.js b/tests/hw-ab/run-capture.js index 79f6a16640c9..8b408b60e14e 100644 --- a/tests/hw-ab/run-capture.js +++ b/tests/hw-ab/run-capture.js @@ -477,8 +477,22 @@ async function attempt() { // by the deadline the program stopped printing, which is how a leak ends. let checkpoint = deadline - 60; if (checkpoint <= nowSeconds()) checkpoint = deadline - Math.floor(timeout / 4); + // The program's banner appears within seconds of the startup delay. A + // soak that has printed nothing by this grace deadline never started + // (a failed flash), which must not consume the whole soak window -- + // returning a no-banner timeout here hands it to the re-flash retry. + const bannerGrace = nowSeconds() + 90; + let sawBanner = false; let before = null; while (nowSeconds() < deadline) { + if (!sawBanner) { + sawBanner = verdictBody(readLog()) !== null; + if (!sawBanner && nowSeconds() >= bannerGrace) { + cleanup(); + const content = readLog(); + return { kind: "timeout", content: content, noBanner: true }; + } + } if (before === null && nowSeconds() >= checkpoint) before = countMatches(verdictBody(readLog()) || "", "HWAB SOAK"); await sleep(5000); From d6fb219b8fba35d5f3d4bcf5527b9070221cf909 Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Sun, 30 Aug 2026 20:58:50 -0700 Subject: [PATCH 09/10] add discard period for stale serial output after port opens - discard the first seconds of serial after open: DAPLink replays buffered history, which can include a previous run of the same case --- tests/hw-ab/run-capture.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/hw-ab/run-capture.js b/tests/hw-ab/run-capture.js index 8b408b60e14e..d6a0b2f48663 100644 --- a/tests/hw-ab/run-capture.js +++ b/tests/hw-ab/run-capture.js @@ -284,6 +284,11 @@ function writeRaw(stream, text) { let devFd = null; let logFd = null; +// Serial arriving in the first moments after the port opens is buffered +// history, not the flashed program (which idles for 10s post-reset; the port +// opens within ~6s of it). 3s of discard ends safely inside that quiet window. +const STALE_DISCARD_MS = 3000; +let discardUntil = 0; let pumpTimer = null; let stopped = false; let volumePath = null; // volume the current attempt flashed through @@ -333,6 +338,13 @@ function pump() { return; // EAGAIN while the port is quiet, or the device went away } if (bytes <= 0) return; + // DAPLink flushes serial it buffered while no host was reading, and + // that history can include a previous run of the SAME case -- banners, + // asserts and all -- which no content check can tell apart. But the + // generated programs are silent for their first 10s after the + // post-flash reset, and the port opens well inside that window, so + // anything arriving this early is necessarily history. + if (Date.now() < discardUntil) continue; try { fs.writeSync(logFd, READ_BUF, 0, bytes); } catch (e) { return; } } } @@ -342,6 +354,7 @@ function startReader() { // input buffer between polls. Clearing `stopped` is what lets a second // attempt read after the first one's cleanup. stopped = false; + discardUntil = Date.now() + STALE_DISCARD_MS; pumpTimer = setInterval(pump, 50); } From d87e53c7f3af5309c02fb8addedb58ca69853a0b Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Sun, 30 Aug 2026 23:11:43 -0700 Subject: [PATCH 10/10] add the default-param repro to the native compile set - native-compile 57defaultparamdispatch.ts with the other language tests, so the repro survives the native emitter and the eventual fix is validated there from the start --- tests/thumb-test/asmchecks.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/thumb-test/asmchecks.ts b/tests/thumb-test/asmchecks.ts index f2b8370f96b9..c5716b42f0cb 100644 --- a/tests/thumb-test/asmchecks.ts +++ b/tests/thumb-test/asmchecks.ts @@ -184,4 +184,8 @@ export const externalCases: pxt.Map = { "tests/compile-test/lang-test0/56ifacedispatch.ts": (asm) => { chai.assert(codeSize(asm) > 0, "no code generated"); }, + + "tests/compile-test/lang-test0/57defaultparamdispatch.ts": (asm) => { + chai.assert(codeSize(asm) > 0, "no code generated"); + }, };