diff --git a/cmd/metis/gate_test.go b/cmd/metis/gate_test.go index f76d8f7..b75c01e 100644 --- a/cmd/metis/gate_test.go +++ b/cmd/metis/gate_test.go @@ -127,16 +127,75 @@ func TestMainAndCommandFatalBranches(t *testing.T) { main() }) mustPanic(func() { configCmd(nil) }) + root := t.TempDir() + invPath, _ := writeTestInventory(t, root) + mustPanic(func() { configCmd([]string{"--inventory", invPath, "--node", "missing"}) }) mustPanic(func() { planCmd([]string{"--inventory", "/nope", "--node", "titan-15"}) }) mustPanic(func() { burnCmd([]string{"--inventory", "/nope", "--node", "titan-15", "--device", "/dev/sdz"}) }) mustPanic(func() { imageCmd(nil) }) + mustPanic(func() { + imageCmd([]string{"--inventory", invPath, "--node", "titan-15", "--cache", filepath.Join(root, "cache")}) + }) mustPanic(func() { injectCmd(nil) }) + mustPanic(func() { injectCmd([]string{"--node", "titan-15"}) }) + mustPanic(func() { + injectCmd([]string{"--inventory", invPath, "--node", "missing", "--boot", filepath.Join(root, "boot")}) + }) mustPanic(func() { factsCmd([]string{"--inventory", "/nope", "--snapshots", "/nope"}) }) + mustPanic(func() { + factsCmd([]string{"--inventory", invPath, "--snapshots", filepath.Join(root, "missing-snaps")}) + }) + mustPanic(func() { serveCmd([]string{"--bind", ":0"}) }) + t.Setenv("METIS_INVENTORY_PATH", invPath) + t.Setenv("METIS_DATA_DIR", filepath.Join(root, "data")) + listenAndServe = func(string, http.Handler) error { return http.ErrServerClosed } + t.Cleanup(func() { listenAndServe = httpListenAndServe }) mustPanic(func() { serveCmd([]string{"--bind", ":0"}) }) mustPanic(func() { remoteBuildCmd([]string{"--node", "n1"}) }) mustPanic(func() { remoteFlashCmd([]string{"--node", "n1"}) }) } +func TestFactsCmdReportsEncodeErrors(t *testing.T) { + root := t.TempDir() + invPath, _ := writeTestInventory(t, root) + snapDir := filepath.Join(root, "snapshots") + if err := os.MkdirAll(snapDir, 0o755); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(snapDir, "snap.json"), []byte(`{"hostname":"titan-15","kernel":"6.6.63"}`), 0o644); err != nil { + t.Fatal(err) + } + + oldStdout := os.Stdout + oldStderr := os.Stderr + badStdout, stdoutWriter, err := os.Pipe() + if err != nil { + t.Fatal(err) + } + stderrReader, stderrWriter, err := os.Pipe() + if err != nil { + t.Fatal(err) + } + os.Stdout = badStdout + os.Stderr = stderrWriter + t.Cleanup(func() { + os.Stdout = oldStdout + os.Stderr = oldStderr + _ = badStdout.Close() + _ = stdoutWriter.Close() + _ = stderrReader.Close() + _ = stderrWriter.Close() + }) + + factsCmd([]string{"--inventory", invPath, "--snapshots", snapDir}) + _ = stderrWriter.Close() + buf := make([]byte, 1024) + n, _ := stderrReader.Read(buf) + if !strings.Contains(string(buf[:n]), "encode:") { + t.Fatalf("expected encode error on stderr, got %q", string(buf[:n])) + } +} + func TestRemoteCommandHelpers(t *testing.T) { if !hasMountedChildren([]struct { Mountpoint string `json:"mountpoint"` diff --git a/pkg/inject/coverage_more_test.go b/pkg/inject/coverage_more_test.go index 1bf45d9..1663e98 100644 --- a/pkg/inject/coverage_more_test.go +++ b/pkg/inject/coverage_more_test.go @@ -33,4 +33,13 @@ func TestInjectorWriteBranches(t *testing.T) { if err := inj.Write([]FileSpec{{Path: "x", Content: []byte("x")}}); err == nil { t.Fatal("expected mkdir error") } + + targetDir := filepath.Join(boot, "already-dir") + if err := os.MkdirAll(targetDir, 0o755); err != nil { + t.Fatal(err) + } + inj = &Injector{BootPath: boot} + if err := inj.Write([]FileSpec{{Path: "already-dir", Content: []byte("x"), Mode: 0o644}}); err == nil { + t.Fatal("expected write error when target path is a directory") + } }