add per-OS file variants via files.<os>/ directories
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -304,3 +305,121 @@ func TestRestoreOne(t *testing.T) {
|
||||
t.Errorf("wrong content after restore: %s", string(content))
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyPackages_Overlay(t *testing.T) {
|
||||
tmp := t.TempDir()
|
||||
baseDir := filepath.Join(tmp, "files")
|
||||
linuxDir := filepath.Join(tmp, "files.linux")
|
||||
targetDir := filepath.Join(tmp, "target")
|
||||
|
||||
// Create base files
|
||||
if err := os.MkdirAll(baseDir, 0o755); err != nil {
|
||||
t.Fatalf("failed to create base dir: %v", err)
|
||||
}
|
||||
baseFile := filepath.Join(baseDir, "common.txt")
|
||||
if err := os.WriteFile(baseFile, []byte("common"), 0o644); err != nil {
|
||||
t.Fatalf("failed to create base file: %v", err)
|
||||
}
|
||||
sharedFile := filepath.Join(baseDir, "shared.txt")
|
||||
if err := os.WriteFile(sharedFile, []byte("shared"), 0o644); err != nil {
|
||||
t.Fatalf("failed to create shared file: %v", err)
|
||||
}
|
||||
|
||||
// Create Linux-specific override
|
||||
if err := os.MkdirAll(linuxDir, 0o755); err != nil {
|
||||
t.Fatalf("failed to create linux dir: %v", err)
|
||||
}
|
||||
linuxFile := filepath.Join(linuxDir, "common.txt") // overrides base
|
||||
if err := os.WriteFile(linuxFile, []byte("linux"), 0o644); err != nil {
|
||||
t.Fatalf("failed to create linux file: %v", err)
|
||||
}
|
||||
|
||||
cfg := &packageConfig{}
|
||||
filesDirs := []string{baseDir, linuxDir}
|
||||
|
||||
// Apply both directories
|
||||
if err := ApplyPackages(filesDirs, targetDir, cfg); err != nil {
|
||||
t.Errorf("ApplyPackages failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify shared file from base is linked
|
||||
targetShared := filepath.Join(targetDir, "shared.txt")
|
||||
content, err := os.ReadFile(targetShared)
|
||||
if err != nil {
|
||||
t.Errorf("shared file not found: %v", err)
|
||||
} else if string(content) != "shared" {
|
||||
t.Errorf("shared file wrong content: %s", string(content))
|
||||
}
|
||||
|
||||
// Verify common.txt is overridden by Linux variant
|
||||
targetCommon := filepath.Join(targetDir, "common.txt")
|
||||
content, err = os.ReadFile(targetCommon)
|
||||
if err != nil {
|
||||
t.Errorf("common file not found: %v", err)
|
||||
} else if string(content) != "linux" {
|
||||
t.Errorf("common file should be overridden by linux variant, got: %s", string(content))
|
||||
}
|
||||
|
||||
// Verify symlink points to linux variant
|
||||
src, err := os.Readlink(targetCommon)
|
||||
if err != nil {
|
||||
t.Errorf("failed to read symlink: %v", err)
|
||||
} else if !strings.HasSuffix(src, "files.linux/common.txt") {
|
||||
t.Errorf("symlink should point to linux variant, got: %s", src)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFindStaleLinksMulti_WithVariants(t *testing.T) {
|
||||
tmp := t.TempDir()
|
||||
baseDir := filepath.Join(tmp, "files")
|
||||
linuxDir := filepath.Join(tmp, "files.linux")
|
||||
targetDir := filepath.Join(tmp, "target")
|
||||
|
||||
if err := os.MkdirAll(baseDir, 0o755); err != nil {
|
||||
t.Fatalf("failed to create base dir: %v", err)
|
||||
}
|
||||
if err := os.MkdirAll(linuxDir, 0o755); err != nil {
|
||||
t.Fatalf("failed to create linux dir: %v", err)
|
||||
}
|
||||
if err := os.MkdirAll(targetDir, 0o755); err != nil {
|
||||
t.Fatalf("failed to create target dir: %v", err)
|
||||
}
|
||||
|
||||
// Create files
|
||||
baseFile := filepath.Join(baseDir, "base.txt")
|
||||
if err := os.WriteFile(baseFile, []byte("base"), 0o644); err != nil {
|
||||
t.Fatalf("failed to create base file: %v", err)
|
||||
}
|
||||
linuxFile := filepath.Join(linuxDir, "linux.txt")
|
||||
if err := os.WriteFile(linuxFile, []byte("linux"), 0o644); err != nil {
|
||||
t.Fatalf("failed to create linux file: %v", err)
|
||||
}
|
||||
|
||||
// Create symlinks
|
||||
targetBase := filepath.Join(targetDir, "base.txt")
|
||||
if err := os.Symlink(baseFile, targetBase); err != nil {
|
||||
t.Fatalf("failed to create base symlink: %v", err)
|
||||
}
|
||||
targetLinux := filepath.Join(targetDir, "linux.txt")
|
||||
if err := os.Symlink(linuxFile, targetLinux); err != nil {
|
||||
t.Fatalf("failed to create linux symlink: %v", err)
|
||||
}
|
||||
|
||||
// Delete the linux source file to create a stale link
|
||||
if err := os.Remove(linuxFile); err != nil {
|
||||
t.Fatalf("failed to remove linux file: %v", err)
|
||||
}
|
||||
|
||||
filesDirs := []string{baseDir, linuxDir}
|
||||
stale, err := FindStaleLinksMulti(filesDirs, targetDir)
|
||||
if err != nil {
|
||||
t.Errorf("FindStaleLinksMulti failed: %v", err)
|
||||
}
|
||||
|
||||
if len(stale) != 1 {
|
||||
t.Errorf("expected 1 stale link, got %d", len(stale))
|
||||
}
|
||||
if len(stale) > 0 && stale[0] != targetLinux {
|
||||
t.Errorf("expected stale link to be %s, got %s", targetLinux, stale[0])
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user