fswriters_test.go 3.0 KB

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