utils_test.go 4.4 KB

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