Skip to content
Snippets Groups Projects
path_id_manager_test.go 2.73 KiB
Newer Older
Oliver Herms's avatar
Oliver Herms committed
package adjRIBOut

import (
	"testing"

	"github.com/bio-routing/bio-rd/route"
	"github.com/stretchr/testify/assert"
)

func TestAddPath(t *testing.T) {
	tests := []struct {
		name     string
		maxIDs   uint32
		count    int
		wantFail bool
	}{
		{
			name:     "Out of path IDs",
			maxIDs:   10,
			count:    11,
			wantFail: true,
		},
		{
			name:     "Success",
			maxIDs:   10,
			count:    10,
			wantFail: false,
		},
	}

X:
	for _, test := range tests {
		maxUint32 = test.maxIDs
		m := newPathIDManager()
		for i := 0; i < test.count; i++ {
			_, err := m.addPath(&route.Path{BGPPath: &route.BGPPath{LocalPref: uint32(i)}})
			if err != nil {
				if test.wantFail {
					continue X
				}

				t.Errorf("Unexpected failure for test %q: %v", test.name, err)
				continue X
			}
		}

		if test.wantFail {
			t.Errorf("Unexpected success for test %q", test.name)
			continue
		}
	}

}

func TestReleasePath(t *testing.T) {
	tests := []struct {
		name     string
Oliver Herms's avatar
Oliver Herms committed
		adds     []*route.Path
Oliver Herms's avatar
Oliver Herms committed
		release  *route.Path
Oliver Herms's avatar
Oliver Herms committed
		expected []*route.Path
Oliver Herms's avatar
Oliver Herms committed
		wantFail bool
	}{
		{
			name: "Release existent",
Oliver Herms's avatar
Oliver Herms committed
			adds: []*route.Path{
				{
					BGPPath: &route.BGPPath{
Oliver Herms's avatar
Oliver Herms committed
						LocalPref: 0,
Oliver Herms's avatar
Oliver Herms committed
					},
				},
				{
					BGPPath: &route.BGPPath{
Oliver Herms's avatar
Oliver Herms committed
						LocalPref: 1,
Oliver Herms's avatar
Oliver Herms committed
					},
				},
				{
					BGPPath: &route.BGPPath{
Oliver Herms's avatar
Oliver Herms committed
						LocalPref: 2,
Oliver Herms's avatar
Oliver Herms committed
					},
Oliver Herms's avatar
Oliver Herms committed
				},
			},
			release: &route.Path{BGPPath: &route.BGPPath{
				LocalPref: 2,
			}},
Oliver Herms's avatar
Oliver Herms committed
			expected: []*route.Path{
				{
					BGPPath: &route.BGPPath{
Oliver Herms's avatar
Oliver Herms committed
						LocalPref: 0,
Oliver Herms's avatar
Oliver Herms committed
					},
				},
				{
					BGPPath: &route.BGPPath{
Oliver Herms's avatar
Oliver Herms committed
						LocalPref: 1,
Oliver Herms's avatar
Oliver Herms committed
					},
Oliver Herms's avatar
Oliver Herms committed
				},
			},
		},
		{
			name: "Release non-existent",
Oliver Herms's avatar
Oliver Herms committed
			adds: []*route.Path{
				{
					BGPPath: &route.BGPPath{
Oliver Herms's avatar
Oliver Herms committed
						LocalPref: 0,
Oliver Herms's avatar
Oliver Herms committed
					},
				},
				{
					BGPPath: &route.BGPPath{
Oliver Herms's avatar
Oliver Herms committed
						LocalPref: 1,
Oliver Herms's avatar
Oliver Herms committed
					},
				},
				{
					BGPPath: &route.BGPPath{
Oliver Herms's avatar
Oliver Herms committed
						LocalPref: 2,
Oliver Herms's avatar
Oliver Herms committed
					},
Oliver Herms's avatar
Oliver Herms committed
				},
			},
			release: &route.Path{BGPPath: &route.BGPPath{
Oliver Herms's avatar
Oliver Herms committed
				LocalPref: 5,
Oliver Herms's avatar
Oliver Herms committed
			}},
Oliver Herms's avatar
Oliver Herms committed
			expected: []*route.Path{
				{
					BGPPath: &route.BGPPath{
Oliver Herms's avatar
Oliver Herms committed
						LocalPref: 0,
Oliver Herms's avatar
Oliver Herms committed
					},
				},
				{
					BGPPath: &route.BGPPath{
Oliver Herms's avatar
Oliver Herms committed
						LocalPref: 1,
Oliver Herms's avatar
Oliver Herms committed
					},
				},
				{
					BGPPath: &route.BGPPath{
Oliver Herms's avatar
Oliver Herms committed
						LocalPref: 2,
Oliver Herms's avatar
Oliver Herms committed
					},
Oliver Herms's avatar
Oliver Herms committed
				},
			},
			wantFail: true,
		},
	}

	for _, test := range tests {
Oliver Herms's avatar
Oliver Herms committed
		pm := newPathIDManager()
		for _, add := range test.adds {
			pm.addPath(add)
		}

		_, err := pm.releasePath(test.release)
Oliver Herms's avatar
Oliver Herms committed
		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
		}

Oliver Herms's avatar
Oliver Herms committed
		expectedPM := newPathIDManager()
		for _, x := range test.expected {
			expectedPM.addPath(x)
		}
		expectedPM.last++

		assert.Equalf(t, expectedPM, pm, "%s", test.name)
Oliver Herms's avatar
Oliver Herms committed
	}
}