Skip to content
Snippets Groups Projects
nlri_test.go 4.47 KiB
Newer Older
  • Learn to ignore specific revisions
  • Oliver Herms's avatar
    Oliver Herms committed
    package packet
    
    import (
    	"bytes"
    	"testing"
    
    
    	bnet "github.com/bio-routing/bio-rd/net"
    
    Oliver Herms's avatar
    Oliver Herms committed
    	"github.com/stretchr/testify/assert"
    )
    
    func TestDecodeNLRIs(t *testing.T) {
    	tests := []struct {
    		name     string
    		input    []byte
    		wantFail bool
    		expected *NLRI
    	}{
    		{
    			name: "Valid NRLI #1",
    			input: []byte{
    				24, 192, 168, 0,
    				8, 10,
    				17, 172, 16, 0,
    			},
    			wantFail: false,
    			expected: &NLRI{
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    				Prefix: bnet.NewPfx(bnet.IPv4FromOctets(192, 168, 0, 0), 24),
    
    Oliver Herms's avatar
    Oliver Herms committed
    				Next: &NLRI{
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    					Prefix: bnet.NewPfx(bnet.IPv4FromOctets(10, 0, 0, 0), 8),
    
    Oliver Herms's avatar
    Oliver Herms committed
    					Next: &NLRI{
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    						Prefix: bnet.NewPfx(bnet.IPv4FromOctets(172, 16, 0, 0), 17),
    
    Oliver Herms's avatar
    Oliver Herms committed
    					},
    				},
    			},
    		},
    		{
    			name: "Invalid NRLI #1",
    			input: []byte{
    				24, 192, 168, 0,
    				8, 10,
    				17, 172, 16,
    			},
    			wantFail: true,
    		},
    	}
    
    	for _, test := range tests {
    		buf := bytes.NewBuffer(test.input)
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    		res, err := decodeNLRIs(buf, uint16(len(test.input)), IPv4AFI)
    
    Oliver Herms's avatar
    Oliver Herms committed
    
    		if test.wantFail && err == nil {
    			t.Errorf("Expected error did not happen for test %q", test.name)
    		}
    
    		if !test.wantFail && err != nil {
    			t.Errorf("Unexpected failure for test %q: %v", test.name, err)
    		}
    
    		assert.Equal(t, test.expected, res)
    	}
    }
    
    func TestDecodeNLRI(t *testing.T) {
    	tests := []struct {
    		name     string
    		input    []byte
    		wantFail bool
    		expected *NLRI
    	}{
    		{
    			name: "Valid NRLI #1",
    			input: []byte{
    				24, 192, 168, 0,
    			},
    			wantFail: false,
    			expected: &NLRI{
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    				Prefix: bnet.NewPfx(bnet.IPv4FromOctets(192, 168, 0, 0), 24),
    
    Oliver Herms's avatar
    Oliver Herms committed
    			},
    		},
    		{
    			name: "Valid NRLI #2",
    			input: []byte{
    				25, 192, 168, 0, 128,
    			},
    			wantFail: false,
    			expected: &NLRI{
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    				Prefix: bnet.NewPfx(bnet.IPv4FromOctets(192, 168, 0, 128), 25),
    
    Oliver Herms's avatar
    Oliver Herms committed
    			},
    		},
    		{
    			name: "Incomplete NLRI #1",
    			input: []byte{
    				25, 192, 168, 0,
    			},
    			wantFail: true,
    		},
    		{
    			name: "Incomplete NLRI #2",
    			input: []byte{
    				25,
    			},
    			wantFail: true,
    		},
    		{
    			name:     "Empty input",
    			input:    []byte{},
    			wantFail: true,
    		},
    	}
    
    	for _, test := range tests {
    		buf := bytes.NewBuffer(test.input)
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    		res, _, err := decodeNLRI(buf, IPv4AFI)
    
    Oliver Herms's avatar
    Oliver Herms committed
    
    		if test.wantFail && err == nil {
    			t.Errorf("Expected error did not happen for test %q", test.name)
    		}
    
    		if !test.wantFail && err != nil {
    			t.Errorf("Unexpected failure for test %q: %v", test.name, err)
    		}
    
    		assert.Equal(t, test.expected, res)
    	}
    }
    
    
    func TestBytesInAddr(t *testing.T) {
    	tests := []struct {
    		name     string
    		input    uint8
    		expected uint8
    	}{
    		{
    			name:     "Test #1",
    			input:    24,
    			expected: 3,
    		},
    		{
    			name:     "Test #2",
    			input:    25,
    			expected: 4,
    		},
    		{
    			name:     "Test #3",
    			input:    32,
    			expected: 4,
    		},
    		{
    			name:     "Test #4",
    			input:    0,
    			expected: 0,
    		},
    		{
    			name:     "Test #5",
    			input:    9,
    			expected: 2,
    		},
    	}
    
    	for _, test := range tests {
    
    Oliver Herms's avatar
    Oliver Herms committed
    		res := BytesInAddr(test.input)
    
    		if res != test.expected {
    			t.Errorf("Unexpected result for test %q: %d", test.name, res)
    		}
    	}
    }
    
    func TestNLRISerialize(t *testing.T) {
    	tests := []struct {
    		name     string
    		nlri     *NLRI
    		expected []byte
    	}{
    		{
    			name: "Test #1",
    			nlri: &NLRI{
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    				Prefix: bnet.NewPfx(bnet.IPv4FromOctets(1, 2, 3, 0), 25),
    
    			},
    			expected: []byte{25, 1, 2, 3, 0},
    		},
    		{
    			name: "Test #2",
    			nlri: &NLRI{
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    				Prefix: bnet.NewPfx(bnet.IPv4FromOctets(1, 2, 3, 0), 24),
    
    			},
    			expected: []byte{24, 1, 2, 3},
    		},
    		{
    			name: "Test #3",
    			nlri: &NLRI{
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    				Prefix: bnet.NewPfx(bnet.IPv4FromOctets(100, 200, 128, 0), 17),
    
    			},
    			expected: []byte{17, 100, 200, 128},
    		},
    	}
    
    	for _, test := range tests {
    		buf := bytes.NewBuffer(nil)
    		test.nlri.serialize(buf)
    		res := buf.Bytes()
    		assert.Equal(t, test.expected, res)
    	}
    }
    
    Oliver Herms's avatar
    Oliver Herms committed
    
    func TestNLRIAddPathSerialize(t *testing.T) {
    	tests := []struct {
    		name     string
    
    Oliver Herms's avatar
    Oliver Herms committed
    		nlri     *NLRI
    
    Oliver Herms's avatar
    Oliver Herms committed
    		expected []byte
    	}{
    		{
    			name: "Test #1",
    
    Oliver Herms's avatar
    Oliver Herms committed
    			nlri: &NLRI{
    
    Oliver Herms's avatar
    Oliver Herms committed
    				PathIdentifier: 100,
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    				Prefix:         bnet.NewPfx(bnet.IPv4FromOctets(1, 2, 3, 0), 25),
    
    Oliver Herms's avatar
    Oliver Herms committed
    			},
    			expected: []byte{0, 0, 0, 100, 25, 1, 2, 3, 0},
    		},
    		{
    			name: "Test #2",
    
    Oliver Herms's avatar
    Oliver Herms committed
    			nlri: &NLRI{
    
    Oliver Herms's avatar
    Oliver Herms committed
    				PathIdentifier: 100,
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    				Prefix:         bnet.NewPfx(bnet.IPv4FromOctets(1, 2, 3, 0), 24),
    
    Oliver Herms's avatar
    Oliver Herms committed
    			},
    			expected: []byte{0, 0, 0, 100, 24, 1, 2, 3},
    		},
    		{
    			name: "Test #3",
    
    Oliver Herms's avatar
    Oliver Herms committed
    			nlri: &NLRI{
    
    Oliver Herms's avatar
    Oliver Herms committed
    				PathIdentifier: 100,
    
    Daniel Czerwonk's avatar
    Daniel Czerwonk committed
    				Prefix:         bnet.NewPfx(bnet.IPv4FromOctets(100, 200, 128, 0), 17),
    
    Oliver Herms's avatar
    Oliver Herms committed
    			},
    			expected: []byte{0, 0, 0, 100, 17, 100, 200, 128},
    		},
    	}
    
    	for _, test := range tests {
    		buf := bytes.NewBuffer(nil)
    
    Oliver Herms's avatar
    Oliver Herms committed
    		test.nlri.serializeAddPath(buf)
    
    Oliver Herms's avatar
    Oliver Herms committed
    		res := buf.Bytes()
    		assert.Equal(t, test.expected, res)
    	}
    }