123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- package routing
- import (
- "net/netip"
- "testing"
- "github.com/slackhq/nebula/firewall"
- "github.com/stretchr/testify/assert"
- )
- func TestPacketsAreBalancedEqually(t *testing.T) {
- gateways := []Gateway{}
- gw1Addr := netip.MustParseAddr("1.0.0.1")
- gw2Addr := netip.MustParseAddr("1.0.0.2")
- gw3Addr := netip.MustParseAddr("1.0.0.3")
- gateways = append(gateways, NewGateway(gw1Addr, 1))
- gateways = append(gateways, NewGateway(gw2Addr, 1))
- gateways = append(gateways, NewGateway(gw3Addr, 1))
- CalculateBucketsForGateways(gateways)
- gw1count := 0
- gw2count := 0
- gw3count := 0
- iterationCount := uint16(65535)
- for i := uint16(0); i < iterationCount; i++ {
- packet := firewall.Packet{
- LocalAddr: netip.MustParseAddr("192.168.1.1"),
- RemoteAddr: netip.MustParseAddr("10.0.0.1"),
- LocalPort: i,
- RemotePort: 65535 - i,
- Protocol: 6, // TCP
- Fragment: false,
- }
- selectedGw, ok := BalancePacket(&packet, gateways)
- assert.True(t, ok)
- switch selectedGw {
- case gw1Addr:
- gw1count += 1
- case gw2Addr:
- gw2count += 1
- case gw3Addr:
- gw3count += 1
- }
- }
- // Assert packets are balanced, allow variation of up to 100 packets per gateway
- assert.InDeltaf(t, iterationCount/3, gw1count, 100, "Expected %d +/- 100, but got %d", iterationCount/3, gw1count)
- assert.InDeltaf(t, iterationCount/3, gw2count, 100, "Expected %d +/- 100, but got %d", iterationCount/3, gw1count)
- assert.InDeltaf(t, iterationCount/3, gw3count, 100, "Expected %d +/- 100, but got %d", iterationCount/3, gw1count)
- }
- func TestPacketsAreBalancedByPriority(t *testing.T) {
- gateways := []Gateway{}
- gw1Addr := netip.MustParseAddr("1.0.0.1")
- gw2Addr := netip.MustParseAddr("1.0.0.2")
- gateways = append(gateways, NewGateway(gw1Addr, 10))
- gateways = append(gateways, NewGateway(gw2Addr, 5))
- CalculateBucketsForGateways(gateways)
- gw1count := 0
- gw2count := 0
- iterationCount := uint16(65535)
- for i := uint16(0); i < iterationCount; i++ {
- packet := firewall.Packet{
- LocalAddr: netip.MustParseAddr("192.168.1.1"),
- RemoteAddr: netip.MustParseAddr("10.0.0.1"),
- LocalPort: i,
- RemotePort: 65535 - i,
- Protocol: 6, // TCP
- Fragment: false,
- }
- selectedGw, ok := BalancePacket(&packet, gateways)
- assert.True(t, ok)
- switch selectedGw {
- case gw1Addr:
- gw1count += 1
- case gw2Addr:
- gw2count += 1
- }
- }
- iterationCountAsFloat := float32(iterationCount)
- assert.InDeltaf(t, iterationCountAsFloat*(2.0/3.0), gw1count, 100, "Expected %d +/- 100, but got %d", iterationCountAsFloat*(2.0/3.0), gw1count)
- assert.InDeltaf(t, iterationCountAsFloat*(1.0/3.0), gw2count, 100, "Expected %d +/- 100, but got %d", iterationCountAsFloat*(1.0/3.0), gw2count)
- }
- func TestBalancePacketDistributsRandomlyAndReturnsFalseIfBucketsNotCalculated(t *testing.T) {
- gateways := []Gateway{}
- gw1Addr := netip.MustParseAddr("1.0.0.1")
- gw2Addr := netip.MustParseAddr("1.0.0.2")
- gateways = append(gateways, NewGateway(gw1Addr, 10))
- gateways = append(gateways, NewGateway(gw2Addr, 5))
- iterationCount := uint16(65535)
- gw1count := 0
- gw2count := 0
- for i := uint16(0); i < iterationCount; i++ {
- packet := firewall.Packet{
- LocalAddr: netip.MustParseAddr("192.168.1.1"),
- RemoteAddr: netip.MustParseAddr("10.0.0.1"),
- LocalPort: i,
- RemotePort: 65535 - i,
- Protocol: 6, // TCP
- Fragment: false,
- }
- selectedGw, ok := BalancePacket(&packet, gateways)
- assert.False(t, ok)
- switch selectedGw {
- case gw1Addr:
- gw1count += 1
- case gw2Addr:
- gw2count += 1
- }
- }
- assert.Equal(t, int(iterationCount), (gw1count + gw2count))
- assert.NotEqual(t, 0, gw1count)
- assert.NotEqual(t, 0, gw2count)
- }
|