reconnect_test.go 2.8 KB

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