45 lines
1.3 KiB
Go
45 lines
1.3 KiB
Go
|
|
package image
|
||
|
|
|
||
|
|
import (
|
||
|
|
"metis/pkg/inject"
|
||
|
|
"os"
|
||
|
|
"os/exec"
|
||
|
|
"path/filepath"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Use a disposable filesystem image to verify actual debugfs symlink semantics.
|
||
|
|
func TestSystemdSymlinkOnExt4(t *testing.T) {
|
||
|
|
for _, tool := range []string{"mkfs.ext4", "debugfs"} {
|
||
|
|
if _, err := exec.LookPath(tool); err != nil {
|
||
|
|
t.Skip("filesystem tools unavailable")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
fs := filepath.Join(t.TempDir(), "test.ext4")
|
||
|
|
f, err := os.Create(fs)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if err = f.Truncate(16 * 1024 * 1024); err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if err = f.Close(); err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if out, err := exec.Command("mkfs.ext4", "-q", "-F", fs).CombinedOutput(); err != nil {
|
||
|
|
t.Fatalf("mkfs: %v %s", err, out)
|
||
|
|
}
|
||
|
|
files := []inject.FileSpec{
|
||
|
|
{Path: "etc/systemd/system/metis-node-identity.service", Content: []byte("[Unit]\nDescription=Test\n"), Mode: 0644, RootFS: true},
|
||
|
|
{Path: "etc/systemd/system/multi-user.target.wants/metis-node-identity.service", Symlink: "../metis-node-identity.service", RootFS: true},
|
||
|
|
}
|
||
|
|
for i := 0; i < 2; i++ {
|
||
|
|
if err := writeExt4Files(fs, files); err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if err := verifyExt4File(fs, inject.FileSpec{Path: files[1].Path, Symlink: "../wrong.service"}, t.TempDir()); err == nil {
|
||
|
|
t.Fatal("wrong target accepted")
|
||
|
|
}
|
||
|
|
}
|