diff --git a/routingtable/table_test.go b/routingtable/table_test.go index d0c00092f7750143c09ad2d2171eb4b3a23f8bcc..c3ff2510e8f8996278e2f37806855be05995018a 100644 --- a/routingtable/table_test.go +++ b/routingtable/table_test.go @@ -10,9 +10,10 @@ import ( func TestAddPath(t *testing.T) { tests := []struct { - name string - routes []*route.Route - expected *node + name string + routes []*route.Route + expected *node + expectedCount int64 }{ { name: "Insert first node", @@ -23,6 +24,7 @@ func TestAddPath(t *testing.T) { route: route.NewRoute(net.NewPfx(net.IPv4FromOctets(10, 0, 0, 0), 8), nil), skip: 8, }, + expectedCount: 1, }, { name: "Insert duplicate node", @@ -36,6 +38,7 @@ func TestAddPath(t *testing.T) { route: route.NewRoute(net.NewPfx(net.IPv4FromOctets(10, 0, 0, 0), 8), nil), skip: 8, }, + expectedCount: 1, }, { name: "Insert triangle", @@ -54,6 +57,7 @@ func TestAddPath(t *testing.T) { route: route.NewRoute(net.NewPfx(net.IPv4FromOctets(10, 128, 0, 0), 9), nil), }, }, + expectedCount: 3, }, { name: "Insert disjunct prefixes", @@ -73,6 +77,7 @@ func TestAddPath(t *testing.T) { skip: 16, }, }, + expectedCount: 2, }, { name: "Insert disjunct prefixes plus one child low", @@ -102,6 +107,7 @@ func TestAddPath(t *testing.T) { skip: 16, }, }, + expectedCount: 4, }, { name: "Insert disjunct prefixes plus one child high", @@ -135,6 +141,7 @@ func TestAddPath(t *testing.T) { }, }, }, + expectedCount: 5, }, } @@ -145,6 +152,7 @@ func TestAddPath(t *testing.T) { } assert.Equal(t, test.expected, rt.root) + assert.Equal(t, test.expectedCount, rt.GetRouteCount()) } } @@ -342,11 +350,12 @@ func TestLPM(t *testing.T) { func TestRemovePath(t *testing.T) { tests := []struct { - name string - routes []*route.Route - removePfx net.Prefix - removePath *route.Path - expected []*route.Route + name string + routes []*route.Route + removePfx net.Prefix + removePath *route.Path + expected []*route.Route + expectedCount int64 }{ { name: "Remove a path that is the only one for a prefix", @@ -379,6 +388,7 @@ func TestRemovePath(t *testing.T) { BGPPath: &route.BGPPath{}, }), }, + expectedCount: 2, }, { name: "Remove a path that is one of two for a prefix", @@ -427,6 +437,7 @@ func TestRemovePath(t *testing.T) { BGPPath: &route.BGPPath{}, }), }, + expectedCount: 3, }, } @@ -448,6 +459,7 @@ func TestRemovePath(t *testing.T) { } assert.Equal(t, rtExpected.Dump(), rt.Dump()) + assert.Equal(t, test.expectedCount, rt.GetRouteCount()) } } diff --git a/routingtable/trie.go b/routingtable/trie.go index 25a4262e6d4001383c5a2bd095b13d44fd47401b..82caf1adf333ef3dcff85438aeb8adbc2337b6d1 100644 --- a/routingtable/trie.go +++ b/routingtable/trie.go @@ -118,8 +118,10 @@ func (n *node) addPath(pfx net.Prefix, p *route.Path) (*node, bool) { currentPfx := n.route.Prefix() if currentPfx == pfx { n.route.AddPath(p) + // Store previous dummy-ness to check it this node became new + dummy := n.dummy n.dummy = false - return n, true + return n, dummy == true } // is pfx NOT a subnet of this node?