2
0

bits_test.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package nebula
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. )
  6. func TestBits(t *testing.T) {
  7. b := NewBits(10)
  8. // make sure it is the right size
  9. assert.Len(t, b.bits, 10)
  10. // This is initialized to zero - receive one. This should work.
  11. assert.True(t, b.Check(1))
  12. u := b.Update(1)
  13. assert.True(t, u)
  14. assert.EqualValues(t, 1, b.current)
  15. g := []bool{false, true, false, false, false, false, false, false, false, false}
  16. assert.Equal(t, g, b.bits)
  17. // Receive two
  18. assert.True(t, b.Check(2))
  19. u = b.Update(2)
  20. assert.True(t, u)
  21. assert.EqualValues(t, 2, b.current)
  22. g = []bool{false, true, true, false, false, false, false, false, false, false}
  23. assert.Equal(t, g, b.bits)
  24. // Receive two again - it will fail
  25. assert.False(t, b.Check(2))
  26. u = b.Update(2)
  27. assert.False(t, u)
  28. assert.EqualValues(t, 2, b.current)
  29. // Jump ahead to 15, which should clear everything and set the 6th element
  30. assert.True(t, b.Check(15))
  31. u = b.Update(15)
  32. assert.True(t, u)
  33. assert.EqualValues(t, 15, b.current)
  34. g = []bool{false, false, false, false, false, true, false, false, false, false}
  35. assert.Equal(t, g, b.bits)
  36. // Mark 14, which is allowed because it is in the window
  37. assert.True(t, b.Check(14))
  38. u = b.Update(14)
  39. assert.True(t, u)
  40. assert.EqualValues(t, 15, b.current)
  41. g = []bool{false, false, false, false, true, true, false, false, false, false}
  42. assert.Equal(t, g, b.bits)
  43. // Mark 5, which is not allowed because it is not in the window
  44. assert.False(t, b.Check(5))
  45. u = b.Update(5)
  46. assert.False(t, u)
  47. assert.EqualValues(t, 15, b.current)
  48. g = []bool{false, false, false, false, true, true, false, false, false, false}
  49. assert.Equal(t, g, b.bits)
  50. // make sure we handle wrapping around once to the current position
  51. b = NewBits(10)
  52. assert.True(t, b.Update(1))
  53. assert.True(t, b.Update(11))
  54. assert.Equal(t, []bool{false, true, false, false, false, false, false, false, false, false}, b.bits)
  55. // Walk through a few windows in order
  56. b = NewBits(10)
  57. for i := uint64(0); i <= 100; i++ {
  58. assert.True(t, b.Check(i), "Error while checking %v", i)
  59. assert.True(t, b.Update(i), "Error while updating %v", i)
  60. }
  61. }
  62. func TestBitsDupeCounter(t *testing.T) {
  63. b := NewBits(10)
  64. b.lostCounter.Clear()
  65. b.dupeCounter.Clear()
  66. b.outOfWindowCounter.Clear()
  67. assert.True(t, b.Update(1))
  68. assert.Equal(t, int64(0), b.dupeCounter.Count())
  69. assert.False(t, b.Update(1))
  70. assert.Equal(t, int64(1), b.dupeCounter.Count())
  71. assert.True(t, b.Update(2))
  72. assert.Equal(t, int64(1), b.dupeCounter.Count())
  73. assert.True(t, b.Update(3))
  74. assert.Equal(t, int64(1), b.dupeCounter.Count())
  75. assert.False(t, b.Update(1))
  76. assert.Equal(t, int64(0), b.lostCounter.Count())
  77. assert.Equal(t, int64(2), b.dupeCounter.Count())
  78. assert.Equal(t, int64(0), b.outOfWindowCounter.Count())
  79. }
  80. func TestBitsOutOfWindowCounter(t *testing.T) {
  81. b := NewBits(10)
  82. b.lostCounter.Clear()
  83. b.dupeCounter.Clear()
  84. b.outOfWindowCounter.Clear()
  85. assert.True(t, b.Update(20))
  86. assert.Equal(t, int64(0), b.outOfWindowCounter.Count())
  87. assert.True(t, b.Update(21))
  88. assert.True(t, b.Update(22))
  89. assert.True(t, b.Update(23))
  90. assert.True(t, b.Update(24))
  91. assert.True(t, b.Update(25))
  92. assert.True(t, b.Update(26))
  93. assert.True(t, b.Update(27))
  94. assert.True(t, b.Update(28))
  95. assert.True(t, b.Update(29))
  96. assert.Equal(t, int64(0), b.outOfWindowCounter.Count())
  97. assert.False(t, b.Update(0))
  98. assert.Equal(t, int64(1), b.outOfWindowCounter.Count())
  99. //tODO: make sure lostcounter doesn't increase in orderly increment
  100. assert.Equal(t, int64(20), b.lostCounter.Count())
  101. assert.Equal(t, int64(0), b.dupeCounter.Count())
  102. assert.Equal(t, int64(1), b.outOfWindowCounter.Count())
  103. }
  104. func TestBitsLostCounter(t *testing.T) {
  105. b := NewBits(10)
  106. b.lostCounter.Clear()
  107. b.dupeCounter.Clear()
  108. b.outOfWindowCounter.Clear()
  109. //assert.True(t, b.Update(0))
  110. assert.True(t, b.Update(0))
  111. assert.True(t, b.Update(20))
  112. assert.True(t, b.Update(21))
  113. assert.True(t, b.Update(22))
  114. assert.True(t, b.Update(23))
  115. assert.True(t, b.Update(24))
  116. assert.True(t, b.Update(25))
  117. assert.True(t, b.Update(26))
  118. assert.True(t, b.Update(27))
  119. assert.True(t, b.Update(28))
  120. assert.True(t, b.Update(29))
  121. assert.Equal(t, int64(20), b.lostCounter.Count())
  122. assert.Equal(t, int64(0), b.dupeCounter.Count())
  123. assert.Equal(t, int64(0), b.outOfWindowCounter.Count())
  124. b = NewBits(10)
  125. b.lostCounter.Clear()
  126. b.dupeCounter.Clear()
  127. b.outOfWindowCounter.Clear()
  128. assert.True(t, b.Update(0))
  129. assert.Equal(t, int64(0), b.lostCounter.Count())
  130. assert.True(t, b.Update(9))
  131. assert.Equal(t, int64(0), b.lostCounter.Count())
  132. // 10 will set 0 index, 0 was already set, no lost packets
  133. assert.True(t, b.Update(10))
  134. assert.Equal(t, int64(0), b.lostCounter.Count())
  135. // 11 will set 1 index, 1 was missed, we should see 1 packet lost
  136. assert.True(t, b.Update(11))
  137. assert.Equal(t, int64(1), b.lostCounter.Count())
  138. // Now let's fill in the window, should end up with 8 lost packets
  139. assert.True(t, b.Update(12))
  140. assert.True(t, b.Update(13))
  141. assert.True(t, b.Update(14))
  142. assert.True(t, b.Update(15))
  143. assert.True(t, b.Update(16))
  144. assert.True(t, b.Update(17))
  145. assert.True(t, b.Update(18))
  146. assert.True(t, b.Update(19))
  147. assert.Equal(t, int64(8), b.lostCounter.Count())
  148. // Jump ahead by a window size
  149. assert.True(t, b.Update(29))
  150. assert.Equal(t, int64(8), b.lostCounter.Count())
  151. // Now lets walk ahead normally through the window, the missed packets should fill in
  152. assert.True(t, b.Update(30))
  153. assert.True(t, b.Update(31))
  154. assert.True(t, b.Update(32))
  155. assert.True(t, b.Update(33))
  156. assert.True(t, b.Update(34))
  157. assert.True(t, b.Update(35))
  158. assert.True(t, b.Update(36))
  159. assert.True(t, b.Update(37))
  160. assert.True(t, b.Update(38))
  161. // 39 packets tracked, 22 seen, 17 lost
  162. assert.Equal(t, int64(17), b.lostCounter.Count())
  163. // Jump ahead by 2 windows, should have recording 1 full window missing
  164. assert.True(t, b.Update(58))
  165. assert.Equal(t, int64(27), b.lostCounter.Count())
  166. // Now lets walk ahead normally through the window, the missed packets should fill in from this window
  167. assert.True(t, b.Update(59))
  168. assert.True(t, b.Update(60))
  169. assert.True(t, b.Update(61))
  170. assert.True(t, b.Update(62))
  171. assert.True(t, b.Update(63))
  172. assert.True(t, b.Update(64))
  173. assert.True(t, b.Update(65))
  174. assert.True(t, b.Update(66))
  175. assert.True(t, b.Update(67))
  176. // 68 packets tracked, 32 seen, 36 missed
  177. assert.Equal(t, int64(36), b.lostCounter.Count())
  178. assert.Equal(t, int64(0), b.dupeCounter.Count())
  179. assert.Equal(t, int64(0), b.outOfWindowCounter.Count())
  180. }
  181. func BenchmarkBits(b *testing.B) {
  182. z := NewBits(10)
  183. for n := 0; n < b.N; n++ {
  184. for i := range z.bits {
  185. z.bits[i] = true
  186. }
  187. for i := range z.bits {
  188. z.bits[i] = false
  189. }
  190. }
  191. }