reconnect_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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 := syncthingProcess{ // id1
  39. instance: "1",
  40. argv: []string{"-home", "h1"},
  41. port: 8081,
  42. apiKey: apiKey,
  43. }
  44. err = sender.start()
  45. if err != nil {
  46. t.Fatal(err)
  47. }
  48. receiver := syncthingProcess{ // id2
  49. instance: "2",
  50. argv: []string{"-home", "h2"},
  51. port: 8082,
  52. apiKey: apiKey,
  53. }
  54. err = receiver.start()
  55. if err != nil {
  56. _ = sender.stop()
  57. t.Fatal(err)
  58. }
  59. var prevComp int
  60. for {
  61. comp, err := sender.peerCompletion()
  62. if err != nil {
  63. if isTimeout(err) {
  64. time.Sleep(250 * time.Millisecond)
  65. continue
  66. }
  67. _ = sender.stop()
  68. _ = receiver.stop()
  69. t.Fatal(err)
  70. }
  71. curComp := comp[id2]
  72. if curComp == 100 {
  73. err = sender.stop()
  74. if err != nil {
  75. t.Fatal(err)
  76. }
  77. err = receiver.stop()
  78. if err != nil {
  79. t.Fatal(err)
  80. }
  81. break
  82. }
  83. if curComp > prevComp {
  84. if restartReceiver {
  85. log.Printf("Stopping receiver...")
  86. err = receiver.stop()
  87. if err != nil {
  88. t.Fatal(err)
  89. }
  90. }
  91. if restartSender {
  92. log.Printf("Stopping sender...")
  93. err = sender.stop()
  94. if err != nil {
  95. t.Fatal(err)
  96. }
  97. }
  98. var wg sync.WaitGroup
  99. if restartReceiver {
  100. wg.Add(1)
  101. go func() {
  102. time.Sleep(receiverDelay)
  103. log.Printf("Starting receiver...")
  104. receiver.start()
  105. wg.Done()
  106. }()
  107. }
  108. if restartSender {
  109. wg.Add(1)
  110. go func() {
  111. time.Sleep(senderDelay)
  112. log.Printf("Starting sender...")
  113. sender.start()
  114. wg.Done()
  115. }()
  116. }
  117. wg.Wait()
  118. prevComp = curComp
  119. }
  120. time.Sleep(time.Second)
  121. }
  122. err = sender.stop()
  123. if err != nil {
  124. t.Fatal(err)
  125. }
  126. err = receiver.stop()
  127. if err != nil {
  128. t.Fatal(err)
  129. }
  130. log.Println("Comparing directories...")
  131. err = compareDirectories("s1", "s2")
  132. if err != nil {
  133. t.Fatal(err)
  134. }
  135. }