github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/pkg/ioutils/fswriters_test.go (about) 1 package ioutils // import "github.com/Prakhar-Agarwal-byte/moby/pkg/ioutils" 2 3 import ( 4 "bytes" 5 "os" 6 "path/filepath" 7 "runtime" 8 "testing" 9 ) 10 11 var testMode os.FileMode = 0o640 12 13 func init() { 14 // Windows does not support full Linux file mode 15 if runtime.GOOS == "windows" { 16 testMode = 0o666 17 } 18 } 19 20 func TestAtomicWriteToFile(t *testing.T) { 21 tmpDir := t.TempDir() 22 23 expected := []byte("barbaz") 24 if err := AtomicWriteFile(filepath.Join(tmpDir, "foo"), expected, testMode); err != nil { 25 t.Fatalf("Error writing to file: %v", err) 26 } 27 28 actual, err := os.ReadFile(filepath.Join(tmpDir, "foo")) 29 if err != nil { 30 t.Fatalf("Error reading from file: %v", err) 31 } 32 33 if !bytes.Equal(actual, expected) { 34 t.Fatalf("Data mismatch, expected %q, got %q", expected, actual) 35 } 36 37 st, err := os.Stat(filepath.Join(tmpDir, "foo")) 38 if err != nil { 39 t.Fatalf("Error statting file: %v", err) 40 } 41 if expected := testMode; st.Mode() != expected { 42 t.Fatalf("Mode mismatched, expected %o, got %o", expected, st.Mode()) 43 } 44 } 45 46 func TestAtomicWriteSetCommit(t *testing.T) { 47 tmpDir := t.TempDir() 48 49 if err := os.Mkdir(filepath.Join(tmpDir, "tmp"), 0o700); err != nil { 50 t.Fatalf("Error creating tmp directory: %s", err) 51 } 52 53 targetDir := filepath.Join(tmpDir, "target") 54 ws, err := NewAtomicWriteSet(filepath.Join(tmpDir, "tmp")) 55 if err != nil { 56 t.Fatalf("Error creating atomic write set: %s", err) 57 } 58 59 expected := []byte("barbaz") 60 if err := ws.WriteFile("foo", expected, testMode); err != nil { 61 t.Fatalf("Error writing to file: %v", err) 62 } 63 64 if _, err := os.ReadFile(filepath.Join(targetDir, "foo")); err == nil { 65 t.Fatalf("Expected error reading file where should not exist") 66 } 67 68 if err := ws.Commit(targetDir); err != nil { 69 t.Fatalf("Error committing file: %s", err) 70 } 71 72 actual, err := os.ReadFile(filepath.Join(targetDir, "foo")) 73 if err != nil { 74 t.Fatalf("Error reading from file: %v", err) 75 } 76 77 if !bytes.Equal(actual, expected) { 78 t.Fatalf("Data mismatch, expected %q, got %q", expected, actual) 79 } 80 81 st, err := os.Stat(filepath.Join(targetDir, "foo")) 82 if err != nil { 83 t.Fatalf("Error statting file: %v", err) 84 } 85 if expected := testMode; st.Mode() != expected { 86 t.Fatalf("Mode mismatched, expected %o, got %o", expected, st.Mode()) 87 } 88 } 89 90 func TestAtomicWriteSetCancel(t *testing.T) { 91 tmpDir := t.TempDir() 92 93 if err := os.Mkdir(filepath.Join(tmpDir, "tmp"), 0o700); err != nil { 94 t.Fatalf("Error creating tmp directory: %s", err) 95 } 96 97 ws, err := NewAtomicWriteSet(filepath.Join(tmpDir, "tmp")) 98 if err != nil { 99 t.Fatalf("Error creating atomic write set: %s", err) 100 } 101 102 expected := []byte("barbaz") 103 if err := ws.WriteFile("foo", expected, testMode); err != nil { 104 t.Fatalf("Error writing to file: %v", err) 105 } 106 107 if err := ws.Cancel(); err != nil { 108 t.Fatalf("Error committing file: %s", err) 109 } 110 111 if _, err := os.ReadFile(filepath.Join(tmpDir, "target", "foo")); err == nil { 112 t.Fatalf("Expected error reading file where should not exist") 113 } else if !os.IsNotExist(err) { 114 t.Fatalf("Unexpected error reading file: %s", err) 115 } 116 }