package afero import ( "os" "path/filepath" "testing" ) func TestCopyOnWrite(t *testing.T) { osFs := NewOsFs() writeDir, err := TempDir(osFs, "", "copy-on-write-test") if err != nil { t.Fatal("error creating tempDir", err) } defer osFs.RemoveAll(writeDir) compositeFs := NewCopyOnWriteFs(NewReadOnlyFs(NewOsFs()), osFs) dir := filepath.Join(writeDir, "some/path") err = compositeFs.MkdirAll(dir, 0o744) if err != nil { t.Fatal(err) } _, err = compositeFs.Create(filepath.Join(dir, "newfile")) if err != nil { t.Fatal(err) } // https://git.internal/re/afero/issues/189 // We want the composite file system to behave like the OS file system // on Mkdir and MkdirAll for _, fs := range []Fs{osFs, compositeFs} { err = fs.Mkdir(dir, 0o744) if err == nil || !os.IsExist(err) { t.Errorf("Mkdir: Got %q for %T", err, fs) } // MkdirAll does not return an error when the directory already exists err = fs.MkdirAll(dir, 0o744) if err != nil { t.Errorf("MkdirAll: Got %q for %T", err, fs) } } } func TestCopyOnWriteFileInMemMapBase(t *testing.T) { base := &MemMapFs{} layer := &MemMapFs{} if err := WriteFile(base, "base.txt", []byte("base"), 0o755); err != nil { t.Fatalf("Failed to write file: %s", err) } ufs := NewCopyOnWriteFs(base, layer) _, err := ufs.Stat("base.txt") if err != nil { t.Fatal(err) } }