64 lines
2.8 KiB
Go
64 lines
2.8 KiB
Go
package build
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/delivery"
|
|
)
|
|
|
|
func tcs(language, version string, nodes ...string) []delivery.NodeToolchain {
|
|
var out []delivery.NodeToolchain
|
|
for _, n := range nodes {
|
|
out = append(out, delivery.NodeToolchain{Node: n, Toolchain: delivery.Toolchain{Language: language, Version: version, Recipe: "1"}})
|
|
}
|
|
return out
|
|
}
|
|
|
|
func TestChooseTakesTheAgreedNodesWithFewestRunningStepsTiesByName(t *testing.T) { // 1607/AC4, ADR 0478 clause 3
|
|
entries := tcs("go", "go1.27.1", "novox", "ace", "g14", "shanks")
|
|
nodes, tc, err := ChooseNodes("go", entries, map[string]int{"novox": 3, "ace": 1, "g14": 1, "shanks": 0}, 2)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(nodes) != 2 || nodes[0] != "shanks" || nodes[1] != "ace" {
|
|
t.Errorf("nodes = %v, want [shanks ace]: fewest steps first, a tie by name", nodes)
|
|
}
|
|
if tc.Version != "go1.27.1" || tc.Recipe != "1" || tc.Language != "go" {
|
|
t.Errorf("toolchain = %+v", tc)
|
|
}
|
|
}
|
|
|
|
func TestChooseWithOneNodeAnswersOneNode(t *testing.T) { // 1607/AC4
|
|
nodes, _, err := ChooseNodes("go", tcs("go", "go1.27.1", "novox"), nil, 2)
|
|
if err != nil || len(nodes) != 1 || nodes[0] != "novox" {
|
|
t.Errorf("nodes = %v, err %v, want [novox]", nodes, err)
|
|
}
|
|
}
|
|
|
|
func TestChooseFailsNamingTheLanguageAndTheVersionsWhenNoNodeQualifies(t *testing.T) { // 1607/AC4
|
|
_, _, err := ChooseNodes("typescript", nil, nil, 2)
|
|
if err == nil || !strings.Contains(err.Error(), "typescript") || !strings.Contains(err.Error(), delivery.ToolchainNoReport) {
|
|
t.Errorf("no report: error = %v, want it to name typescript and %q", err, delivery.ToolchainNoReport)
|
|
}
|
|
entries := append(tcs("go", "go1.27.1", "novox"), tcs("go", "go1.26.0", "ace")...)
|
|
_, _, err = ChooseNodes("go", entries, nil, 2)
|
|
if err == nil || !strings.Contains(err.Error(), "go1.27.1") || !strings.Contains(err.Error(), "go1.26.0") || !strings.Contains(err.Error(), "go") {
|
|
t.Errorf("disagreeing nodes: error = %v, want both versions named", err)
|
|
}
|
|
}
|
|
|
|
func TestAgreeNeedsEqualDigestsAndNamesBothNodesWhenTheyDiffer(t *testing.T) { // 1607/AC4, ADR 0478 clause 4
|
|
d, err := Agree("tool", map[string]string{"ace": digest, "novox": digest})
|
|
if err != nil || d != digest {
|
|
t.Errorf("Agree = %q, %v, want %q", d, err, digest)
|
|
}
|
|
_, err = Agree("tool", map[string]string{"ace": digest, "novox": "sha256:" + hex64('9')})
|
|
if err == nil || !strings.Contains(err.Error(), "ace") || !strings.Contains(err.Error(), "novox") || !strings.Contains(err.Error(), digest) || !strings.Contains(err.Error(), hex64('9')) || !strings.Contains(err.Error(), "tool") {
|
|
t.Errorf("differing digests: error = %v, want the artifact, both nodes and both digests", err)
|
|
}
|
|
if d, err := Agree("tool", map[string]string{"ace": digest}); err != nil || d != digest {
|
|
t.Errorf("one node: %q, %v", d, err)
|
|
}
|
|
}
|