13 testMode os.FileMode = 0640
17 // Windows does not support full Linux file mode
18 if runtime.GOOS == "windows" {
23 func TestAtomicWriteToFile(t *testing.T) {
24 tmpDir, err := ioutil.TempDir("", "atomic-writers-test")
26 t.Fatalf("Error when creating temporary directory: %s", err)
28 defer os.RemoveAll(tmpDir)
30 expected := []byte("barbaz")
31 if err := AtomicWriteFile(filepath.Join(tmpDir, "foo"), expected, testMode); err != nil {
32 t.Fatalf("Error writing to file: %v", err)
35 actual, err := ioutil.ReadFile(filepath.Join(tmpDir, "foo"))
37 t.Fatalf("Error reading from file: %v", err)
40 if !bytes.Equal(actual, expected) {
41 t.Fatalf("Data mismatch, expected %q, got %q", expected, actual)
44 st, err := os.Stat(filepath.Join(tmpDir, "foo"))
46 t.Fatalf("Error statting file: %v", err)
48 if expected := os.FileMode(testMode); st.Mode() != expected {
49 t.Fatalf("Mode mismatched, expected %o, got %o", expected, st.Mode())
53 func TestAtomicWriteSetCommit(t *testing.T) {
54 tmpDir, err := ioutil.TempDir("", "atomic-writerset-test")
56 t.Fatalf("Error when creating temporary directory: %s", err)
58 defer os.RemoveAll(tmpDir)
60 if err := os.Mkdir(filepath.Join(tmpDir, "tmp"), 0700); err != nil {
61 t.Fatalf("Error creating tmp directory: %s", err)
64 targetDir := filepath.Join(tmpDir, "target")
65 ws, err := NewAtomicWriteSet(filepath.Join(tmpDir, "tmp"))
67 t.Fatalf("Error creating atomic write set: %s", err)
70 expected := []byte("barbaz")
71 if err := ws.WriteFile("foo", expected, testMode); err != nil {
72 t.Fatalf("Error writing to file: %v", err)
75 if _, err := ioutil.ReadFile(filepath.Join(targetDir, "foo")); err == nil {
76 t.Fatalf("Expected error reading file where should not exist")
79 if err := ws.Commit(targetDir); err != nil {
80 t.Fatalf("Error committing file: %s", err)
83 actual, err := ioutil.ReadFile(filepath.Join(targetDir, "foo"))
85 t.Fatalf("Error reading from file: %v", err)
88 if !bytes.Equal(actual, expected) {
89 t.Fatalf("Data mismatch, expected %q, got %q", expected, actual)
92 st, err := os.Stat(filepath.Join(targetDir, "foo"))
94 t.Fatalf("Error statting file: %v", err)
96 if expected := os.FileMode(testMode); st.Mode() != expected {
97 t.Fatalf("Mode mismatched, expected %o, got %o", expected, st.Mode())
102 func TestAtomicWriteSetCancel(t *testing.T) {
103 tmpDir, err := ioutil.TempDir("", "atomic-writerset-test")
105 t.Fatalf("Error when creating temporary directory: %s", err)
107 defer os.RemoveAll(tmpDir)
109 if err := os.Mkdir(filepath.Join(tmpDir, "tmp"), 0700); err != nil {
110 t.Fatalf("Error creating tmp directory: %s", err)
113 ws, err := NewAtomicWriteSet(filepath.Join(tmpDir, "tmp"))
115 t.Fatalf("Error creating atomic write set: %s", err)
118 expected := []byte("barbaz")
119 if err := ws.WriteFile("foo", expected, testMode); err != nil {
120 t.Fatalf("Error writing to file: %v", err)
123 if err := ws.Cancel(); err != nil {
124 t.Fatalf("Error committing file: %s", err)
127 if _, err := ioutil.ReadFile(filepath.Join(tmpDir, "target", "foo")); err == nil {
128 t.Fatalf("Expected error reading file where should not exist")
129 } else if !os.IsNotExist(err) {
130 t.Fatalf("Unexpected error reading file: %s", err)