github.com/gozelle/afero@v0.0.0-20230510083704-09e2ff18f19e/copyOnWriteFs_test.go (about)

     1  package afero
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"testing"
     7  )
     8  
     9  func TestCopyOnWrite(t *testing.T) {
    10  	osFs := NewOsFs()
    11  	writeDir, err := TempDir(osFs, "", "copy-on-write-test")
    12  	if err != nil {
    13  		t.Fatal("error creating tempDir", err)
    14  	}
    15  	defer osFs.RemoveAll(writeDir)
    16  	
    17  	compositeFs := NewCopyOnWriteFs(NewReadOnlyFs(NewOsFs()), osFs)
    18  	
    19  	dir := filepath.Join(writeDir, "some/path")
    20  	
    21  	err = compositeFs.MkdirAll(dir, 0o744)
    22  	if err != nil {
    23  		t.Fatal(err)
    24  	}
    25  	_, err = compositeFs.Create(filepath.Join(dir, "newfile"))
    26  	if err != nil {
    27  		t.Fatal(err)
    28  	}
    29  	
    30  	// https://github.com/gozelle/afero/issues/189
    31  	// We want the composite file system to behave like the OS file system
    32  	// on Mkdir and MkdirAll
    33  	for _, fs := range []Fs{osFs, compositeFs} {
    34  		err = fs.Mkdir(dir, 0o744)
    35  		if err == nil || !os.IsExist(err) {
    36  			t.Errorf("Mkdir: Got %q for %T", err, fs)
    37  		}
    38  		
    39  		// MkdirAll does not return an error when the directory already exists
    40  		err = fs.MkdirAll(dir, 0o744)
    41  		if err != nil {
    42  			t.Errorf("MkdirAll:  Got %q for %T", err, fs)
    43  		}
    44  		
    45  	}
    46  }
    47  
    48  func TestCopyOnWriteFileInMemMapBase(t *testing.T) {
    49  	base := &MemMapFs{}
    50  	layer := &MemMapFs{}
    51  	
    52  	if err := WriteFile(base, "base.txt", []byte("base"), 0o755); err != nil {
    53  		t.Fatalf("Failed to write file: %s", err)
    54  	}
    55  	
    56  	ufs := NewCopyOnWriteFs(base, layer)
    57  	
    58  	_, err := ufs.Stat("base.txt")
    59  	if err != nil {
    60  		t.Fatal(err)
    61  	}
    62  }