clean brittle tests (#9)
Reviewed-on: #9 Reviewed-by: xtul <mpiasecki720@protonmail.com> Co-authored-by: vickydotbat <vickydotbat@tutamail.com> Co-committed-by: vickydotbat <vickydotbat@tutamail.com>
This commit was merged in pull request #9.
This commit is contained in:
@@ -25,22 +25,54 @@ func TestHelpAndNoArgs(t *testing.T) {
|
||||
if code := run([]string{"help"}, &out, &errw); code != exitOK {
|
||||
t.Fatalf("help exit=%d want %d", code, exitOK)
|
||||
}
|
||||
if !strings.Contains(out.String(), "builders:") {
|
||||
t.Fatalf("help output missing builders section:\n%s", out.String())
|
||||
for _, builder := range Registry {
|
||||
if !strings.Contains(out.String(), builder.Name) {
|
||||
t.Errorf("help output missing builder %q:\n%s", builder.Name, out.String())
|
||||
}
|
||||
}
|
||||
// No args is a usage error (exit 64) but still prints help.
|
||||
out.Reset()
|
||||
if code := run(nil, &out, &errw); code != exitUsage {
|
||||
t.Fatalf("no-args exit=%d want %d", code, exitUsage)
|
||||
}
|
||||
if out.Len() == 0 {
|
||||
t.Fatal("no-args usage error should include help")
|
||||
}
|
||||
}
|
||||
|
||||
func TestListCoversRegistry(t *testing.T) {
|
||||
var out bytes.Buffer
|
||||
list(&out)
|
||||
for _, b := range Registry {
|
||||
if !strings.Contains(out.String(), b.Name) || !strings.Contains(out.String(), b.Bin) {
|
||||
t.Fatalf("list missing %s/%s:\n%s", b.Name, b.Bin, out.String())
|
||||
lines := strings.Split(strings.TrimSpace(out.String()), "\n")
|
||||
if len(lines) != len(Registry) {
|
||||
t.Fatalf("list returned %d rows for %d builders:\n%s", len(lines), len(Registry), out.String())
|
||||
}
|
||||
builders := make(map[string]Builder, len(Registry))
|
||||
for _, builder := range Registry {
|
||||
builders[builder.Name] = builder
|
||||
}
|
||||
seen := make(map[string]bool, len(lines))
|
||||
for _, line := range lines {
|
||||
fields := strings.Split(strings.TrimSpace(line), "\t")
|
||||
if len(fields) != 3 {
|
||||
t.Fatalf("list row must be name<TAB>bin<TAB>summary, got %q", line)
|
||||
}
|
||||
builder, ok := builders[fields[0]]
|
||||
if !ok {
|
||||
t.Errorf("list returned unregistered builder %q", fields[0])
|
||||
continue
|
||||
}
|
||||
if fields[1] != builder.Bin {
|
||||
t.Errorf("builder %q listed binary %q, want %q", builder.Name, fields[1], builder.Bin)
|
||||
}
|
||||
if strings.TrimSpace(fields[2]) == "" {
|
||||
t.Errorf("builder %q listed an empty summary", builder.Name)
|
||||
}
|
||||
seen[fields[0]] = true
|
||||
}
|
||||
for _, builder := range Registry {
|
||||
if !seen[builder.Name] {
|
||||
t.Errorf("list missing builder %q", builder.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -50,8 +82,8 @@ func TestUnknownBuilderFailsUsage(t *testing.T) {
|
||||
if code := run([]string{"frobnicate"}, &out, &errw); code != exitUsage {
|
||||
t.Fatalf("unknown builder exit=%d want %d", code, exitUsage)
|
||||
}
|
||||
if !strings.Contains(errw.String(), "unknown builder") {
|
||||
t.Fatalf("unknown builder stderr=%q", errw.String())
|
||||
if errw.Len() == 0 {
|
||||
t.Fatal("unknown builder should explain the usage error")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,8 +97,8 @@ func TestUnwiredBuilderFailsClosed(t *testing.T) {
|
||||
if code := run([]string{b.Name}, &out, &errw); code != exitUnwired {
|
||||
t.Errorf("crucible %s: exit=%d want %d (must fail closed)", b.Name, code, exitUnwired)
|
||||
}
|
||||
if !strings.Contains(errw.String(), "not wired") {
|
||||
t.Errorf("crucible %s: stderr missing fail-closed message: %q", b.Name, errw.String())
|
||||
if errw.Len() == 0 {
|
||||
t.Errorf("crucible %s: missing fail-closed explanation", b.Name)
|
||||
}
|
||||
// Via standalone shim path.
|
||||
out.Reset()
|
||||
@@ -93,8 +125,8 @@ func TestWiredBuilderRejectsBadInvocation(t *testing.T) {
|
||||
if code := runBuilder(b.Name, []string{"frobnicate"}, &out, &errw); code != exitUsage {
|
||||
t.Errorf("crucible %s frobnicate: exit=%d want %d", b.Name, code, exitUsage)
|
||||
}
|
||||
if !strings.Contains(errw.String(), "unknown subcommand") {
|
||||
t.Errorf("crucible %s frobnicate: stderr=%q", b.Name, errw.String())
|
||||
if errw.Len() == 0 {
|
||||
t.Errorf("crucible %s frobnicate: missing usage explanation", b.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -105,8 +137,13 @@ func TestBuilderHelpIsOK(t *testing.T) {
|
||||
if code := runBuilder(b.Name, []string{"--help"}, &out, &errw); code != exitOK {
|
||||
t.Errorf("%s --help: exit=%d want %d", b.Name, code, exitOK)
|
||||
}
|
||||
if !strings.Contains(out.String(), b.Summary) {
|
||||
t.Errorf("%s --help: missing summary", b.Name)
|
||||
if !strings.Contains(out.String(), b.Name) || !strings.Contains(out.String(), b.Bin) {
|
||||
t.Errorf("%s --help: missing builder identity", b.Name)
|
||||
}
|
||||
for _, subcommand := range b.subcommands() {
|
||||
if !strings.Contains(out.String(), subcommand) {
|
||||
t.Errorf("%s --help: missing subcommand %q", b.Name, subcommand)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user