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 }