timeout_system_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package nebula
  2. import (
  3. "net"
  4. "testing"
  5. "time"
  6. "github.com/slackhq/nebula/iputil"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. func TestNewSystemTimerWheel(t *testing.T) {
  10. // Make sure we get an object we expect
  11. tw := NewSystemTimerWheel(time.Second, time.Second*10)
  12. assert.Equal(t, 11, tw.wheelLen)
  13. assert.Equal(t, 0, tw.current)
  14. assert.Nil(t, tw.lastTick)
  15. assert.Equal(t, time.Second*1, tw.tickDuration)
  16. assert.Equal(t, time.Second*10, tw.wheelDuration)
  17. assert.Len(t, tw.wheel, 11)
  18. // Assert the math is correct
  19. tw = NewSystemTimerWheel(time.Second*3, time.Second*10)
  20. assert.Equal(t, 4, tw.wheelLen)
  21. tw = NewSystemTimerWheel(time.Second*120, time.Minute*10)
  22. assert.Equal(t, 6, tw.wheelLen)
  23. }
  24. func TestSystemTimerWheel_findWheel(t *testing.T) {
  25. tw := NewSystemTimerWheel(time.Second, time.Second*10)
  26. assert.Len(t, tw.wheel, 11)
  27. // Current + tick + 1 since we don't know how far into current we are
  28. assert.Equal(t, 2, tw.findWheel(time.Second*1))
  29. // Scale up to min duration
  30. assert.Equal(t, 2, tw.findWheel(time.Millisecond*1))
  31. // Make sure we hit that last index
  32. assert.Equal(t, 0, tw.findWheel(time.Second*10))
  33. // Scale down to max duration
  34. assert.Equal(t, 0, tw.findWheel(time.Second*11))
  35. tw.current = 1
  36. // Make sure we account for the current position properly
  37. assert.Equal(t, 3, tw.findWheel(time.Second*1))
  38. assert.Equal(t, 1, tw.findWheel(time.Second*10))
  39. }
  40. func TestSystemTimerWheel_Add(t *testing.T) {
  41. tw := NewSystemTimerWheel(time.Second, time.Second*10)
  42. fp1 := iputil.Ip2VpnIp(net.ParseIP("1.2.3.4"))
  43. tw.Add(fp1, time.Second*1)
  44. // Make sure we set head and tail properly
  45. assert.NotNil(t, tw.wheel[2])
  46. assert.Equal(t, fp1, tw.wheel[2].Head.Item)
  47. assert.Nil(t, tw.wheel[2].Head.Next)
  48. assert.Equal(t, fp1, tw.wheel[2].Tail.Item)
  49. assert.Nil(t, tw.wheel[2].Tail.Next)
  50. // Make sure we only modify head
  51. fp2 := iputil.Ip2VpnIp(net.ParseIP("1.2.3.4"))
  52. tw.Add(fp2, time.Second*1)
  53. assert.Equal(t, fp2, tw.wheel[2].Head.Item)
  54. assert.Equal(t, fp1, tw.wheel[2].Head.Next.Item)
  55. assert.Equal(t, fp1, tw.wheel[2].Tail.Item)
  56. assert.Nil(t, tw.wheel[2].Tail.Next)
  57. // Make sure we use free'd items first
  58. tw.itemCache = &SystemTimeoutItem{}
  59. tw.itemsCached = 1
  60. tw.Add(fp2, time.Second*1)
  61. assert.Nil(t, tw.itemCache)
  62. assert.Equal(t, 0, tw.itemsCached)
  63. }
  64. func TestSystemTimerWheel_Purge(t *testing.T) {
  65. // First advance should set the lastTick and do nothing else
  66. tw := NewSystemTimerWheel(time.Second, time.Second*10)
  67. assert.Nil(t, tw.lastTick)
  68. tw.advance(time.Now())
  69. assert.NotNil(t, tw.lastTick)
  70. assert.Equal(t, 0, tw.current)
  71. fps := []iputil.VpnIp{9, 10, 11, 12}
  72. //fp1 := ip2int(net.ParseIP("1.2.3.4"))
  73. tw.Add(fps[0], time.Second*1)
  74. tw.Add(fps[1], time.Second*1)
  75. tw.Add(fps[2], time.Second*2)
  76. tw.Add(fps[3], time.Second*2)
  77. ta := time.Now().Add(time.Second * 3)
  78. lastTick := *tw.lastTick
  79. tw.advance(ta)
  80. assert.Equal(t, 3, tw.current)
  81. assert.True(t, tw.lastTick.After(lastTick))
  82. // Make sure we get all 4 packets back
  83. for i := 0; i < 4; i++ {
  84. assert.Contains(t, fps, tw.Purge())
  85. }
  86. // Make sure there aren't any leftover
  87. assert.Nil(t, tw.Purge())
  88. assert.Nil(t, tw.expired.Head)
  89. assert.Nil(t, tw.expired.Tail)
  90. // Make sure we cached the free'd items
  91. assert.Equal(t, 4, tw.itemsCached)
  92. ci := tw.itemCache
  93. for i := 0; i < 4; i++ {
  94. assert.NotNil(t, ci)
  95. ci = ci.Next
  96. }
  97. assert.Nil(t, ci)
  98. // Lets make sure we roll over properly
  99. ta = ta.Add(time.Second * 5)
  100. tw.advance(ta)
  101. assert.Equal(t, 8, tw.current)
  102. ta = ta.Add(time.Second * 2)
  103. tw.advance(ta)
  104. assert.Equal(t, 10, tw.current)
  105. ta = ta.Add(time.Second * 1)
  106. tw.advance(ta)
  107. assert.Equal(t, 0, tw.current)
  108. }