fswriters_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package ioutils
  2. import (
  3. "bytes"
  4. "io/ioutil"
  5. "os"
  6. "path/filepath"
  7. "runtime"
  8. "testing"
  9. )
  10. var (
  11. testMode os.FileMode = 0640
  12. )
  13. func init() {
  14. // Windows does not support full Linux file mode
  15. if runtime.GOOS == "windows" {
  16. testMode = 0666
  17. }
  18. }
  19. func TestAtomicWriteToFile(t *testing.T) {
  20. tmpDir, err := ioutil.TempDir("", "atomic-writers-test")
  21. if err != nil {
  22. t.Fatalf("Error when creating temporary directory: %s", err)
  23. }
  24. defer os.RemoveAll(tmpDir)
  25. expected := []byte("barbaz")
  26. if err := AtomicWriteFile(filepath.Join(tmpDir, "foo"), expected, testMode); err != nil {
  27. t.Fatalf("Error writing to file: %v", err)
  28. }
  29. actual, err := ioutil.ReadFile(filepath.Join(tmpDir, "foo"))
  30. if err != nil {
  31. t.Fatalf("Error reading from file: %v", err)
  32. }
  33. if !bytes.Equal(actual, expected) {
  34. t.Fatalf("Data mismatch, expected %q, got %q", expected, actual)
  35. }
  36. st, err := os.Stat(filepath.Join(tmpDir, "foo"))
  37. if err != nil {
  38. t.Fatalf("Error statting file: %v", err)
  39. }
  40. if expected := os.FileMode(testMode); st.Mode() != expected {
  41. t.Fatalf("Mode mismatched, expected %o, got %o", expected, st.Mode())
  42. }
  43. }
  44. func TestAtomicWriteSetCommit(t *testing.T) {
  45. tmpDir, err := ioutil.TempDir("", "atomic-writerset-test")
  46. if err != nil {
  47. t.Fatalf("Error when creating temporary directory: %s", err)
  48. }
  49. defer os.RemoveAll(tmpDir)
  50. if err := os.Mkdir(filepath.Join(tmpDir, "tmp"), 0700); err != nil {
  51. t.Fatalf("Error creating tmp directory: %s", err)
  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. expected := []byte("barbaz")
  59. if err := ws.WriteFile("foo", expected, testMode); err != nil {
  60. t.Fatalf("Error writing to file: %v", err)
  61. }
  62. if _, err := ioutil.ReadFile(filepath.Join(targetDir, "foo")); err == nil {
  63. t.Fatalf("Expected error reading file where should not exist")
  64. }
  65. if err := ws.Commit(targetDir); err != nil {
  66. t.Fatalf("Error committing file: %s", err)
  67. }
  68. actual, err := ioutil.ReadFile(filepath.Join(targetDir, "foo"))
  69. if err != nil {
  70. t.Fatalf("Error reading from file: %v", err)
  71. }
  72. if !bytes.Equal(actual, expected) {
  73. t.Fatalf("Data mismatch, expected %q, got %q", expected, actual)
  74. }
  75. st, err := os.Stat(filepath.Join(targetDir, "foo"))
  76. if err != nil {
  77. t.Fatalf("Error statting file: %v", err)
  78. }
  79. if expected := os.FileMode(testMode); st.Mode() != expected {
  80. t.Fatalf("Mode mismatched, expected %o, got %o", expected, st.Mode())
  81. }
  82. }
  83. func TestAtomicWriteSetCancel(t *testing.T) {
  84. tmpDir, err := ioutil.TempDir("", "atomic-writerset-test")
  85. if err != nil {
  86. t.Fatalf("Error when creating temporary directory: %s", err)
  87. }
  88. defer os.RemoveAll(tmpDir)
  89. if err := os.Mkdir(filepath.Join(tmpDir, "tmp"), 0700); err != nil {
  90. t.Fatalf("Error creating tmp directory: %s", err)
  91. }
  92. ws, err := NewAtomicWriteSet(filepath.Join(tmpDir, "tmp"))
  93. if err != nil {
  94. t.Fatalf("Error creating atomic write set: %s", err)
  95. }
  96. expected := []byte("barbaz")
  97. if err := ws.WriteFile("foo", expected, testMode); err != nil {
  98. t.Fatalf("Error writing to file: %v", err)
  99. }
  100. if err := ws.Cancel(); err != nil {
  101. t.Fatalf("Error committing file: %s", err)
  102. }
  103. if _, err := ioutil.ReadFile(filepath.Join(tmpDir, "target", "foo")); err == nil {
  104. t.Fatalf("Expected error reading file where should not exist")
  105. } else if !os.IsNotExist(err) {
  106. t.Fatalf("Unexpected error reading file: %s", err)
  107. }
  108. }