github.com/bgp/stayrtr@v0.5.1/lib/server_test.go (about)

     1  package rtrlib
     2  
     3  import (
     4  	"encoding/binary"
     5  	"net"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  )
    10  
    11  func GenerateVrps(size uint32, offset uint32) []SendableData {
    12  	vrps := make([]SendableData, size)
    13  	for i := uint32(0); i < size; i++ {
    14  		ipFinal := make([]byte, 4)
    15  		binary.BigEndian.PutUint32(ipFinal, i+offset)
    16  		vrps[i] = &VRP{
    17  			Prefix: net.IPNet{
    18  				IP:   net.IP(append([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, ipFinal...)),
    19  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
    20  			},
    21  			MaxLen: 128,
    22  			ASN:    64496,
    23  		}
    24  	}
    25  	return vrps
    26  }
    27  
    28  func BaseBench(base int, multiplier int) {
    29  	benchSize1 := base * multiplier
    30  	newVrps := GenerateVrps(uint32(benchSize1), uint32(0))
    31  	benchSize2 := base
    32  	prevVrps := GenerateVrps(uint32(benchSize2), uint32(benchSize1-benchSize2/2))
    33  	ComputeDiff(newVrps, prevVrps)
    34  }
    35  
    36  func BenchmarkComputeDiff1000x10(b *testing.B) {
    37  	BaseBench(1000, 10)
    38  }
    39  
    40  func BenchmarkComputeDiff10000x10(b *testing.B) {
    41  	BaseBench(10000, 10)
    42  }
    43  
    44  func BenchmarkComputeDiff100000x1(b *testing.B) {
    45  	BaseBench(100000, 1)
    46  }
    47  
    48  func TestComputeDiff(t *testing.T) {
    49  	newVrps := []VRP{
    50  		{
    51  			Prefix: net.IPNet{
    52  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3}),
    53  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
    54  			},
    55  			MaxLen: 128,
    56  			ASN:    65003,
    57  		},
    58  		{
    59  			Prefix: net.IPNet{
    60  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2}),
    61  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
    62  			},
    63  			MaxLen: 128,
    64  			ASN:    65002,
    65  		},
    66  	}
    67  	prevVrps := []VRP{
    68  		{
    69  			Prefix: net.IPNet{
    70  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1}),
    71  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
    72  			},
    73  			MaxLen: 128,
    74  			ASN:    65001,
    75  		},
    76  		{
    77  			Prefix: net.IPNet{
    78  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2}),
    79  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
    80  			},
    81  			MaxLen: 128,
    82  			ASN:    65002,
    83  		},
    84  	}
    85  
    86  	newVrpsSD, prevVrpsAsSD := make([]SendableData, 0), make([]SendableData, 0)
    87  	for _, v := range newVrps {
    88  		newVrpsSD = append(newVrpsSD, v.Copy())
    89  	}
    90  	for _, v := range prevVrps {
    91  		prevVrpsAsSD = append(prevVrpsAsSD, v.Copy())
    92  	}
    93  
    94  	added, removed, unchanged := ComputeDiff(newVrpsSD, prevVrpsAsSD)
    95  	assert.Len(t, added, 1)
    96  	assert.Len(t, removed, 1)
    97  	assert.Len(t, unchanged, 1)
    98  	assert.Equal(t, added[0].(*VRP).ASN, uint32(65003))
    99  	assert.Equal(t, removed[0].(*VRP).ASN, uint32(65001))
   100  	assert.Equal(t, unchanged[0].(*VRP).ASN, uint32(65002))
   101  }
   102  
   103  func TestApplyDiff(t *testing.T) {
   104  	diff := []VRP{
   105  		{
   106  			Prefix: net.IPNet{
   107  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3}),
   108  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
   109  			},
   110  			MaxLen: 128,
   111  			ASN:    65003,
   112  			Flags:  FLAG_ADDED,
   113  		},
   114  		{
   115  			Prefix: net.IPNet{
   116  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2}),
   117  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
   118  			},
   119  			MaxLen: 128,
   120  			ASN:    65002,
   121  			Flags:  FLAG_REMOVED,
   122  		},
   123  		{
   124  			Prefix: net.IPNet{
   125  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4}),
   126  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
   127  			},
   128  			MaxLen: 128,
   129  			ASN:    65004,
   130  			Flags:  FLAG_REMOVED,
   131  		},
   132  		{
   133  			Prefix: net.IPNet{
   134  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6}),
   135  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
   136  			},
   137  			MaxLen: 128,
   138  			ASN:    65006,
   139  			Flags:  FLAG_REMOVED,
   140  		},
   141  		{
   142  			Prefix: net.IPNet{
   143  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7}),
   144  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
   145  			},
   146  			MaxLen: 128,
   147  			ASN:    65007,
   148  			Flags:  FLAG_ADDED,
   149  		},
   150  	}
   151  	prevVrps := []VRP{
   152  		{
   153  			Prefix: net.IPNet{
   154  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1}),
   155  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
   156  			},
   157  			MaxLen: 128,
   158  			ASN:    65001,
   159  			Flags:  FLAG_ADDED,
   160  		},
   161  		{
   162  			Prefix: net.IPNet{
   163  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2}),
   164  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
   165  			},
   166  			MaxLen: 128,
   167  			ASN:    65002,
   168  			Flags:  FLAG_ADDED,
   169  		},
   170  		{
   171  			Prefix: net.IPNet{
   172  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5}),
   173  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
   174  			},
   175  			MaxLen: 128,
   176  			ASN:    65005,
   177  			Flags:  FLAG_REMOVED,
   178  		},
   179  		{
   180  			Prefix: net.IPNet{
   181  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6}),
   182  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
   183  			},
   184  			MaxLen: 128,
   185  			ASN:    65006,
   186  			Flags:  FLAG_REMOVED,
   187  		},
   188  		{
   189  			Prefix: net.IPNet{
   190  				IP:   net.IP([]byte{0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7}),
   191  				Mask: net.IPMask([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}),
   192  			},
   193  			MaxLen: 128,
   194  			ASN:    65007,
   195  			Flags:  FLAG_REMOVED,
   196  		},
   197  	}
   198  	diffSD, prevVrpsAsSD := make([]SendableData, 0), make([]SendableData, 0)
   199  	for _, v := range diff {
   200  		diffSD = append(diffSD, v.Copy())
   201  	}
   202  	for _, v := range prevVrps {
   203  		prevVrpsAsSD = append(prevVrpsAsSD, v.Copy())
   204  	}
   205  
   206  	vrps := ApplyDiff(diffSD, prevVrpsAsSD)
   207  
   208  	assert.Len(t, vrps, 6)
   209  	assert.Equal(t, vrps[0].(*VRP).ASN, uint32(65001))
   210  	assert.Equal(t, vrps[0].(*VRP).GetFlag(), uint8(FLAG_ADDED))
   211  	assert.Equal(t, vrps[1].(*VRP).ASN, uint32(65005))
   212  	assert.Equal(t, vrps[1].(*VRP).GetFlag(), uint8(FLAG_REMOVED))
   213  	assert.Equal(t, vrps[2].(*VRP).ASN, uint32(65003))
   214  	assert.Equal(t, vrps[2].(*VRP).GetFlag(), uint8(FLAG_ADDED))
   215  	assert.Equal(t, vrps[3].(*VRP).ASN, uint32(65004))
   216  	assert.Equal(t, vrps[3].(*VRP).GetFlag(), uint8(FLAG_REMOVED))
   217  	assert.Equal(t, vrps[4].(*VRP).ASN, uint32(65006))
   218  	assert.Equal(t, vrps[4].(*VRP).GetFlag(), uint8(FLAG_REMOVED))
   219  	assert.Equal(t, vrps[5].(*VRP).ASN, uint32(65007))
   220  	assert.Equal(t, vrps[5].(*VRP).GetFlag(), uint8(FLAG_ADDED))
   221  }
   222  
   223  func TestComputeDiffBGPSEC(t *testing.T) {
   224  	newVrps := []BgpsecKey{
   225  		{
   226  			ASN:    65003,
   227  			Pubkey: []byte("hurr"),
   228  			Ski:    []byte("durr"),
   229  		},
   230  		{
   231  			Pubkey: []byte("abc"),
   232  			Ski:    []byte("dce"),
   233  			ASN:    65002,
   234  		},
   235  	}
   236  	prevVrps := []BgpsecKey{
   237  		{
   238  			Pubkey: []byte("murr"),
   239  			Ski:    []byte("durr"),
   240  			ASN:    65001,
   241  		},
   242  		{
   243  			Pubkey: []byte("abc"),
   244  			Ski:    []byte("dce"),
   245  			ASN:    65002,
   246  		},
   247  	}
   248  
   249  	newVrpsSD, prevVrpsAsSD := make([]SendableData, 0), make([]SendableData, 0)
   250  	for _, v := range newVrps {
   251  		newVrpsSD = append(newVrpsSD, v.Copy())
   252  	}
   253  	for _, v := range prevVrps {
   254  		prevVrpsAsSD = append(prevVrpsAsSD, v.Copy())
   255  	}
   256  
   257  	added, removed, unchanged := ComputeDiff(newVrpsSD, prevVrpsAsSD)
   258  	assert.Len(t, added, 1)
   259  	assert.Len(t, removed, 1)
   260  	assert.Len(t, unchanged, 1)
   261  	assert.Equal(t, added[0].(*BgpsecKey).ASN, uint32(65003))
   262  	assert.Equal(t, removed[0].(*BgpsecKey).ASN, uint32(65001))
   263  	assert.Equal(t, unchanged[0].(*BgpsecKey).ASN, uint32(65002))
   264  }