atomic_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Copyright (C) 2015 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at https://mozilla.org/MPL/2.0/.
  6. package osutil
  7. import (
  8. "bytes"
  9. "io/ioutil"
  10. "os"
  11. "path/filepath"
  12. "testing"
  13. )
  14. func TestCreateAtomicCreate(t *testing.T) {
  15. os.RemoveAll("testdata")
  16. defer os.RemoveAll("testdata")
  17. if err := os.Mkdir("testdata", 0755); err != nil {
  18. t.Fatal(err)
  19. }
  20. w, err := CreateAtomic("testdata/file")
  21. if err != nil {
  22. t.Fatal(err)
  23. }
  24. n, err := w.Write([]byte("hello"))
  25. if err != nil {
  26. t.Fatal(err)
  27. }
  28. if n != 5 {
  29. t.Fatal("written bytes", n, "!= 5")
  30. }
  31. if _, err := ioutil.ReadFile("testdata/file"); err == nil {
  32. t.Fatal("file should not exist")
  33. }
  34. if err := w.Close(); err != nil {
  35. t.Fatal(err)
  36. }
  37. bs, err := ioutil.ReadFile("testdata/file")
  38. if err != nil {
  39. t.Fatal(err)
  40. }
  41. if !bytes.Equal(bs, []byte("hello")) {
  42. t.Error("incorrect data")
  43. }
  44. }
  45. func TestCreateAtomicReplace(t *testing.T) {
  46. testCreateAtomicReplace(t, 0666)
  47. }
  48. func TestCreateAtomicReplaceReadOnly(t *testing.T) {
  49. testCreateAtomicReplace(t, 0444) // windows compatible read-only bits
  50. }
  51. func testCreateAtomicReplace(t *testing.T, oldPerms os.FileMode) {
  52. t.Helper()
  53. testdir, err := ioutil.TempDir("", "syncthing")
  54. if err != nil {
  55. t.Fatal(err)
  56. }
  57. testfile := filepath.Join(testdir, "testfile")
  58. os.RemoveAll(testdir)
  59. defer os.RemoveAll(testdir)
  60. if err := os.Mkdir(testdir, 0755); err != nil {
  61. t.Fatal(err)
  62. }
  63. if err := ioutil.WriteFile(testfile, []byte("some old data"), oldPerms); err != nil {
  64. t.Fatal(err)
  65. }
  66. // Go < 1.14 has a bug in WriteFile where it does not use the requested
  67. // permissions on Windows. Chmod to make sure.
  68. if err := os.Chmod(testfile, oldPerms); err != nil {
  69. t.Fatal(err)
  70. }
  71. // Trust, but verify.
  72. if info, err := os.Stat(testfile); err != nil {
  73. t.Fatal(err)
  74. } else if info.Mode() != oldPerms {
  75. t.Fatalf("Wrong perms 0%o", info.Mode())
  76. }
  77. w, err := CreateAtomic(testfile)
  78. if err != nil {
  79. t.Fatal(err)
  80. }
  81. if _, err := w.Write([]byte("hello")); err != nil {
  82. t.Fatal(err)
  83. }
  84. if err := w.Close(); err != nil {
  85. t.Fatal(err)
  86. }
  87. bs, err := ioutil.ReadFile(testfile)
  88. if err != nil {
  89. t.Fatal(err)
  90. }
  91. if !bytes.Equal(bs, []byte("hello")) {
  92. t.Error("incorrect data")
  93. }
  94. }