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