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  }