Skip to content
Snippets Groups Projects
nlri_test.go 4.47 KiB
Newer Older
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)
	}
}