filetype_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. //go:build integration
  7. // +build integration
  8. package integration
  9. import (
  10. "log"
  11. "os"
  12. "testing"
  13. "github.com/syncthing/syncthing/lib/config"
  14. "github.com/syncthing/syncthing/lib/events"
  15. "github.com/syncthing/syncthing/lib/protocol"
  16. "github.com/syncthing/syncthing/lib/rc"
  17. )
  18. func TestFileTypeChange(t *testing.T) {
  19. // Use no versioning
  20. id, _ := protocol.DeviceIDFromString(id2)
  21. cfg, _, _ := config.Load("h2/config.xml", id, events.NoopLogger)
  22. fld := cfg.Folders()["default"]
  23. fld.Versioning = config.VersioningConfiguration{}
  24. cfg.SetFolder(fld)
  25. os.Rename("h2/config.xml", "h2/config.xml.orig")
  26. defer os.Rename("h2/config.xml.orig", "h2/config.xml")
  27. cfg.Save()
  28. testFileTypeChange(t)
  29. }
  30. func TestFileTypeChangeSimpleVersioning(t *testing.T) {
  31. // Use simple versioning
  32. id, _ := protocol.DeviceIDFromString(id2)
  33. cfg, _, _ := config.Load("h2/config.xml", id, events.NoopLogger)
  34. fld := cfg.Folders()["default"]
  35. fld.Versioning = config.VersioningConfiguration{
  36. Type: "simple",
  37. Params: map[string]string{"keep": "5"},
  38. }
  39. cfg.SetFolder(fld)
  40. os.Rename("h2/config.xml", "h2/config.xml.orig")
  41. defer os.Rename("h2/config.xml.orig", "h2/config.xml")
  42. cfg.Save()
  43. testFileTypeChange(t)
  44. }
  45. func TestFileTypeChangeStaggeredVersioning(t *testing.T) {
  46. // Use staggered versioning
  47. id, _ := protocol.DeviceIDFromString(id2)
  48. cfg, _, _ := config.Load("h2/config.xml", id, events.NoopLogger)
  49. fld := cfg.Folders()["default"]
  50. fld.Versioning = config.VersioningConfiguration{
  51. Type: "staggered",
  52. }
  53. cfg.SetFolder(fld)
  54. os.Rename("h2/config.xml", "h2/config.xml.orig")
  55. defer os.Rename("h2/config.xml.orig", "h2/config.xml")
  56. cfg.Save()
  57. testFileTypeChange(t)
  58. }
  59. func testFileTypeChange(t *testing.T) {
  60. log.Println("Cleaning...")
  61. err := removeAll("s1", "s2", "h1/index*", "h2/index*")
  62. if err != nil {
  63. t.Fatal(err)
  64. }
  65. log.Println("Generating files...")
  66. err = generateFiles("s1", 100, 20, "../LICENSE")
  67. if err != nil {
  68. t.Fatal(err)
  69. }
  70. // A file that we will replace with a directory later
  71. if fd, err := os.Create("s1/fileToReplace"); err != nil {
  72. t.Fatal(err)
  73. } else {
  74. fd.Close()
  75. }
  76. // A directory that we will replace with a file later
  77. err = os.Mkdir("s1/emptyDirToReplace", 0755)
  78. if err != nil {
  79. t.Fatal(err)
  80. }
  81. // A directory with files that we will replace with a file later
  82. err = os.Mkdir("s1/dirToReplace", 0755)
  83. if err != nil {
  84. t.Fatal(err)
  85. }
  86. if fd, err := os.Create("s1/dirToReplace/emptyFile"); err != nil {
  87. t.Fatal(err)
  88. } else {
  89. fd.Close()
  90. }
  91. // Verify that the files and directories sync to the other side
  92. sender := startInstance(t, 1)
  93. defer checkedStop(t, sender)
  94. receiver := startInstance(t, 2)
  95. defer checkedStop(t, receiver)
  96. sender.ResumeAll()
  97. receiver.ResumeAll()
  98. log.Println("Syncing...")
  99. rc.AwaitSync("default", sender, receiver)
  100. // Delay scans for the moment
  101. if err := sender.RescanDelay("default", 86400); err != nil {
  102. t.Fatal(err)
  103. }
  104. log.Println("Comparing directories...")
  105. err = compareDirectories("s1", "s2")
  106. if err != nil {
  107. t.Fatal(err)
  108. }
  109. log.Println("Making some changes...")
  110. // Replace file with directory
  111. err = os.RemoveAll("s1/fileToReplace")
  112. if err != nil {
  113. t.Fatal(err)
  114. }
  115. err = os.Mkdir("s1/fileToReplace", 0755)
  116. if err != nil {
  117. t.Fatal(err)
  118. }
  119. // Replace empty directory with file
  120. err = os.RemoveAll("s1/emptyDirToReplace")
  121. if err != nil {
  122. t.Fatal(err)
  123. }
  124. if fd, err := os.Create("s1/emptyDirToReplace"); err != nil {
  125. t.Fatal(err)
  126. } else {
  127. fd.Close()
  128. }
  129. // Clear directory and replace with file
  130. err = os.RemoveAll("s1/dirToReplace")
  131. if err != nil {
  132. t.Fatal(err)
  133. }
  134. if fd, err := os.Create("s1/dirToReplace"); err != nil {
  135. t.Fatal(err)
  136. } else {
  137. fd.Close()
  138. }
  139. // Sync these changes and recheck
  140. log.Println("Syncing...")
  141. if err := sender.Rescan("default"); err != nil {
  142. t.Fatal(err)
  143. }
  144. rc.AwaitSync("default", sender, receiver)
  145. log.Println("Comparing directories...")
  146. err = compareDirectories("s1", "s2")
  147. if err != nil {
  148. t.Fatal(err)
  149. }
  150. }