@@ -10,7 +10,6 @@ import (
10
10
"net/netip"
11
11
"os"
12
12
"runtime"
13
- "strings"
14
13
"testing"
15
14
16
15
"github.com/pion/transport/v3/stdnet"
@@ -165,25 +164,20 @@ func TestGetNextHop(t *testing.T) {
165
164
func TestAddExistAndRemoveRoute (t * testing.T ) {
166
165
defaultNexthop , err := GetNextHop (netip .MustParseAddr ("0.0.0.0" ))
167
166
t .Log ("defaultNexthop: " , defaultNexthop )
168
- if err != nil {
169
- t .Fatal ("shouldn't return error when fetching the gateway: " , err )
170
- }
167
+ require .NoError (t , err , "shouldn't return error when fetching the gateway" )
168
+
171
169
testCases := []struct {
172
170
name string
173
171
prefix netip.Prefix
174
172
preExistingPrefix netip.Prefix
175
173
shouldAddRoute bool
174
+ expectError bool
176
175
}{
177
176
{
178
177
name : "Should Add And Remove random Route" ,
179
178
prefix : netip .MustParsePrefix ("99.99.99.99/32" ),
180
179
shouldAddRoute : true ,
181
180
},
182
- {
183
- name : "Should Not Add Route if overlaps with default gateway" ,
184
- prefix : netip .MustParsePrefix (defaultNexthop .IP .String () + "/31" ),
185
- shouldAddRoute : false ,
186
- },
187
181
{
188
182
name : "Should Add Route if bigger network exists" ,
189
183
prefix : netip .MustParsePrefix ("100.100.100.0/24" ),
@@ -197,10 +191,10 @@ func TestAddExistAndRemoveRoute(t *testing.T) {
197
191
shouldAddRoute : true ,
198
192
},
199
193
{
200
- name : "Should Not Add Route if same network exists " ,
194
+ name : "Should Error on duplicate route " ,
201
195
prefix : netip .MustParsePrefix ("100.100.0.0/16" ),
202
196
preExistingPrefix : netip .MustParsePrefix ("100.100.0.0/16" ),
203
- shouldAddRoute : false ,
197
+ expectError : true ,
204
198
},
205
199
}
206
200
@@ -217,9 +211,8 @@ func TestAddExistAndRemoveRoute(t *testing.T) {
217
211
218
212
peerPrivateKey , _ := wgtypes .GeneratePrivateKey ()
219
213
newNet , err := stdnet .NewNet ()
220
- if err != nil {
221
- t .Fatal (err )
222
- }
214
+ require .NoError (t , err , "should create new net" )
215
+
223
216
opts := iface.WGIFaceOpts {
224
217
IFaceName : fmt .Sprintf ("utun53%d" , n ),
225
218
Address : "100.65.75.2/24" ,
@@ -249,6 +242,12 @@ func TestAddExistAndRemoveRoute(t *testing.T) {
249
242
250
243
// Add the route
251
244
err = r .AddVPNRoute (testCase .prefix , intf )
245
+
246
+ if testCase .expectError {
247
+ require .Error (t , err , "should return error" )
248
+ return
249
+ }
250
+
252
251
require .NoError (t , err , "should not return err when adding route" )
253
252
254
253
if testCase .shouldAddRoute {
@@ -260,97 +259,16 @@ func TestAddExistAndRemoveRoute(t *testing.T) {
260
259
// remove route again if added
261
260
err = r .RemoveVPNRoute (testCase .prefix , intf )
262
261
require .NoError (t , err , "should not return err" )
263
- }
264
-
265
- // route should either not have been added or should have been removed
266
- // In case of already existing route, it should not have been added (but still exist)
267
- ok , err := existsInRouteTable (testCase .prefix )
268
- t .Log ("Buffer string: " , buf .String ())
269
- require .NoError (t , err , "should not return err" )
270
262
271
- if ! strings .Contains (buf .String (), "because it already exists" ) {
272
- require .False (t , ok , "route should not exist" )
263
+ // route should be removed
264
+ ok , err = existsInRouteTable (testCase .prefix )
265
+ require .NoError (t , err , "should not return err" )
266
+ require .False (t , ok , "route should not exist after removal" )
273
267
}
274
268
})
275
269
}
276
270
}
277
271
278
- func TestIsSubRange (t * testing.T ) {
279
- addresses , err := net .InterfaceAddrs ()
280
- if err != nil {
281
- t .Fatal ("shouldn't return error when fetching interface addresses: " , err )
282
- }
283
-
284
- var subRangeAddressPrefixes []netip.Prefix
285
- var nonSubRangeAddressPrefixes []netip.Prefix
286
- for _ , address := range addresses {
287
- p := netip .MustParsePrefix (address .String ())
288
- if ! p .Addr ().IsLoopback () && p .Addr ().Is4 () && p .Bits () < 32 {
289
- p2 := netip .PrefixFrom (p .Masked ().Addr (), p .Bits ()+ 1 )
290
- subRangeAddressPrefixes = append (subRangeAddressPrefixes , p2 )
291
- nonSubRangeAddressPrefixes = append (nonSubRangeAddressPrefixes , p .Masked ())
292
- }
293
- }
294
-
295
- for _ , prefix := range subRangeAddressPrefixes {
296
- isSubRangePrefix , err := isSubRange (prefix )
297
- if err != nil {
298
- t .Fatal ("shouldn't return error when checking if address is sub-range: " , err )
299
- }
300
- if ! isSubRangePrefix {
301
- t .Fatalf ("address %s should be sub-range of an existing route in the table" , prefix )
302
- }
303
- }
304
-
305
- for _ , prefix := range nonSubRangeAddressPrefixes {
306
- isSubRangePrefix , err := isSubRange (prefix )
307
- if err != nil {
308
- t .Fatal ("shouldn't return error when checking if address is sub-range: " , err )
309
- }
310
- if isSubRangePrefix {
311
- t .Fatalf ("address %s should not be sub-range of an existing route in the table" , prefix )
312
- }
313
- }
314
- }
315
-
316
- func TestExistsInRouteTable (t * testing.T ) {
317
- addresses , err := net .InterfaceAddrs ()
318
- if err != nil {
319
- t .Fatal ("shouldn't return error when fetching interface addresses: " , err )
320
- }
321
-
322
- var addressPrefixes []netip.Prefix
323
- for _ , address := range addresses {
324
- p := netip .MustParsePrefix (address .String ())
325
-
326
- switch {
327
- case p .Addr ().Is6 ():
328
- continue
329
- // Windows sometimes has hidden interface link local addrs that don't turn up on any interface
330
- case runtime .GOOS == "windows" && p .Addr ().IsLinkLocalUnicast ():
331
- continue
332
- // Linux loopback 127/8 is in the local table, not in the main table and always takes precedence
333
- case runtime .GOOS == "linux" && p .Addr ().IsLoopback ():
334
- continue
335
- // FreeBSD loopback 127/8 is not added to the routing table
336
- case runtime .GOOS == "freebsd" && p .Addr ().IsLoopback ():
337
- continue
338
- default :
339
- addressPrefixes = append (addressPrefixes , p .Masked ())
340
- }
341
- }
342
-
343
- for _ , prefix := range addressPrefixes {
344
- exists , err := existsInRouteTable (prefix )
345
- if err != nil {
346
- t .Fatal ("shouldn't return error when checking if address exists in route table: " , err )
347
- }
348
- if ! exists {
349
- t .Fatalf ("address %s should exist in route table" , prefix )
350
- }
351
- }
352
- }
353
-
354
272
func createWGInterface (t * testing.T , interfaceName , ipAddressCIDR string , listenPort int ) * iface.WGIface {
355
273
t .Helper ()
356
274
@@ -565,3 +483,16 @@ func TestIsVpnRoute(t *testing.T) {
565
483
})
566
484
}
567
485
}
486
+
487
+ func existsInRouteTable (prefix netip.Prefix ) (bool , error ) {
488
+ routes , err := GetRoutesFromTable ()
489
+ if err != nil {
490
+ return false , fmt .Errorf ("get routes from table: %w" , err )
491
+ }
492
+ for _ , tableRoute := range routes {
493
+ if tableRoute == prefix {
494
+ return true , nil
495
+ }
496
+ }
497
+ return false , nil
498
+ }
0 commit comments