reconnect_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. "sync"
  11. "testing"
  12. "time"
  13. )
  14. func TestRestartReceiverDuringTransfer(t *testing.T) {
  15. testRestartDuringTransfer(t, false, true, 0, 0)
  16. }
  17. func TestRestartSenderDuringTransfer(t *testing.T) {
  18. testRestartDuringTransfer(t, true, false, 0, 0)
  19. }
  20. func TestRestartSenderAndReceiverDuringTransfer(t *testing.T) {
  21. // Give the receiver some time to rot with needed files but
  22. // without any peer. This triggers
  23. // https://github.com/syncthing/syncthing/issues/463
  24. testRestartDuringTransfer(t, true, true, 10*time.Second, 0)
  25. }
  26. func testRestartDuringTransfer(t *testing.T, restartSender, restartReceiver bool, senderDelay, receiverDelay time.Duration) {
  27. log.Println("Cleaning...")
  28. err := removeAll("s1", "s2", "h1/index*", "h2/index*")
  29. if err != nil {
  30. t.Fatal(err)
  31. }
  32. log.Println("Generating files...")
  33. err = generateFiles("s1", 250, 20, "../LICENSE")
  34. if err != nil {
  35. t.Fatal(err)
  36. }
  37. log.Println("Starting up...")
  38. sender := startInstance(t, 1)
  39. defer func() {
  40. // We need a closure over sender, since we'll update it later to point
  41. // at another process.
  42. checkedStop(t, sender)
  43. }()
  44. receiver := startInstance(t, 2)
  45. defer func() {
  46. // We need a receiver over sender, since we'll update it later to
  47. // point at another process.
  48. checkedStop(t, receiver)
  49. }()
  50. var prevBytes int
  51. for {
  52. recv, err := receiver.Model("default")
  53. if err != nil {
  54. t.Fatal(err)
  55. }
  56. if recv.InSyncBytes > 0 && recv.InSyncBytes == recv.GlobalBytes {
  57. // Receiver is done
  58. break
  59. } else if recv.InSyncBytes > prevBytes+recv.GlobalBytes/10 {
  60. // Receiver has made progress
  61. prevBytes = recv.InSyncBytes
  62. if restartReceiver {
  63. log.Printf("Stopping receiver...")
  64. checkedStop(t, receiver)
  65. }
  66. if restartSender {
  67. log.Printf("Stopping sender...")
  68. checkedStop(t, sender)
  69. }
  70. var wg sync.WaitGroup
  71. if restartReceiver {
  72. wg.Add(1)
  73. go func() {
  74. time.Sleep(receiverDelay)
  75. receiver = startInstance(t, 2)
  76. wg.Done()
  77. }()
  78. }
  79. if restartSender {
  80. wg.Add(1)
  81. go func() {
  82. time.Sleep(senderDelay)
  83. sender = startInstance(t, 1)
  84. wg.Done()
  85. }()
  86. }
  87. wg.Wait()
  88. }
  89. time.Sleep(time.Second)
  90. }
  91. checkedStop(t, sender)
  92. checkedStop(t, receiver)
  93. log.Println("Comparing directories...")
  94. err = compareDirectories("s1", "s2")
  95. if err != nil {
  96. t.Fatal(err)
  97. }
  98. }