filetype_test.go 4.1 KB

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