filetype_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. "github.com/syncthing/protocol"
  13. "github.com/syncthing/syncthing/internal/config"
  14. "github.com/syncthing/syncthing/internal/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. log.Println("Syncing...")
  89. rc.AwaitSync("default", sender, receiver)
  90. // Delay scans for the moment
  91. if err := sender.RescanDelay("default", 86400); err != nil {
  92. t.Fatal(err)
  93. }
  94. log.Println("Comparing directories...")
  95. err = compareDirectories("s1", "s2")
  96. if err != nil {
  97. t.Fatal(err)
  98. }
  99. log.Println("Making some changes...")
  100. // Replace file with directory
  101. err = os.RemoveAll("s1/fileToReplace")
  102. if err != nil {
  103. t.Fatal(err)
  104. }
  105. err = os.Mkdir("s1/fileToReplace", 0755)
  106. if err != nil {
  107. t.Fatal(err)
  108. }
  109. // Replace empty directory with file
  110. err = os.RemoveAll("s1/emptyDirToReplace")
  111. if err != nil {
  112. t.Fatal(err)
  113. }
  114. if fd, err := os.Create("s1/emptyDirToReplace"); err != nil {
  115. t.Fatal(err)
  116. } else {
  117. fd.Close()
  118. }
  119. // Clear directory and replace with file
  120. err = os.RemoveAll("s1/dirToReplace")
  121. if err != nil {
  122. t.Fatal(err)
  123. }
  124. if fd, err := os.Create("s1/dirToReplace"); err != nil {
  125. t.Fatal(err)
  126. } else {
  127. fd.Close()
  128. }
  129. // Sync these changes and recheck
  130. log.Println("Syncing...")
  131. if err := sender.Rescan("default"); err != nil {
  132. t.Fatal(err)
  133. }
  134. rc.AwaitSync("default", sender, receiver)
  135. log.Println("Comparing directories...")
  136. err = compareDirectories("s1", "s2")
  137. if err != nil {
  138. t.Fatal(err)
  139. }
  140. }