bits_test.go 6.8 KB

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