2026-03-31 14:52:50 -03:00
|
|
|
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])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-20 01:33:02 -03:00
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
}
|
|
|
|
|
}
|