filetype_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  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 http://mozilla.org/MPL/2.0/.
  6. // +build integration
  7. package integration
  8. import (
  9. "log"
  10. "os"
  11. "testing"
  12. "time"
  13. "github.com/syncthing/protocol"
  14. "github.com/syncthing/syncthing/internal/config"
  15. )
  16. func TestFileTypeChange(t *testing.T) {
  17. // Use no versioning
  18. id, _ := protocol.DeviceIDFromString(id2)
  19. cfg, _ := config.Load("h2/config.xml", id)
  20. fld := cfg.Folders()["default"]
  21. fld.Versioning = config.VersioningConfiguration{}
  22. cfg.SetFolder(fld)
  23. cfg.Save()
  24. testFileTypeChange(t)
  25. }
  26. func TestFileTypeChangeSimpleVersioning(t *testing.T) {
  27. // Use simple versioning
  28. id, _ := protocol.DeviceIDFromString(id2)
  29. cfg, _ := config.Load("h2/config.xml", id)
  30. fld := cfg.Folders()["default"]
  31. fld.Versioning = config.VersioningConfiguration{
  32. Type: "simple",
  33. Params: map[string]string{"keep": "5"},
  34. }
  35. cfg.SetFolder(fld)
  36. cfg.Save()
  37. testFileTypeChange(t)
  38. }
  39. func TestFileTypeChangeStaggeredVersioning(t *testing.T) {
  40. // Use staggered versioning
  41. id, _ := protocol.DeviceIDFromString(id2)
  42. cfg, _ := config.Load("h2/config.xml", id)
  43. fld := cfg.Folders()["default"]
  44. fld.Versioning = config.VersioningConfiguration{
  45. Type: "staggered",
  46. }
  47. cfg.SetFolder(fld)
  48. cfg.Save()
  49. testFileTypeChange(t)
  50. }
  51. func testFileTypeChange(t *testing.T) {
  52. log.Println("Cleaning...")
  53. err := removeAll("s1", "s2", "h1/index*", "h2/index*")
  54. if err != nil {
  55. t.Fatal(err)
  56. }
  57. log.Println("Generating files...")
  58. err = generateFiles("s1", 100, 20, "../LICENSE")
  59. if err != nil {
  60. t.Fatal(err)
  61. }
  62. // A file that we will replace with a directory later
  63. fd, err := os.Create("s1/fileToReplace")
  64. if err != nil {
  65. t.Fatal(err)
  66. }
  67. fd.Close()
  68. // A directory that we will replace with a file later
  69. err = os.Mkdir("s1/emptyDirToReplace", 0755)
  70. if err != nil {
  71. t.Fatal(err)
  72. }
  73. // A directory with files that we will replace with a file later
  74. err = os.Mkdir("s1/dirToReplace", 0755)
  75. if err != nil {
  76. t.Fatal(err)
  77. }
  78. fd, err = os.Create("s1/dirToReplace/emptyFile")
  79. if err != nil {
  80. t.Fatal(err)
  81. }
  82. fd.Close()
  83. // Verify that the files and directories sync to the other side
  84. log.Println("Syncing...")
  85. sender := syncthingProcess{ // id1
  86. instance: "1",
  87. argv: []string{"-home", "h1"},
  88. port: 8081,
  89. apiKey: apiKey,
  90. }
  91. err = sender.start()
  92. if err != nil {
  93. t.Fatal(err)
  94. }
  95. receiver := syncthingProcess{ // id2
  96. instance: "2",
  97. argv: []string{"-home", "h2"},
  98. port: 8082,
  99. apiKey: apiKey,
  100. }
  101. err = receiver.start()
  102. if err != nil {
  103. sender.stop()
  104. t.Fatal(err)
  105. }
  106. for {
  107. comp, err := sender.peerCompletion()
  108. if err != nil {
  109. if isTimeout(err) {
  110. time.Sleep(time.Second)
  111. continue
  112. }
  113. sender.stop()
  114. receiver.stop()
  115. t.Fatal(err)
  116. }
  117. curComp := comp[id2]
  118. if curComp == 100 {
  119. sender.stop()
  120. receiver.stop()
  121. break
  122. }
  123. time.Sleep(time.Second)
  124. }
  125. _, err = sender.stop()
  126. if err != nil {
  127. t.Fatal(err)
  128. }
  129. _, err = receiver.stop()
  130. if err != nil {
  131. t.Fatal(err)
  132. }
  133. log.Println("Comparing directories...")
  134. err = compareDirectories("s1", "s2")
  135. if err != nil {
  136. t.Fatal(err)
  137. }
  138. log.Println("Making some changes...")
  139. // Replace file with directory
  140. err = os.RemoveAll("s1/fileToReplace")
  141. if err != nil {
  142. t.Fatal(err)
  143. }
  144. err = os.Mkdir("s1/fileToReplace", 0755)
  145. if err != nil {
  146. t.Fatal(err)
  147. }
  148. // Replace empty directory with file
  149. err = os.RemoveAll("s1/emptyDirToReplace")
  150. if err != nil {
  151. t.Fatal(err)
  152. }
  153. fd, err = os.Create("s1/emptyDirToReplace")
  154. if err != nil {
  155. t.Fatal(err)
  156. }
  157. fd.Close()
  158. // Clear directory and replace with file
  159. err = os.RemoveAll("s1/dirToReplace")
  160. if err != nil {
  161. t.Fatal(err)
  162. }
  163. fd, err = os.Create("s1/dirToReplace")
  164. if err != nil {
  165. t.Fatal(err)
  166. }
  167. fd.Close()
  168. // Sync these changes and recheck
  169. log.Println("Syncing...")
  170. err = sender.start()
  171. if err != nil {
  172. t.Fatal(err)
  173. }
  174. err = receiver.start()
  175. if err != nil {
  176. sender.stop()
  177. t.Fatal(err)
  178. }
  179. for {
  180. comp, err := sender.peerCompletion()
  181. if err != nil {
  182. if isTimeout(err) {
  183. time.Sleep(time.Second)
  184. continue
  185. }
  186. sender.stop()
  187. receiver.stop()
  188. t.Fatal(err)
  189. }
  190. curComp := comp[id2]
  191. if curComp == 100 {
  192. break
  193. }
  194. time.Sleep(time.Second)
  195. }
  196. _, err = sender.stop()
  197. if err != nil {
  198. t.Fatal(err)
  199. }
  200. _, err = receiver.stop()
  201. if err != nil {
  202. t.Fatal(err)
  203. }
  204. log.Println("Comparing directories...")
  205. err = compareDirectories("s1", "s2")
  206. if err != nil {
  207. t.Fatal(err)
  208. }
  209. }