osutil_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. // Copyright (C) 2014 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_test
  7. import (
  8. "os"
  9. "runtime"
  10. "testing"
  11. "github.com/syncthing/syncthing/lib/fs"
  12. "github.com/syncthing/syncthing/lib/osutil"
  13. )
  14. func TestInWriteableDir(t *testing.T) {
  15. err := os.RemoveAll("testdata")
  16. if err != nil {
  17. t.Fatal(err)
  18. }
  19. defer os.RemoveAll("testdata")
  20. fs := fs.NewFilesystem(fs.FilesystemTypeBasic, ".")
  21. os.Mkdir("testdata", 0700)
  22. os.Mkdir("testdata/rw", 0700)
  23. os.Mkdir("testdata/ro", 0500)
  24. create := func(name string) error {
  25. fd, err := os.Create(name)
  26. if err != nil {
  27. return err
  28. }
  29. fd.Close()
  30. return nil
  31. }
  32. // These should succeed
  33. err = osutil.InWritableDir(create, fs, "testdata/file")
  34. if err != nil {
  35. t.Error("testdata/file:", err)
  36. }
  37. err = osutil.InWritableDir(create, fs, "testdata/rw/foo")
  38. if err != nil {
  39. t.Error("testdata/rw/foo:", err)
  40. }
  41. err = osutil.InWritableDir(os.Remove, fs, "testdata/rw/foo")
  42. if err != nil {
  43. t.Error("testdata/rw/foo:", err)
  44. }
  45. err = osutil.InWritableDir(create, fs, "testdata/ro/foo")
  46. if err != nil {
  47. t.Error("testdata/ro/foo:", err)
  48. }
  49. err = osutil.InWritableDir(os.Remove, fs, "testdata/ro/foo")
  50. if err != nil {
  51. t.Error("testdata/ro/foo:", err)
  52. }
  53. // These should not
  54. err = osutil.InWritableDir(create, fs, "testdata/nonexistent/foo")
  55. if err == nil {
  56. t.Error("testdata/nonexistent/foo returned nil error")
  57. }
  58. err = osutil.InWritableDir(create, fs, "testdata/file/foo")
  59. if err == nil {
  60. t.Error("testdata/file/foo returned nil error")
  61. }
  62. }
  63. func TestInWritableDirWindowsRemove(t *testing.T) {
  64. // os.Remove should remove read only things on windows
  65. if runtime.GOOS != "windows" {
  66. t.Skipf("Tests not required")
  67. return
  68. }
  69. err := os.RemoveAll("testdata")
  70. if err != nil {
  71. t.Fatal(err)
  72. }
  73. defer os.Chmod("testdata/windows/ro/readonlynew", 0700)
  74. defer os.RemoveAll("testdata")
  75. create := func(name string) error {
  76. fd, err := os.Create(name)
  77. if err != nil {
  78. return err
  79. }
  80. fd.Close()
  81. return nil
  82. }
  83. os.Mkdir("testdata", 0700)
  84. os.Mkdir("testdata/windows", 0500)
  85. os.Mkdir("testdata/windows/ro", 0500)
  86. create("testdata/windows/ro/readonly")
  87. os.Chmod("testdata/windows/ro/readonly", 0500)
  88. fs := fs.NewFilesystem(fs.FilesystemTypeBasic, ".")
  89. for _, path := range []string{"testdata/windows/ro/readonly", "testdata/windows/ro", "testdata/windows"} {
  90. err := osutil.InWritableDir(os.Remove, fs, path)
  91. if err != nil {
  92. t.Errorf("Unexpected error %s: %s", path, err)
  93. }
  94. }
  95. }
  96. func TestInWritableDirWindowsRemoveAll(t *testing.T) {
  97. // os.RemoveAll should remove read only things on windows
  98. if runtime.GOOS != "windows" {
  99. t.Skipf("Tests not required")
  100. return
  101. }
  102. err := os.RemoveAll("testdata")
  103. if err != nil {
  104. t.Fatal(err)
  105. }
  106. defer os.Chmod("testdata/windows/ro/readonlynew", 0700)
  107. defer os.RemoveAll("testdata")
  108. create := func(name string) error {
  109. fd, err := os.Create(name)
  110. if err != nil {
  111. return err
  112. }
  113. fd.Close()
  114. return nil
  115. }
  116. os.Mkdir("testdata", 0700)
  117. os.Mkdir("testdata/windows", 0500)
  118. os.Mkdir("testdata/windows/ro", 0500)
  119. create("testdata/windows/ro/readonly")
  120. os.Chmod("testdata/windows/ro/readonly", 0500)
  121. if err := os.RemoveAll("testdata/windows"); err != nil {
  122. t.Errorf("Unexpected error: %s", err)
  123. }
  124. }
  125. func TestInWritableDirWindowsRename(t *testing.T) {
  126. if runtime.GOOS != "windows" {
  127. t.Skipf("Tests not required")
  128. return
  129. }
  130. err := os.RemoveAll("testdata")
  131. if err != nil {
  132. t.Fatal(err)
  133. }
  134. defer os.Chmod("testdata/windows/ro/readonlynew", 0700)
  135. defer os.RemoveAll("testdata")
  136. create := func(name string) error {
  137. fd, err := os.Create(name)
  138. if err != nil {
  139. return err
  140. }
  141. fd.Close()
  142. return nil
  143. }
  144. os.Mkdir("testdata", 0700)
  145. os.Mkdir("testdata/windows", 0500)
  146. os.Mkdir("testdata/windows/ro", 0500)
  147. create("testdata/windows/ro/readonly")
  148. os.Chmod("testdata/windows/ro/readonly", 0500)
  149. fs := fs.NewFilesystem(fs.FilesystemTypeBasic, ".")
  150. for _, path := range []string{"testdata/windows/ro/readonly", "testdata/windows/ro", "testdata/windows"} {
  151. err := os.Rename(path, path+"new")
  152. if err == nil {
  153. t.Skipf("seem like this test doesn't work here")
  154. return
  155. }
  156. }
  157. rename := func(path string) error {
  158. return osutil.Rename(fs, path, path+"new")
  159. }
  160. for _, path := range []string{"testdata/windows/ro/readonly", "testdata/windows/ro", "testdata/windows"} {
  161. err := osutil.InWritableDir(rename, fs, path)
  162. if err != nil {
  163. t.Errorf("Unexpected error %s: %s", path, err)
  164. }
  165. _, err = os.Stat(path + "new")
  166. if err != nil {
  167. t.Errorf("Unexpected error %s: %s", path, err)
  168. }
  169. }
  170. }