reconnect_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. "testing"
  11. "time"
  12. "github.com/syncthing/syncthing/lib/rc"
  13. )
  14. func TestReconnectReceiverDuringTransfer(t *testing.T) {
  15. testReconnectDuringTransfer(t, false, true)
  16. }
  17. func TestReconnectSenderDuringTransfer(t *testing.T) {
  18. testReconnectDuringTransfer(t, true, false)
  19. }
  20. func testReconnectDuringTransfer(t *testing.T, restartSender, restartReceiver bool) {
  21. log.Println("Cleaning...")
  22. err := removeAll("s1", "s2", "h1/index*", "h2/index*")
  23. if err != nil {
  24. t.Fatal(err)
  25. }
  26. log.Println("Generating files...")
  27. err = generateFiles("s1", 250, 20, "../LICENSE")
  28. if err != nil {
  29. t.Fatal(err)
  30. }
  31. log.Println("Starting up...")
  32. sender := startInstance(t, 1)
  33. defer func() {
  34. // We need a closure over sender, since we'll update it later to point
  35. // at another process.
  36. checkedStop(t, sender)
  37. }()
  38. receiver := startInstance(t, 2)
  39. defer func() {
  40. // We need a closure over sender, since we'll update it later to
  41. // point at another process.
  42. checkedStop(t, receiver)
  43. }()
  44. // Set rate limits
  45. cfg, err := receiver.GetConfig()
  46. if err != nil {
  47. t.Fatal(err)
  48. }
  49. cfg.Options.MaxRecvKbps = 750
  50. cfg.Options.MaxSendKbps = 750
  51. cfg.Options.LimitBandwidthInLan = true
  52. if err := receiver.PostConfig(cfg); err != nil {
  53. t.Fatal(err)
  54. }
  55. sender.ResumeAll()
  56. receiver.ResumeAll()
  57. var prevBytes int
  58. for {
  59. recv, err := receiver.Model("default")
  60. if err != nil {
  61. t.Fatal(err)
  62. }
  63. if recv.InSyncBytes > 0 && recv.InSyncBytes == recv.GlobalBytes && rc.InSync("default", receiver, sender) {
  64. // Receiver is done
  65. break
  66. } else if recv.InSyncBytes > prevBytes+recv.GlobalBytes/10 {
  67. // Receiver has made progress
  68. prevBytes = recv.InSyncBytes
  69. if restartReceiver {
  70. log.Printf("Stopping receiver...")
  71. receiver.Stop()
  72. receiver = startInstance(t, 2)
  73. receiver.ResumeAll()
  74. }
  75. if restartSender {
  76. log.Printf("Stopping sender...")
  77. sender.Stop()
  78. sender = startInstance(t, 1)
  79. sender.ResumeAll()
  80. }
  81. }
  82. time.Sleep(250 * time.Millisecond)
  83. }
  84. // Reset rate limits
  85. cfg, err = receiver.GetConfig()
  86. if err != nil {
  87. t.Fatal(err)
  88. }
  89. cfg.Options.MaxRecvKbps = 0
  90. cfg.Options.MaxSendKbps = 0
  91. cfg.Options.LimitBandwidthInLan = false
  92. if err := receiver.PostConfig(cfg); err != nil {
  93. t.Fatal(err)
  94. }
  95. checkedStop(t, sender)
  96. checkedStop(t, receiver)
  97. log.Println("Comparing directories...")
  98. err = compareDirectories("s1", "s2")
  99. if err != nil {
  100. t.Error(err)
  101. }
  102. if err := checkRemoteInSync("default", receiver, sender); err != nil {
  103. t.Error(err)
  104. }
  105. }