override_test.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. // Copyright (C) 2015 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. "io/ioutil"
  10. "log"
  11. "os"
  12. "strings"
  13. "testing"
  14. "time"
  15. "github.com/syncthing/syncthing/lib/config"
  16. "github.com/syncthing/syncthing/lib/events"
  17. "github.com/syncthing/syncthing/lib/protocol"
  18. "github.com/syncthing/syncthing/lib/rc"
  19. )
  20. func TestOverride(t *testing.T) {
  21. // Enable "send-only" on s1/default
  22. id, _ := protocol.DeviceIDFromString(id1)
  23. cfg, _, _ := config.Load("h1/config.xml", id, events.NoopLogger)
  24. fld := cfg.Folders()["default"]
  25. fld.Type = config.FolderTypeSendOnly
  26. cfg.SetFolder(fld)
  27. os.Rename("h1/config.xml", "h1/config.xml.orig")
  28. defer os.Rename("h1/config.xml.orig", "h1/config.xml")
  29. cfg.Save()
  30. log.Println("Cleaning...")
  31. err := removeAll("s1", "s2", "h1/index*", "h2/index*")
  32. if err != nil {
  33. t.Fatal(err)
  34. }
  35. log.Println("Generating files...")
  36. err = generateFiles("s1", 100, 20, "../LICENSE")
  37. if err != nil {
  38. t.Fatal(err)
  39. }
  40. fd, err := os.Create("s1/testfile.txt")
  41. if err != nil {
  42. t.Fatal(err)
  43. }
  44. _, err = fd.WriteString("hello\n")
  45. if err != nil {
  46. t.Fatal(err)
  47. }
  48. err = fd.Close()
  49. if err != nil {
  50. t.Fatal(err)
  51. }
  52. expected, err := directoryContents("s1")
  53. if err != nil {
  54. t.Fatal(err)
  55. }
  56. sendOnly := startInstance(t, 1)
  57. defer checkedStop(t, sendOnly)
  58. sendRecv := startInstance(t, 2)
  59. defer checkedStop(t, sendRecv)
  60. sendOnly.ResumeAll()
  61. sendRecv.ResumeAll()
  62. log.Println("Syncing...")
  63. rc.AwaitSync("default", sendOnly, sendRecv)
  64. log.Println("Verifying...")
  65. actual, err := directoryContents("s2")
  66. if err != nil {
  67. t.Fatal(err)
  68. }
  69. err = compareDirectoryContents(actual, expected)
  70. if err != nil {
  71. t.Fatal(err)
  72. }
  73. log.Println("Changing file on sendRecv side...")
  74. fd, err = os.OpenFile("s2/testfile.txt", os.O_WRONLY|os.O_APPEND, 0644)
  75. if err != nil {
  76. t.Fatal(err)
  77. }
  78. _, err = fd.WriteString("text added to s2\n")
  79. if err != nil {
  80. t.Fatal(err)
  81. }
  82. err = fd.Close()
  83. if err != nil {
  84. t.Fatal(err)
  85. }
  86. if err := sendRecv.Rescan("default"); err != nil {
  87. t.Fatal(err)
  88. }
  89. log.Println("Waiting for index to send...")
  90. time.Sleep(10 * time.Second)
  91. log.Println("Hitting Override on sendOnly...")
  92. if _, err := sendOnly.Post("/rest/db/override?folder=default", nil); err != nil {
  93. t.Fatal(err)
  94. }
  95. log.Println("Syncing...")
  96. rc.AwaitSync("default", sendOnly, sendRecv)
  97. // Verify that the override worked
  98. fd, err = os.Open("s1/testfile.txt")
  99. if err != nil {
  100. t.Fatal(err)
  101. }
  102. bs, err := ioutil.ReadAll(fd)
  103. if err != nil {
  104. t.Fatal(err)
  105. }
  106. fd.Close()
  107. if strings.Contains(string(bs), "added to s2") {
  108. t.Error("Change should not have been synced to sendOnly")
  109. }
  110. fd, err = os.Open("s2/testfile.txt")
  111. if err != nil {
  112. t.Fatal(err)
  113. }
  114. bs, err = ioutil.ReadAll(fd)
  115. if err != nil {
  116. t.Fatal(err)
  117. }
  118. fd.Close()
  119. if strings.Contains(string(bs), "added to s2") {
  120. t.Error("Change should have been overridden on sendRecv")
  121. }
  122. }
  123. /* This doesn't currently work with detection completion, as we don't actually
  124. get to completion when in sendOnly/sendRecv mode. Needs fixing.
  125. func TestOverrideIgnores(t *testing.T) {
  126. // Enable "sendOnly" on s1/default
  127. id, _ := protocol.DeviceIDFromString(id1)
  128. cfg, _, _ := config.Load("h1/config.xml", id, events.NoopLogger)
  129. fld := cfg.Folders()["default"]
  130. fld.ReadOnly = true
  131. cfg.SetFolder(fld)
  132. os.Rename("h1/config.xml", "h1/config.xml.orig")
  133. defer os.Rename("h1/config.xml.orig", "h1/config.xml")
  134. cfg.Save()
  135. log.Println("Cleaning...")
  136. err := removeAll("s1", "s2", "h1/index*", "h2/index*")
  137. if err != nil {
  138. t.Fatal(err)
  139. }
  140. log.Println("Generating files...")
  141. err = generateFiles("s1", 10, 2, "../LICENSE")
  142. if err != nil {
  143. t.Fatal(err)
  144. }
  145. fd, err := os.Create("s1/testfile.txt")
  146. if err != nil {
  147. t.Fatal(err)
  148. }
  149. _, err = fd.WriteString("original text\n")
  150. if err != nil {
  151. t.Fatal(err)
  152. }
  153. err = fd.Close()
  154. if err != nil {
  155. t.Fatal(err)
  156. }
  157. expected, err := directoryContents("s1")
  158. if err != nil {
  159. t.Fatal(err)
  160. }
  161. log.Println("Starting sendOnly...")
  162. sendOnly := syncthingProcess{ // id1
  163. instance: "1",
  164. argv: []string{"-home", "h1"},
  165. port: 8081,
  166. apiKey: apiKey,
  167. }
  168. err = sendOnly.start()
  169. if err != nil {
  170. t.Fatal(err)
  171. }
  172. defer sendOnly.stop()
  173. log.Println("Starting sendRecv...")
  174. sendRecv := syncthingProcess{ // id2
  175. instance: "2",
  176. argv: []string{"-home", "h2"},
  177. port: 8082,
  178. apiKey: apiKey,
  179. }
  180. err = sendRecv.start()
  181. if err != nil {
  182. sendOnly.stop()
  183. t.Fatal(err)
  184. }
  185. defer sendRecv.stop()
  186. log.Println("Syncing...")
  187. err = awaitCompletion("default", sendOnly, sendRecv)
  188. if err != nil {
  189. t.Fatal(err)
  190. }
  191. log.Println("Verifying...")
  192. actual, err := directoryContents("s2")
  193. if err != nil {
  194. t.Fatal(err)
  195. }
  196. err = compareDirectoryContents(actual, expected)
  197. if err != nil {
  198. t.Fatal(err)
  199. }
  200. log.Println("Ignoring testfile.txt on sendOnly...")
  201. fd, err = os.Create("s1/.stignore")
  202. if err != nil {
  203. t.Fatal(err)
  204. }
  205. _, err = fd.WriteString("testfile.txt\n")
  206. if err != nil {
  207. t.Fatal(err)
  208. }
  209. err = fd.Close()
  210. if err != nil {
  211. t.Fatal(err)
  212. }
  213. log.Println("Modify testfile.txt on sendOnly...")
  214. fd, err = os.Create("s1/testfile.txt")
  215. if err != nil {
  216. t.Fatal(err)
  217. }
  218. _, err = fd.WriteString("updated on sendOnly but ignored\n")
  219. if err != nil {
  220. t.Fatal(err)
  221. }
  222. err = fd.Close()
  223. if err != nil {
  224. t.Fatal(err)
  225. }
  226. fd, err = os.Create("s1/testfile2.txt")
  227. if err != nil {
  228. t.Fatal(err)
  229. }
  230. _, err = fd.WriteString("sync me\n")
  231. if err != nil {
  232. t.Fatal(err)
  233. }
  234. err = fd.Close()
  235. if err != nil {
  236. t.Fatal(err)
  237. }
  238. err = sendOnly.rescan("default")
  239. log.Println("Waiting for sync...")
  240. time.Sleep(10 * time.Second)
  241. // Verify that sync worked
  242. fd, err = os.Open("s2/testfile.txt")
  243. if err != nil {
  244. t.Fatal(err)
  245. }
  246. bs, err := ioutil.ReadAll(fd)
  247. if err != nil {
  248. t.Fatal(err)
  249. }
  250. fd.Close()
  251. if !strings.Contains(string(bs), "original text") {
  252. t.Error("Changes should not have been synced to sendRecv")
  253. }
  254. fd, err = os.Open("s2/testfile2.txt")
  255. if err != nil {
  256. t.Fatal(err)
  257. }
  258. bs, err = ioutil.ReadAll(fd)
  259. if err != nil {
  260. t.Fatal(err)
  261. }
  262. fd.Close()
  263. if !strings.Contains(string(bs), "sync me") {
  264. t.Error("Changes should have been synced to sendRecv")
  265. }
  266. log.Println("Removing file on sendRecv side...")
  267. os.Remove("s2/testfile.txt")
  268. err = sendRecv.rescan("default")
  269. if err != nil {
  270. t.Fatal(err)
  271. }
  272. log.Println("Waiting for sync...")
  273. time.Sleep(10 * time.Second)
  274. // Verify that nothing changed
  275. fd, err = os.Open("s1/testfile.txt")
  276. if err != nil {
  277. t.Fatal(err)
  278. }
  279. bs, err = ioutil.ReadAll(fd)
  280. if err != nil {
  281. t.Fatal(err)
  282. }
  283. fd.Close()
  284. if !strings.Contains(string(bs), "updated on sendOnly but ignored") {
  285. t.Error("Changes should not have been synced to sendOnly")
  286. }
  287. fd, err = os.Open("s2/testfile.txt")
  288. if err == nil {
  289. t.Error("File should not exist on the sendRecv")
  290. }
  291. log.Println("Creating file on sendRecv...")
  292. fd, err = os.Create("s2/testfile3.txt")
  293. if err != nil {
  294. t.Fatal(err)
  295. }
  296. _, err = fd.WriteString("created on sendRecv, should be removed on override\n")
  297. if err != nil {
  298. t.Fatal(err)
  299. }
  300. err = fd.Close()
  301. if err != nil {
  302. t.Fatal(err)
  303. }
  304. log.Println("Hitting Override on sendOnly...")
  305. resp, err := sendOnly.post("/rest/db/override?folder=default", nil)
  306. if err != nil {
  307. t.Fatal(err)
  308. }
  309. if resp.StatusCode != 200 {
  310. t.Fatal(resp.Status)
  311. }
  312. log.Println("Waiting for sync...")
  313. time.Sleep(10 * time.Second)
  314. fd, err = os.Open("s2/testfile.txt")
  315. if err == nil {
  316. t.Error("File should not exist on the sendRecv")
  317. }
  318. fd, err = os.Open("s2/testfile2.txt")
  319. if err != nil {
  320. t.Fatal(err)
  321. }
  322. bs, err = ioutil.ReadAll(fd)
  323. if err != nil {
  324. t.Fatal(err)
  325. }
  326. fd.Close()
  327. if !strings.Contains(string(bs), "sync me") {
  328. t.Error("Changes should have been synced to sendRecv")
  329. }
  330. fd, err = os.Open("s2/testfile3.txt")
  331. if err != nil {
  332. t.Error("File should still exist on the sendRecv")
  333. }
  334. fd.Close()
  335. log.Println("Hitting Override on sendOnly (again)...")
  336. resp, err = sendOnly.post("/rest/db/override?folder=default", nil)
  337. if err != nil {
  338. t.Fatal(err)
  339. }
  340. if resp.StatusCode != 200 {
  341. t.Fatal(resp.Status)
  342. }
  343. log.Println("Waiting for sync...")
  344. time.Sleep(10 * time.Second)
  345. fd, err = os.Open("s2/testfile.txt")
  346. if err == nil {
  347. t.Error("File should not exist on the sendRecv")
  348. }
  349. fd, err = os.Open("s2/testfile2.txt")
  350. if err != nil {
  351. t.Fatal(err)
  352. }
  353. bs, err = ioutil.ReadAll(fd)
  354. if err != nil {
  355. t.Fatal(err)
  356. }
  357. fd.Close()
  358. if !strings.Contains(string(bs), "sync me") {
  359. t.Error("Changes should have been synced to sendRecv")
  360. }
  361. fd, err = os.Open("s2/testfile3.txt")
  362. if err != nil {
  363. t.Error("File should still exist on the sendRecv")
  364. }
  365. fd.Close()
  366. }
  367. */