reconnect_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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. defer sender.stop()
  49. waitForScan(sender)
  50. receiver := syncthingProcess{ // id2
  51. instance: "2",
  52. argv: []string{"-home", "h2"},
  53. port: 8082,
  54. apiKey: apiKey,
  55. }
  56. err = receiver.start()
  57. if err != nil {
  58. t.Fatal(err)
  59. }
  60. defer receiver.stop()
  61. var prevBytes int
  62. for {
  63. recv, err := receiver.dbStatus("default")
  64. if err != nil {
  65. t.Fatal(err)
  66. }
  67. if recv.InSyncBytes > 0 && recv.InSyncBytes == recv.GlobalBytes {
  68. // Receiver is done
  69. break
  70. } else if recv.InSyncBytes > prevBytes+recv.GlobalBytes/10 {
  71. // Receiver has made progress
  72. prevBytes = recv.InSyncBytes
  73. if restartReceiver {
  74. log.Printf("Stopping receiver...")
  75. _, err = receiver.stop()
  76. if err != nil {
  77. t.Fatal(err)
  78. }
  79. }
  80. if restartSender {
  81. log.Printf("Stopping sender...")
  82. _, err = sender.stop()
  83. if err != nil {
  84. t.Fatal(err)
  85. }
  86. }
  87. var wg sync.WaitGroup
  88. if restartReceiver {
  89. wg.Add(1)
  90. go func() {
  91. time.Sleep(receiverDelay)
  92. log.Printf("Starting receiver...")
  93. receiver.start()
  94. wg.Done()
  95. }()
  96. }
  97. if restartSender {
  98. wg.Add(1)
  99. go func() {
  100. time.Sleep(senderDelay)
  101. log.Printf("Starting sender...")
  102. sender.start()
  103. wg.Done()
  104. }()
  105. }
  106. wg.Wait()
  107. }
  108. time.Sleep(time.Second)
  109. }
  110. _, err = sender.stop()
  111. if err != nil {
  112. t.Fatal(err)
  113. }
  114. _, err = receiver.stop()
  115. if err != nil {
  116. t.Fatal(err)
  117. }
  118. log.Println("Comparing directories...")
  119. err = compareDirectories("s1", "s2")
  120. if err != nil {
  121. t.Fatal(err)
  122. }
  123. }