overlay_test.go (2023B)
1 package vfs 2 3 import ( 4 "errors" 5 "strings" 6 "testing" 7 ) 8 9 func testBase() *Node { 10 root := NewDir("/") 11 home := root.AddDir("home").AddDir("u") 12 home.AddFile("bio", "hi") 13 home.AddDir("projects").AddFile("info", "x") 14 root.AddDir("tmp") 15 return root 16 } 17 18 func TestOverlayNeverTouchesBase(t *testing.T) { 19 base := testBase() 20 ov := NewOverlay() 21 fs := NewFS(base, "/home/u", ov) 22 if err := fs.Write("/home/u/bio", "changed"); err != nil { 23 t.Fatal(err) 24 } 25 if err := fs.Remove("/home/u/projects"); err != nil { 26 t.Fatal(err) 27 } 28 if err := fs.Mkdir("/home/u/new"); err != nil { 29 t.Fatal(err) 30 } 31 if base.Lookup("/home/u/bio").Content != "hi" || base.Lookup("/home/u/projects") == nil || base.Lookup("/home/u/new") != nil { 32 t.Fatal("base mutated") 33 } 34 // a fresh view replays the overlay 35 again := NewFS(base, "/home/u", ov) 36 if again.Get("/home/u/bio").Content != "changed" || again.Get("/home/u/projects") != nil || again.Get("/home/u/new") == nil { 37 t.Fatal("overlay not replayed") 38 } 39 // recreating a deleted base dir starts empty 40 if err := again.Mkdir("/home/u/projects"); err != nil { 41 t.Fatal(err) 42 } 43 if n := NewFS(base, "/home/u", ov).Get("/home/u/projects"); n == nil || len(n.Children) != 0 { 44 t.Fatal("fresh dir merged with base") 45 } 46 ov.Reset() 47 if NewFS(base, "/home/u", ov).Get("/home/u/bio").Content != "hi" { 48 t.Fatal("reset") 49 } 50 } 51 52 func TestOverlayPermissionsAndQuota(t *testing.T) { 53 fs := NewFS(testBase(), "/home/u", nil) 54 for p, want := range map[string]error{ 55 "/": ErrPermission, 56 "/home/x": ErrPermission, 57 "/etc/passwd": ErrNotExist, 58 "/home/u/bio/x": ErrNotDir, 59 "/tmp/ok": nil, 60 "/home/u/ok": nil, 61 } { 62 if got := fs.CheckCreate(p); !errors.Is(got, want) && got != want { 63 t.Errorf("CheckCreate(%s) = %v, want %v", p, got, want) 64 } 65 } 66 big := strings.Repeat("x", OverlayQuota) 67 if err := fs.Write("/tmp/big", big); !errors.Is(err, ErrNoSpace) { 68 t.Fatalf("quota: %v", err) 69 } 70 if fs.Get("/tmp/big") != nil { 71 t.Fatal("over-quota write applied") 72 } 73 }