mesh-checking-program -verdict reads the facts from the file the build seat's run step names, judges them with the rules package and answers one versioned line; facts of a version it does not read are refused, naming it, because the running checker of B0 runs G's programs (milestone 47/B0, ADR 0644, ADR 0656). Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
75 lines
2.9 KiB
Go
75 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/delivery"
|
|
"mesh-delivery-checker/rules"
|
|
)
|
|
|
|
// 1921 (B0, D2): the checking program answers, on its last line, the verdict the rules give the facts in its input, and
|
|
// refuses facts of a version it does not read, an input it is not given, and a question it is not asked, naming each.
|
|
func TestTheCheckingProgramAnswersTheVerdictOfItsFacts(t *testing.T) {
|
|
failing, _ := json.Marshal(rules.Tested{Level: delivery.LevelUnit, Tests: 3, Failed: []rules.Failure{{Package: "x/a", Test: "TestA", Cause: "a_test.go:9: boom"}}})
|
|
facts := rules.Facts{V: rules.FactsVersion, Group: "feat/x", Heads: "0123456789ab", Members: []rules.Member{{Repository: "novox/x", Number: 3, Head: "h"}},
|
|
Steps: []rules.Step{
|
|
{Repository: "novox/x", Number: 3, Module: "mesh-build-go", Node: "laptop", Level: &delivery.LevelAnswer{Level: delivery.LevelUnit, Tests: []json.RawMessage{failing}}},
|
|
{Repository: "novox/x", Number: 3, Failed: &delivery.FailedFirst{Machine: "laptop", Words: "novox/x#3 has files in conflict: go.mod"}},
|
|
}}
|
|
dir := t.TempDir()
|
|
write := func(name string, v any) string {
|
|
data, _ := json.Marshal(v)
|
|
p := filepath.Join(dir, name)
|
|
if err := os.WriteFile(p, data, 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return p
|
|
}
|
|
v1 := write("v1.json", facts)
|
|
later := facts
|
|
later.V = rules.FactsVersion + 1
|
|
v2 := write("v2.json", later)
|
|
for name, c := range map[string]struct {
|
|
args []string
|
|
input string
|
|
exit int
|
|
said string
|
|
}{
|
|
"the facts": {[]string{"-verdict"}, v1, 0, ""},
|
|
"a later version": {[]string{"-verdict"}, v2, 2, "facts of version 2, this checking program reads version 1"},
|
|
"no input": {[]string{"-verdict"}, "", 2, delivery.RunInputEnv + " names no file"},
|
|
"nothing asked": {nil, v1, 2, "nothing asked"},
|
|
"an unknown asking": {[]string{"-judge"}, v1, 2, "-judge"},
|
|
} {
|
|
var out, errs bytes.Buffer
|
|
exit := run(c.args, func(k string) string {
|
|
if k == delivery.RunInputEnv {
|
|
return c.input
|
|
}
|
|
return ""
|
|
}, &out, &errs)
|
|
if exit != c.exit || !strings.Contains(errs.String(), c.said) {
|
|
t.Errorf("%s: exit %d, said %q; want %d and %q", name, exit, errs.String(), c.exit, c.said)
|
|
continue
|
|
}
|
|
if c.exit != 0 {
|
|
continue
|
|
}
|
|
lines := strings.Split(strings.TrimSpace(out.String()), "\n")
|
|
var a rules.Answer
|
|
if err := json.Unmarshal([]byte(lines[len(lines)-1]), &a); err != nil || a.V != rules.AnswerVersion {
|
|
t.Fatalf("%s: the last line %q: %v", name, lines[len(lines)-1], err)
|
|
}
|
|
if want := rules.Judge(facts); !reflect.DeepEqual(a.Verdict, want) || a.Verdict.State != delivery.VerdictFail || len(a.Verdict.Failures) != 2 ||
|
|
a.Verdict.Failures[1].Words != "novox/x#3 has files in conflict: go.mod" || a.Verdict.Machines[0] != "laptop" || a.Verdict.Levels[delivery.LevelUnit].Run != 3 {
|
|
t.Errorf("%s: the verdict %+v, want %+v", name, a.Verdict, want)
|
|
}
|
|
}
|
|
}
|