filetype_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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. // +build integration
  7. package integration
  8. import (
  9. "log"
  10. "os"
  11. "testing"
  12. "github.com/syncthing/syncthing/lib/config"
  13. "github.com/syncthing/syncthing/lib/protocol"
  14. "github.com/syncthing/syncthing/lib/rc"
  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. if fd, err := os.Create("s1/fileToReplace"); err != nil {
  64. t.Fatal(err)
  65. } else {
  66. fd.Close()
  67. }
  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. if fd, err := os.Create("s1/dirToReplace/emptyFile"); err != nil {
  79. t.Fatal(err)
  80. } else {
  81. fd.Close()
  82. }
  83. // Verify that the files and directories sync to the other side
  84. sender := startInstance(t, 1)
  85. defer checkedStop(t, sender)
  86. receiver := startInstance(t, 2)
  87. defer checkedStop(t, receiver)
  88. sender.ResumeAll()
  89. receiver.ResumeAll()
  90. log.Println("Syncing...")
  91. rc.AwaitSync("default", sender, receiver)
  92. // Delay scans for the moment
  93. if err := sender.RescanDelay("default", 86400); err != nil {
  94. t.Fatal(err)
  95. }
  96. log.Println("Comparing directories...")
  97. err = compareDirectories("s1", "s2")
  98. if err != nil {
  99. t.Fatal(err)
  100. }
  101. log.Println("Making some changes...")
  102. // Replace file with directory
  103. err = os.RemoveAll("s1/fileToReplace")
  104. if err != nil {
  105. t.Fatal(err)
  106. }
  107. err = os.Mkdir("s1/fileToReplace", 0755)
  108. if err != nil {
  109. t.Fatal(err)
  110. }
  111. // Replace empty directory with file
  112. err = os.RemoveAll("s1/emptyDirToReplace")
  113. if err != nil {
  114. t.Fatal(err)
  115. }
  116. if fd, err := os.Create("s1/emptyDirToReplace"); err != nil {
  117. t.Fatal(err)
  118. } else {
  119. fd.Close()
  120. }
  121. // Clear directory and replace with file
  122. err = os.RemoveAll("s1/dirToReplace")
  123. if err != nil {
  124. t.Fatal(err)
  125. }
  126. if fd, err := os.Create("s1/dirToReplace"); err != nil {
  127. t.Fatal(err)
  128. } else {
  129. fd.Close()
  130. }
  131. // Sync these changes and recheck
  132. log.Println("Syncing...")
  133. if err := sender.Rescan("default"); err != nil {
  134. t.Fatal(err)
  135. }
  136. rc.AwaitSync("default", sender, receiver)
  137. log.Println("Comparing directories...")
  138. err = compareDirectories("s1", "s2")
  139. if err != nil {
  140. t.Fatal(err)
  141. }
  142. }