github.com/looshlee/beatles@v0.0.0-20220727174639-742810ab631c/pkg/counter/prefixes_test.go (about) 1 // Copyright 2018 Authors of Cilium 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // +build !privileged_tests 16 17 package counter 18 19 import ( 20 "net" 21 "testing" 22 23 "github.com/cilium/cilium/pkg/checker" 24 25 . "gopkg.in/check.v1" 26 ) 27 28 // Hook up gocheck into the "go test" runner. 29 type CounterTestSuite struct{} 30 31 var _ = Suite(&CounterTestSuite{}) 32 33 func Test(t *testing.T) { 34 TestingT(t) 35 } 36 37 func (cs *CounterTestSuite) TestReferenceTracker(c *C) { 38 v4Prefixes := []*net.IPNet{ 39 {Mask: net.CIDRMask(0, 32)}, 40 {Mask: net.CIDRMask(15, 32)}, 41 {Mask: net.CIDRMask(15, 32)}, 42 {Mask: net.CIDRMask(31, 32)}, 43 {Mask: net.CIDRMask(32, 32)}, 44 } 45 v4PrefixesLengths := map[int]int{ 46 0: 1, 47 15: 2, 48 31: 1, 49 32: 1, 50 } 51 52 result := NewPrefixLengthCounter(128, 32) 53 54 // Expected output is the combination of defaults and the above prefixes. 55 expectedPrefixLengths := make(IntCounter, len(v4PrefixesLengths)) 56 for k, v := range v4PrefixesLengths { 57 expectedPrefixLengths[k] += v 58 } 59 // New prefixes are added (return true) 60 changed, err := result.Add(v4Prefixes) 61 c.Assert(err, IsNil) 62 c.Assert(changed, Equals, true) 63 c.Assert(result.v4, checker.DeepEquals, expectedPrefixLengths) 64 65 // When we add the prefixes again, we should increase the reference 66 // counts appropriately 67 for k, v := range v4PrefixesLengths { 68 expectedPrefixLengths[k] += v 69 } 70 // This time, there are no new prefix lengths (return false). 71 changed, err = result.Add(v4Prefixes) 72 c.Assert(err, IsNil) 73 c.Assert(changed, Equals, false) 74 c.Assert(result.v4, checker.DeepEquals, expectedPrefixLengths) 75 76 // Delete the /15 prefix and see that it is removed and doesn't affect 77 // other counts 78 prefixes15 := []*net.IPNet{ 79 {Mask: net.CIDRMask(15, 32)}, 80 } 81 expectedPrefixLengths[15]-- 82 c.Assert(result.Delete(prefixes15), Equals, false) 83 c.Assert(result.v4, checker.DeepEquals, expectedPrefixLengths) 84 85 // Delete some prefix lengths 86 for k, v := range v4PrefixesLengths { 87 expectedPrefixLengths[k] -= v 88 } 89 // No change in prefix lengths; each 'prefixes' was referenced twice. 90 c.Assert(result.Delete(v4Prefixes), Equals, false) 91 c.Assert(result.v4, checker.DeepEquals, expectedPrefixLengths) 92 93 // Re-add the /32 prefix and see that it is added back properly. 94 expectedPrefixLengths[15]++ 95 changed, err = result.Add(prefixes15) 96 c.Assert(err, IsNil) 97 c.Assert(changed, Equals, false) 98 c.Assert(result.v4, checker.DeepEquals, expectedPrefixLengths) 99 100 // When removing the 'prefixes' again, return true and the set of 101 // prefixes should be empty 102 c.Assert(result.Delete(v4Prefixes), Equals, true) 103 c.Assert(result.v4, checker.DeepEquals, IntCounter{}) 104 105 // Add back the v4 prefixes while we add v6 prefixes. 106 changed, err = result.Add(v4Prefixes) 107 c.Assert(err, IsNil) 108 c.Assert(changed, Equals, true) 109 c.Assert(result.v4, checker.DeepEquals, expectedPrefixLengths) 110 111 v6Prefixes := []*net.IPNet{ 112 {Mask: net.CIDRMask(0, 128)}, 113 {Mask: net.CIDRMask(76, 128)}, 114 {Mask: net.CIDRMask(96, 128)}, 115 {Mask: net.CIDRMask(120, 128)}, 116 } 117 v6PrefixesLengths := map[int]int{ 118 0: 1, 119 76: 1, 120 96: 1, 121 120: 1, 122 } 123 124 expectedPrefixLengths = make(IntCounter, len(v6PrefixesLengths)) 125 126 // Add the v6 prefixes (changed: true) 127 for k, v := range v6PrefixesLengths { 128 expectedPrefixLengths[k] = v 129 } 130 changed, err = result.Add(v6Prefixes) 131 c.Assert(err, IsNil) 132 c.Assert(changed, Equals, true) 133 c.Assert(result.v6, checker.DeepEquals, expectedPrefixLengths) 134 135 // Add the v6 prefixes again (changed: false) 136 for k, v := range v6PrefixesLengths { 137 expectedPrefixLengths[k] += v 138 } 139 changed, err = result.Add(v6Prefixes) 140 c.Assert(err, IsNil) 141 c.Assert(changed, Equals, false) 142 c.Assert(result.v6, checker.DeepEquals, expectedPrefixLengths) 143 144 // Now, remove them (changed: false) 145 for k, v := range v6PrefixesLengths { 146 expectedPrefixLengths[k] -= v 147 } 148 c.Assert(result.Delete(v6Prefixes), Equals, false) 149 c.Assert(result.v6, checker.DeepEquals, expectedPrefixLengths) 150 151 // Delete them again (changed: true) 152 c.Assert(result.Delete(v6Prefixes), Equals, true) 153 c.Assert(result.v6, checker.DeepEquals, IntCounter{}) 154 155 // Our v4 prefixes should still be here, unchanged 156 expectedPrefixLengths = make(map[int]int, len(v4PrefixesLengths)) 157 for k, v := range v4PrefixesLengths { 158 expectedPrefixLengths[k] += v 159 } 160 c.Assert(result.v4, checker.DeepEquals, expectedPrefixLengths) 161 } 162 163 func (cs *CounterTestSuite) TestCheckLimits(c *C) { 164 result := NewPrefixLengthCounter(4, 4) 165 c.Assert(checkLimits(0, 4, result.maxUniquePrefixes4), IsNil) 166 c.Assert(checkLimits(0, 5, result.maxUniquePrefixes4), NotNil) 167 c.Assert(checkLimits(0, 4, result.maxUniquePrefixes6), IsNil) 168 c.Assert(checkLimits(0, 5, result.maxUniquePrefixes6), NotNil) 169 170 prefixes := []*net.IPNet{ 171 {Mask: net.CIDRMask(0, 32)}, 172 {Mask: net.CIDRMask(15, 32)}, 173 {Mask: net.CIDRMask(31, 32)}, 174 {Mask: net.CIDRMask(32, 32)}, 175 } 176 changed, err := result.Add(prefixes) 177 c.Assert(err, IsNil) 178 c.Assert(changed, Equals, true) 179 180 changed, err = result.Add([]*net.IPNet{{Mask: net.CIDRMask(8, 32)}}) 181 c.Assert(err, NotNil) 182 c.Assert(changed, Equals, false) 183 } 184 185 func (cs *CounterTestSuite) TestToBPFData(c *C) { 186 result := NewPrefixLengthCounter(42, 32) 187 188 prefixes := []string{ 189 "192.0.2.0/24", 190 "192.0.2.0/32", 191 "192.0.64.0/20", 192 } 193 prefixesToAdd := []*net.IPNet{} 194 for _, prefix := range prefixes { 195 _, net, err := net.ParseCIDR(prefix) 196 c.Assert(err, IsNil) 197 prefixesToAdd = append(prefixesToAdd, net) 198 } 199 200 _, err := result.Add(prefixesToAdd) 201 c.Assert(err, IsNil) 202 203 s6, s4 := result.ToBPFData() 204 c.Assert(s6, checker.DeepEquals, []int{}) 205 c.Assert(s4, checker.DeepEquals, []int{32, 24, 20}) 206 }