reconnect_test.go 2.6 KB

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