package p2p
|
|
|
|
import (
|
|
"math"
|
|
"math/rand"
|
|
"net"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func randByte() byte {
|
|
return byte(rand.Intn(math.MaxUint8))
|
|
}
|
|
|
|
func randLocalIPv4() net.IP {
|
|
return net.IPv4(127, randByte(), randByte(), randByte())
|
|
}
|
|
|
|
func TestConnTracker(t *testing.T) {
|
|
for name, factory := range map[string]func() connectionTracker{
|
|
"BaseSmall": func() connectionTracker {
|
|
return newConnTracker(10, time.Second)
|
|
},
|
|
"BaseLarge": func() connectionTracker {
|
|
return newConnTracker(100, time.Hour)
|
|
},
|
|
} {
|
|
t.Run(name, func(t *testing.T) {
|
|
factory := factory // nolint:scopelint
|
|
t.Run("Initialized", func(t *testing.T) {
|
|
ct := factory()
|
|
require.Equal(t, 0, ct.Len())
|
|
})
|
|
t.Run("RepeatedAdding", func(t *testing.T) {
|
|
ct := factory()
|
|
ip := randLocalIPv4()
|
|
require.NoError(t, ct.AddConn(ip))
|
|
for i := 0; i < 100; i++ {
|
|
_ = ct.AddConn(ip)
|
|
}
|
|
require.Equal(t, 1, ct.Len())
|
|
})
|
|
t.Run("AddingMany", func(t *testing.T) {
|
|
ct := factory()
|
|
for i := 0; i < 100; i++ {
|
|
_ = ct.AddConn(randLocalIPv4())
|
|
}
|
|
require.Equal(t, 100, ct.Len())
|
|
})
|
|
t.Run("Cycle", func(t *testing.T) {
|
|
ct := factory()
|
|
for i := 0; i < 100; i++ {
|
|
ip := randLocalIPv4()
|
|
require.NoError(t, ct.AddConn(ip))
|
|
ct.RemoveConn(ip)
|
|
}
|
|
require.Equal(t, 0, ct.Len())
|
|
})
|
|
})
|
|
}
|
|
t.Run("VeryShort", func(t *testing.T) {
|
|
ct := newConnTracker(10, time.Microsecond)
|
|
for i := 0; i < 10; i++ {
|
|
ip := randLocalIPv4()
|
|
require.NoError(t, ct.AddConn(ip))
|
|
time.Sleep(2 * time.Microsecond)
|
|
require.NoError(t, ct.AddConn(ip))
|
|
}
|
|
require.Equal(t, 10, ct.Len())
|
|
})
|
|
}
|