Skip to content
Snippets Groups Projects
prefix_test.go 5.86 KiB
Newer Older
  • Learn to ignore specific revisions
  • Oliver Herms's avatar
    Oliver Herms committed
    package net
    
    import (
    	"testing"
    
    	"github.com/stretchr/testify/assert"
    )
    
    func TestNewPfx(t *testing.T) {
    
    	p := NewPfx(IPv4(123), 11)
    	if p.addr != IPv4(123) || p.pfxlen != 11 {
    
    Oliver Herms's avatar
    Oliver Herms committed
    		t.Errorf("NewPfx() failed: Unexpected values")
    	}
    }
    
    func TestAddr(t *testing.T) {
    	tests := []struct {
    		name     string
    
    Oliver Herms's avatar
    Oliver Herms committed
    	}{
    		{
    			name:     "Test 1",
    
    			pfx:      NewPfx(IPv4(100), 5),
    			expected: IPv4(100),
    
    Oliver Herms's avatar
    Oliver Herms committed
    		},
    	}
    
    	for _, test := range tests {
    		res := test.pfx.Addr()
    		if res != test.expected {
    			t.Errorf("Unexpected result for test %s: Got %d Expected %d", test.name, res, test.expected)
    		}
    	}
    }
    
    func TestPfxlen(t *testing.T) {
    	tests := []struct {
    		name     string
    
    Oliver Herms's avatar
    Oliver Herms committed
    		expected uint8
    	}{
    		{
    			name:     "Test 1",
    
    			pfx:      NewPfx(IPv4(100), 5),
    
    Oliver Herms's avatar
    Oliver Herms committed
    			expected: 5,
    		},
    	}
    
    	for _, test := range tests {
    		res := test.pfx.Pfxlen()
    		if res != test.expected {
    			t.Errorf("Unexpected result for test %s: Got %d Expected %d", test.name, res, test.expected)
    		}
    	}
    }
    
    func TestGetSupernet(t *testing.T) {
    	tests := []struct {
    		name     string
    
    		a        Prefix
    		b        Prefix
    		expected Prefix
    
    Oliver Herms's avatar
    Oliver Herms committed
    	}{
    		{
    			name: "Test 1",
    
    				addr:   IPv4FromOctets(10, 0, 0, 0),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 8,
    			},
    
    				addr:   IPv4FromOctets(11, 100, 123, 0),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 24,
    			},
    
    			expected: Prefix{
    
    				addr:   IPv4FromOctets(10, 0, 0, 0),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 7,
    			},
    		},
    		{
    			name: "Test 2",
    
    				addr:   IPv4FromOctets(10, 0, 0, 0),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 8,
    			},
    
    				addr:   IPv4FromOctets(192, 168, 0, 0),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 24,
    			},
    
    			expected: Prefix{
    
    				addr:   IPv4(0), // 0.0.0.0/0
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 0,
    			},
    		},
    	}
    
    	for _, test := range tests {
    		s := test.a.GetSupernet(test.b)
    		assert.Equal(t, s, test.expected)
    	}
    }
    
    func TestContains(t *testing.T) {
    	tests := []struct {
    		name     string
    
    Oliver Herms's avatar
    Oliver Herms committed
    		expected bool
    	}{
    		{
    			name: "Test 1",
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 0,
    			},
    
    				addr:   IPv4(100),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 24,
    			},
    			expected: true,
    		},
    		{
    			name: "Test 2",
    
    				addr:   IPv4(100),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 24,
    			},
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 0,
    			},
    			expected: false,
    		},
    		{
    			name: "Test 3",
    
    				addr:   IPv4(167772160),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 8,
    			},
    
    				addr:   IPv4(167772160),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 9,
    			},
    			expected: true,
    		},
    		{
    			name: "Test 4",
    
    				addr:   IPv4(167772160),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 8,
    			},
    
    				addr:   IPv4(174391040),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 24,
    			},
    			expected: true,
    		},
    		{
    			name: "Test 5",
    
    				addr:   IPv4(167772160),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 8,
    			},
    
    				addr:   IPv4(184549377),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 24,
    			},
    			expected: false,
    		},
    		{
    			name: "Test 6",
    
    				addr:   IPv4(167772160),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 8,
    			},
    
    				addr:   IPv4(191134464),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				pfxlen: 24,
    			},
    			expected: false,
    		},
    
    		{
    			name: "Test 7",
    			a: Prefix{
    
    				addr:   IPv4FromOctets(169, 0, 0, 0),
    
    				pfxlen: 25,
    			},
    			b: Prefix{
    
    				addr:   IPv4FromOctets(169, 1, 1, 0),
    
    				pfxlen: 26,
    			},
    			expected: false,
    		},
    
    Oliver Herms's avatar
    Oliver Herms committed
    	}
    
    	for _, test := range tests {
    		res := test.a.Contains(test.b)
    		if res != test.expected {
    			t.Errorf("Unexpected result %v for test %s: %s contains %s\n", res, test.name, test.a.String(), test.b.String())
    		}
    	}
    }
    
    func TestMin(t *testing.T) {
    	tests := []struct {
    		name     string
    		a        uint8
    		b        uint8
    		expected uint8
    	}{
    		{
    			name:     "Min 100 200",
    			a:        100,
    			b:        200,
    			expected: 100,
    		},
    		{
    			name:     "Min 200 100",
    			a:        200,
    			b:        100,
    			expected: 100,
    		},
    		{
    			name:     "Min 111 112",
    			a:        111,
    			b:        112,
    			expected: 111,
    		},
    	}
    
    	for _, test := range tests {
    		res := min(test.a, test.b)
    		if res != test.expected {
    			t.Errorf("Unexpected result for test %s: Got %d Expected %d", test.name, res, test.expected)
    		}
    	}
    }
    
    func TestEqual(t *testing.T) {
    	tests := []struct {
    		name     string
    
    Oliver Herms's avatar
    Oliver Herms committed
    		expected bool
    	}{
    		{
    			name:     "Equal PFXs",
    
    			a:        NewPfx(IPv4(100), 8),
    			b:        NewPfx(IPv4(100), 8),
    
    Oliver Herms's avatar
    Oliver Herms committed
    			expected: true,
    		},
    		{
    			name:     "Unequal PFXs",
    
    			a:        NewPfx(IPv4(100), 8),
    			b:        NewPfx(IPv4(200), 8),
    
    Oliver Herms's avatar
    Oliver Herms committed
    			expected: false,
    		},
    	}
    
    	for _, test := range tests {
    		res := test.a.Equal(test.b)
    		if res != test.expected {
    			t.Errorf("Unexpected result for %q: Got %v Expected %v", test.name, res, test.expected)
    		}
    	}
    }
    
    func TestString(t *testing.T) {
    	tests := []struct {
    		name     string
    
    Oliver Herms's avatar
    Oliver Herms committed
    		expected string
    	}{
    		{
    			name:     "Test 1",
    
    			pfx:      NewPfx(IPv4FromOctets(10, 0, 0, 0), 8),
    
    Oliver Herms's avatar
    Oliver Herms committed
    			expected: "10.0.0.0/8",
    		},
    		{
    			name:     "Test 2",
    
    			pfx:      NewPfx(IPv4FromOctets(10, 0, 0, 0), 16),
    
    Oliver Herms's avatar
    Oliver Herms committed
    			expected: "10.0.0.0/16",
    		},
    	}
    
    	for _, test := range tests {
    		res := test.pfx.String()
    		if res != test.expected {
    			t.Errorf("Unexpected result for %q: Got %q Expected %q", test.name, res, test.expected)
    		}
    	}
    }
    
    func TestStrToAddr(t *testing.T) {
    	tests := []struct {
    		name     string
    		input    string
    		wantFail bool
    		expected uint32
    	}{
    		{
    			name:     "Invalid address #1",
    			input:    "10.10.10",
    			wantFail: true,
    		},
    		{
    			name:     "Invalid address #2",
    			input:    "",
    			wantFail: true,
    		},
    		{
    			name:     "Invalid address #3",
    			input:    "10.10.10.10.10",
    			wantFail: true,
    		},
    		{
    			name:     "Invalid address #4",
    			input:    "10.256.0.0",
    			wantFail: true,
    		},
    		{
    			name:     "Valid address",
    			input:    "10.0.0.0",
    			wantFail: false,
    			expected: 167772160,
    		},
    	}
    
    	for _, test := range tests {
    		res, err := StrToAddr(test.input)
    		if err != nil {
    			if test.wantFail {
    				continue
    			}
    			t.Errorf("Unexpected failure for test %q: %v", test.name, err)
    			continue
    		}
    
    		if test.wantFail {
    			t.Errorf("Unexpected success for test %q", test.name)
    			continue
    		}
    
    		assert.Equal(t, test.expected, res)
    	}
    }