limiter_test.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. // Copyright (C) 2017 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. package connections
  7. import (
  8. "github.com/syncthing/syncthing/lib/config"
  9. "github.com/syncthing/syncthing/lib/events"
  10. "github.com/syncthing/syncthing/lib/protocol"
  11. "golang.org/x/time/rate"
  12. "math/rand"
  13. "testing"
  14. )
  15. var device1, device2, device3, device4 protocol.DeviceID
  16. var dev1Conf, dev2Conf, dev3Conf, dev4Conf config.DeviceConfiguration
  17. func init() {
  18. device1, _ = protocol.DeviceIDFromString("AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ")
  19. device2, _ = protocol.DeviceIDFromString("GYRZZQB-IRNPV4Z-T7TC52W-EQYJ3TT-FDQW6MW-DFLMU42-SSSU6EM-FBK2VAY")
  20. device3, _ = protocol.DeviceIDFromString("LGFPDIT-7SKNNJL-VJZA4FC-7QNCRKA-CE753K7-2BW5QDK-2FOZ7FR-FEP57QJ")
  21. device4, _ = protocol.DeviceIDFromString("P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2")
  22. }
  23. func initConfig() config.Wrapper {
  24. cfg := config.Wrap("/dev/null", config.New(device1), events.NoopLogger)
  25. dev1Conf = config.NewDeviceConfiguration(device1, "device1")
  26. dev2Conf = config.NewDeviceConfiguration(device2, "device2")
  27. dev3Conf = config.NewDeviceConfiguration(device3, "device3")
  28. dev4Conf = config.NewDeviceConfiguration(device4, "device4")
  29. dev2Conf.MaxRecvKbps = rand.Int() % 100000
  30. dev2Conf.MaxSendKbps = rand.Int() % 100000
  31. waiter, _ := cfg.SetDevices([]config.DeviceConfiguration{dev1Conf, dev2Conf, dev3Conf, dev4Conf})
  32. waiter.Wait()
  33. return cfg
  34. }
  35. func TestLimiterInit(t *testing.T) {
  36. cfg := initConfig()
  37. lim := newLimiter(cfg)
  38. device2ReadLimit := dev2Conf.MaxRecvKbps
  39. device2WriteLimit := dev2Conf.MaxSendKbps
  40. expectedR := map[protocol.DeviceID]*rate.Limiter{
  41. device2: rate.NewLimiter(rate.Limit(device2ReadLimit*1024), limiterBurstSize),
  42. device3: rate.NewLimiter(rate.Inf, limiterBurstSize),
  43. device4: rate.NewLimiter(rate.Inf, limiterBurstSize),
  44. }
  45. expectedW := map[protocol.DeviceID]*rate.Limiter{
  46. device2: rate.NewLimiter(rate.Limit(device2WriteLimit*1024), limiterBurstSize),
  47. device3: rate.NewLimiter(rate.Inf, limiterBurstSize),
  48. device4: rate.NewLimiter(rate.Inf, limiterBurstSize),
  49. }
  50. actualR := lim.deviceReadLimiters
  51. actualW := lim.deviceWriteLimiters
  52. checkActualAndExpected(t, actualR, actualW, expectedR, expectedW)
  53. }
  54. func TestSetDeviceLimits(t *testing.T) {
  55. cfg := initConfig()
  56. lim := newLimiter(cfg)
  57. // should still be inf/inf because this is local device
  58. dev1ReadLimit := rand.Int() % 100000
  59. dev1WriteLimit := rand.Int() % 100000
  60. dev1Conf.MaxRecvKbps = dev1ReadLimit
  61. dev1Conf.MaxSendKbps = dev1WriteLimit
  62. dev2ReadLimit := rand.Int() % 100000
  63. dev2WriteLimit := rand.Int() % 100000
  64. dev2Conf.MaxRecvKbps = dev2ReadLimit
  65. dev2Conf.MaxSendKbps = dev2WriteLimit
  66. dev3ReadLimit := rand.Int() % 10000
  67. dev3Conf.MaxRecvKbps = dev3ReadLimit
  68. waiter, _ := cfg.SetDevices([]config.DeviceConfiguration{dev1Conf, dev2Conf, dev3Conf, dev4Conf})
  69. waiter.Wait()
  70. expectedR := map[protocol.DeviceID]*rate.Limiter{
  71. device2: rate.NewLimiter(rate.Limit(dev2ReadLimit*1024), limiterBurstSize),
  72. device3: rate.NewLimiter(rate.Limit(dev3ReadLimit*1024), limiterBurstSize),
  73. device4: rate.NewLimiter(rate.Inf, limiterBurstSize),
  74. }
  75. expectedW := map[protocol.DeviceID]*rate.Limiter{
  76. device2: rate.NewLimiter(rate.Limit(dev2WriteLimit*1024), limiterBurstSize),
  77. device3: rate.NewLimiter(rate.Inf, limiterBurstSize),
  78. device4: rate.NewLimiter(rate.Inf, limiterBurstSize),
  79. }
  80. actualR := lim.deviceReadLimiters
  81. actualW := lim.deviceWriteLimiters
  82. checkActualAndExpected(t, actualR, actualW, expectedR, expectedW)
  83. }
  84. func TestRemoveDevice(t *testing.T) {
  85. cfg := initConfig()
  86. lim := newLimiter(cfg)
  87. waiter, _ := cfg.RemoveDevice(device3)
  88. waiter.Wait()
  89. expectedR := map[protocol.DeviceID]*rate.Limiter{
  90. device2: rate.NewLimiter(rate.Limit(dev2Conf.MaxRecvKbps*1024), limiterBurstSize),
  91. device4: rate.NewLimiter(rate.Inf, limiterBurstSize),
  92. }
  93. expectedW := map[protocol.DeviceID]*rate.Limiter{
  94. device2: rate.NewLimiter(rate.Limit(dev2Conf.MaxSendKbps*1024), limiterBurstSize),
  95. device4: rate.NewLimiter(rate.Inf, limiterBurstSize),
  96. }
  97. actualR := lim.deviceReadLimiters
  98. actualW := lim.deviceWriteLimiters
  99. checkActualAndExpected(t, actualR, actualW, expectedR, expectedW)
  100. }
  101. func TestAddDevice(t *testing.T) {
  102. cfg := initConfig()
  103. lim := newLimiter(cfg)
  104. addedDevice, _ := protocol.DeviceIDFromString("XZJ4UNS-ENI7QGJ-J45DT6G-QSGML2K-6I4XVOG-NAZ7BF5-2VAOWNT-TFDOMQU")
  105. addDevConf := config.NewDeviceConfiguration(addedDevice, "addedDevice")
  106. addDevConf.MaxRecvKbps = 120
  107. addDevConf.MaxSendKbps = 240
  108. waiter, _ := cfg.SetDevice(addDevConf)
  109. waiter.Wait()
  110. expectedR := map[protocol.DeviceID]*rate.Limiter{
  111. device2: rate.NewLimiter(rate.Limit(dev2Conf.MaxRecvKbps*1024), limiterBurstSize),
  112. device3: rate.NewLimiter(rate.Inf, limiterBurstSize),
  113. device4: rate.NewLimiter(rate.Inf, limiterBurstSize),
  114. addedDevice: rate.NewLimiter(rate.Limit(addDevConf.MaxRecvKbps*1024), limiterBurstSize),
  115. }
  116. expectedW := map[protocol.DeviceID]*rate.Limiter{
  117. device2: rate.NewLimiter(rate.Limit(dev2Conf.MaxSendKbps*1024), limiterBurstSize),
  118. device3: rate.NewLimiter(rate.Inf, limiterBurstSize),
  119. device4: rate.NewLimiter(rate.Inf, limiterBurstSize),
  120. addedDevice: rate.NewLimiter(rate.Limit(addDevConf.MaxSendKbps*1024), limiterBurstSize),
  121. }
  122. actualR := lim.deviceReadLimiters
  123. actualW := lim.deviceWriteLimiters
  124. checkActualAndExpected(t, actualR, actualW, expectedR, expectedW)
  125. }
  126. func TestAddAndRemove(t *testing.T) {
  127. cfg := initConfig()
  128. lim := newLimiter(cfg)
  129. addedDevice, _ := protocol.DeviceIDFromString("XZJ4UNS-ENI7QGJ-J45DT6G-QSGML2K-6I4XVOG-NAZ7BF5-2VAOWNT-TFDOMQU")
  130. addDevConf := config.NewDeviceConfiguration(addedDevice, "addedDevice")
  131. addDevConf.MaxRecvKbps = 120
  132. addDevConf.MaxSendKbps = 240
  133. waiter, _ := cfg.SetDevice(addDevConf)
  134. waiter.Wait()
  135. waiter, _ = cfg.RemoveDevice(device3)
  136. waiter.Wait()
  137. expectedR := map[protocol.DeviceID]*rate.Limiter{
  138. device2: rate.NewLimiter(rate.Limit(dev2Conf.MaxRecvKbps*1024), limiterBurstSize),
  139. device4: rate.NewLimiter(rate.Inf, limiterBurstSize),
  140. addedDevice: rate.NewLimiter(rate.Limit(addDevConf.MaxRecvKbps*1024), limiterBurstSize),
  141. }
  142. expectedW := map[protocol.DeviceID]*rate.Limiter{
  143. device2: rate.NewLimiter(rate.Limit(dev2Conf.MaxSendKbps*1024), limiterBurstSize),
  144. device4: rate.NewLimiter(rate.Inf, limiterBurstSize),
  145. addedDevice: rate.NewLimiter(rate.Limit(addDevConf.MaxSendKbps*1024), limiterBurstSize),
  146. }
  147. actualR := lim.deviceReadLimiters
  148. actualW := lim.deviceWriteLimiters
  149. checkActualAndExpected(t, actualR, actualW, expectedR, expectedW)
  150. }
  151. func checkActualAndExpected(t *testing.T, actualR, actualW, expectedR, expectedW map[protocol.DeviceID]*rate.Limiter) {
  152. t.Helper()
  153. if len(expectedW) != len(actualW) || len(expectedR) != len(actualR) {
  154. t.Errorf("Map lengths differ!")
  155. }
  156. for key, val := range expectedR {
  157. if _, ok := actualR[key]; !ok {
  158. t.Errorf("Device %s not found in limiter", key)
  159. }
  160. if val.Limit() != actualR[key].Limit() {
  161. t.Errorf("Read limits for device %s differ actual: %f, expected: %f", key, actualR[key].Limit(), val.Limit())
  162. }
  163. if expectedW[key].Limit() != actualW[key].Limit() {
  164. t.Errorf("Write limits for device %s differ actual: %f, expected: %f", key, actualW[key].Limit(), expectedW[key].Limit())
  165. }
  166. }
  167. }