prime8dev

prime8dev
git clone https://git.prime8.dev/prime8dev.git
Log | Files | Refs | README | LICENSE

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 }