package image import ( "os" "os/exec" "path/filepath" "testing" "metis/pkg/inject" ) func TestWriteExt4Files(t *testing.T) { if _, err := exec.LookPath("mkfs.ext4"); err != nil { t.Skip("mkfs.ext4 not available") } if _, err := exec.LookPath("debugfs"); err != nil { t.Skip("debugfs not available") } workDir := t.TempDir() fsPath := filepath.Join(workDir, "root.ext4") f, err := os.Create(fsPath) if err != nil { t.Fatal(err) } if err := f.Truncate(32 * 1024 * 1024); err != nil { t.Fatal(err) } if err := f.Close(); err != nil { t.Fatal(err) } cmd := exec.Command("mkfs.ext4", "-F", fsPath) if out, err := cmd.CombinedOutput(); err != nil { t.Fatalf("mkfs.ext4: %v: %s", err, string(out)) } files := []inject.FileSpec{ { Path: "etc/metis/firstboot.env", Content: []byte("METIS_HOSTNAME='titan-13'\n"), Mode: 0o600, RootFS: true, }, { Path: "usr/local/sbin/test.sh", Content: []byte("#!/usr/bin/env bash\nexit 0\n"), Mode: 0o755, RootFS: true, }, } if err := writeExt4Files(fsPath, files); err != nil { t.Fatalf("writeExt4Files: %v", err) } } func TestParentDirs(t *testing.T) { got := parentDirs("etc/metis/firstboot.env") want := []string{"/etc", "/etc/metis"} if len(got) != len(want) { t.Fatalf("parentDirs length mismatch: got %v want %v", got, want) } for i := range want { if got[i] != want[i] { t.Fatalf("parentDirs[%d] = %q want %q", i, got[i], want[i]) } } } func TestInjectRootFSWithProgressSkipsWhenNoRootFiles(t *testing.T) { steps := make([]string, 0) err := InjectRootFSWithProgress("unused.img", []inject.FileSpec{ { Path: "boot/env.txt", Content: []byte("ignored"), Mode: 0o644, RootFS: false, }, }, func(step string) { steps = append(steps, step) }) if err != nil { t.Fatalf("expected no error when there are no rootfs files, got %v", err) } if len(steps) != 0 { t.Fatalf("expected no progress callbacks, got %#v", steps) } }