|
@@ -10,7 +10,7 @@ import (
|
|
|
|
|
|
func TestNewTimerWheel(t *testing.T) {
|
|
func TestNewTimerWheel(t *testing.T) {
|
|
// Make sure we get an object we expect
|
|
// Make sure we get an object we expect
|
|
- tw := NewTimerWheel(time.Second, time.Second*10)
|
|
|
|
|
|
+ tw := NewTimerWheel[firewall.Packet](time.Second, time.Second*10)
|
|
assert.Equal(t, 12, tw.wheelLen)
|
|
assert.Equal(t, 12, tw.wheelLen)
|
|
assert.Equal(t, 0, tw.current)
|
|
assert.Equal(t, 0, tw.current)
|
|
assert.Nil(t, tw.lastTick)
|
|
assert.Nil(t, tw.lastTick)
|
|
@@ -19,15 +19,27 @@ func TestNewTimerWheel(t *testing.T) {
|
|
assert.Len(t, tw.wheel, 12)
|
|
assert.Len(t, tw.wheel, 12)
|
|
|
|
|
|
// Assert the math is correct
|
|
// Assert the math is correct
|
|
- tw = NewTimerWheel(time.Second*3, time.Second*10)
|
|
|
|
|
|
+ tw = NewTimerWheel[firewall.Packet](time.Second*3, time.Second*10)
|
|
assert.Equal(t, 5, tw.wheelLen)
|
|
assert.Equal(t, 5, tw.wheelLen)
|
|
|
|
|
|
- tw = NewTimerWheel(time.Second*120, time.Minute*10)
|
|
|
|
|
|
+ tw = NewTimerWheel[firewall.Packet](time.Second*120, time.Minute*10)
|
|
assert.Equal(t, 7, tw.wheelLen)
|
|
assert.Equal(t, 7, tw.wheelLen)
|
|
|
|
+
|
|
|
|
+ // Test empty purge of non nil items
|
|
|
|
+ i, ok := tw.Purge()
|
|
|
|
+ assert.Equal(t, firewall.Packet{}, i)
|
|
|
|
+ assert.False(t, ok)
|
|
|
|
+
|
|
|
|
+ // Test empty purges of nil items
|
|
|
|
+ tw2 := NewTimerWheel[*int](time.Second, time.Second*10)
|
|
|
|
+ i2, ok := tw2.Purge()
|
|
|
|
+ assert.Nil(t, i2)
|
|
|
|
+ assert.False(t, ok)
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
func TestTimerWheel_findWheel(t *testing.T) {
|
|
func TestTimerWheel_findWheel(t *testing.T) {
|
|
- tw := NewTimerWheel(time.Second, time.Second*10)
|
|
|
|
|
|
+ tw := NewTimerWheel[firewall.Packet](time.Second, time.Second*10)
|
|
assert.Len(t, tw.wheel, 12)
|
|
assert.Len(t, tw.wheel, 12)
|
|
|
|
|
|
// Current + tick + 1 since we don't know how far into current we are
|
|
// Current + tick + 1 since we don't know how far into current we are
|
|
@@ -49,28 +61,28 @@ func TestTimerWheel_findWheel(t *testing.T) {
|
|
}
|
|
}
|
|
|
|
|
|
func TestTimerWheel_Add(t *testing.T) {
|
|
func TestTimerWheel_Add(t *testing.T) {
|
|
- tw := NewTimerWheel(time.Second, time.Second*10)
|
|
|
|
|
|
+ tw := NewTimerWheel[firewall.Packet](time.Second, time.Second*10)
|
|
|
|
|
|
fp1 := firewall.Packet{}
|
|
fp1 := firewall.Packet{}
|
|
tw.Add(fp1, time.Second*1)
|
|
tw.Add(fp1, time.Second*1)
|
|
|
|
|
|
// Make sure we set head and tail properly
|
|
// Make sure we set head and tail properly
|
|
assert.NotNil(t, tw.wheel[2])
|
|
assert.NotNil(t, tw.wheel[2])
|
|
- assert.Equal(t, fp1, tw.wheel[2].Head.Packet)
|
|
|
|
|
|
+ assert.Equal(t, fp1, tw.wheel[2].Head.Item)
|
|
assert.Nil(t, tw.wheel[2].Head.Next)
|
|
assert.Nil(t, tw.wheel[2].Head.Next)
|
|
- assert.Equal(t, fp1, tw.wheel[2].Tail.Packet)
|
|
|
|
|
|
+ assert.Equal(t, fp1, tw.wheel[2].Tail.Item)
|
|
assert.Nil(t, tw.wheel[2].Tail.Next)
|
|
assert.Nil(t, tw.wheel[2].Tail.Next)
|
|
|
|
|
|
// Make sure we only modify head
|
|
// Make sure we only modify head
|
|
fp2 := firewall.Packet{}
|
|
fp2 := firewall.Packet{}
|
|
tw.Add(fp2, time.Second*1)
|
|
tw.Add(fp2, time.Second*1)
|
|
- assert.Equal(t, fp2, tw.wheel[2].Head.Packet)
|
|
|
|
- assert.Equal(t, fp1, tw.wheel[2].Head.Next.Packet)
|
|
|
|
- assert.Equal(t, fp1, tw.wheel[2].Tail.Packet)
|
|
|
|
|
|
+ assert.Equal(t, fp2, tw.wheel[2].Head.Item)
|
|
|
|
+ assert.Equal(t, fp1, tw.wheel[2].Head.Next.Item)
|
|
|
|
+ assert.Equal(t, fp1, tw.wheel[2].Tail.Item)
|
|
assert.Nil(t, tw.wheel[2].Tail.Next)
|
|
assert.Nil(t, tw.wheel[2].Tail.Next)
|
|
|
|
|
|
// Make sure we use free'd items first
|
|
// Make sure we use free'd items first
|
|
- tw.itemCache = &TimeoutItem{}
|
|
|
|
|
|
+ tw.itemCache = &TimeoutItem[firewall.Packet]{}
|
|
tw.itemsCached = 1
|
|
tw.itemsCached = 1
|
|
tw.Add(fp2, time.Second*1)
|
|
tw.Add(fp2, time.Second*1)
|
|
assert.Nil(t, tw.itemCache)
|
|
assert.Nil(t, tw.itemCache)
|
|
@@ -79,7 +91,7 @@ func TestTimerWheel_Add(t *testing.T) {
|
|
// Ensure that all configurations of a wheel does not result in calculating an overflow of the wheel
|
|
// Ensure that all configurations of a wheel does not result in calculating an overflow of the wheel
|
|
for min := time.Duration(1); min < 100; min++ {
|
|
for min := time.Duration(1); min < 100; min++ {
|
|
for max := min; max < 100; max++ {
|
|
for max := min; max < 100; max++ {
|
|
- tw = NewTimerWheel(min, max)
|
|
|
|
|
|
+ tw = NewTimerWheel[firewall.Packet](min, max)
|
|
|
|
|
|
for current := 0; current < tw.wheelLen; current++ {
|
|
for current := 0; current < tw.wheelLen; current++ {
|
|
tw.current = current
|
|
tw.current = current
|
|
@@ -96,9 +108,9 @@ func TestTimerWheel_Add(t *testing.T) {
|
|
|
|
|
|
func TestTimerWheel_Purge(t *testing.T) {
|
|
func TestTimerWheel_Purge(t *testing.T) {
|
|
// First advance should set the lastTick and do nothing else
|
|
// First advance should set the lastTick and do nothing else
|
|
- tw := NewTimerWheel(time.Second, time.Second*10)
|
|
|
|
|
|
+ tw := NewTimerWheel[firewall.Packet](time.Second, time.Second*10)
|
|
assert.Nil(t, tw.lastTick)
|
|
assert.Nil(t, tw.lastTick)
|
|
- tw.advance(time.Now())
|
|
|
|
|
|
+ tw.Advance(time.Now())
|
|
assert.NotNil(t, tw.lastTick)
|
|
assert.NotNil(t, tw.lastTick)
|
|
assert.Equal(t, 0, tw.current)
|
|
assert.Equal(t, 0, tw.current)
|
|
|
|
|
|
@@ -116,7 +128,7 @@ func TestTimerWheel_Purge(t *testing.T) {
|
|
|
|
|
|
ta := time.Now().Add(time.Second * 3)
|
|
ta := time.Now().Add(time.Second * 3)
|
|
lastTick := *tw.lastTick
|
|
lastTick := *tw.lastTick
|
|
- tw.advance(ta)
|
|
|
|
|
|
+ tw.Advance(ta)
|
|
assert.Equal(t, 3, tw.current)
|
|
assert.Equal(t, 3, tw.current)
|
|
assert.True(t, tw.lastTick.After(lastTick))
|
|
assert.True(t, tw.lastTick.After(lastTick))
|
|
|
|
|
|
@@ -142,20 +154,20 @@ func TestTimerWheel_Purge(t *testing.T) {
|
|
}
|
|
}
|
|
assert.Nil(t, ci)
|
|
assert.Nil(t, ci)
|
|
|
|
|
|
- // Lets make sure we roll over properly
|
|
|
|
|
|
+ // Let's make sure we roll over properly
|
|
ta = ta.Add(time.Second * 5)
|
|
ta = ta.Add(time.Second * 5)
|
|
- tw.advance(ta)
|
|
|
|
|
|
+ tw.Advance(ta)
|
|
assert.Equal(t, 8, tw.current)
|
|
assert.Equal(t, 8, tw.current)
|
|
|
|
|
|
ta = ta.Add(time.Second * 2)
|
|
ta = ta.Add(time.Second * 2)
|
|
- tw.advance(ta)
|
|
|
|
|
|
+ tw.Advance(ta)
|
|
assert.Equal(t, 10, tw.current)
|
|
assert.Equal(t, 10, tw.current)
|
|
|
|
|
|
ta = ta.Add(time.Second * 1)
|
|
ta = ta.Add(time.Second * 1)
|
|
- tw.advance(ta)
|
|
|
|
|
|
+ tw.Advance(ta)
|
|
assert.Equal(t, 11, tw.current)
|
|
assert.Equal(t, 11, tw.current)
|
|
|
|
|
|
ta = ta.Add(time.Second * 1)
|
|
ta = ta.Add(time.Second * 1)
|
|
- tw.advance(ta)
|
|
|
|
|
|
+ tw.Advance(ta)
|
|
assert.Equal(t, 0, tw.current)
|
|
assert.Equal(t, 0, tw.current)
|
|
}
|
|
}
|