github.com/tonistiigi/docker@v0.10.1-0.20240229224939-974013b0dc6a/libnetwork/drivers/bridge/setup_device_linux_test.go (about) 1 package bridge 2 3 import ( 4 "bytes" 5 "net" 6 "syscall" 7 "testing" 8 9 "github.com/docker/docker/internal/testutils/netnsutils" 10 "github.com/docker/docker/libnetwork/netutils" 11 "github.com/vishvananda/netlink" 12 "gotest.tools/v3/assert" 13 ) 14 15 func TestSetupNewBridge(t *testing.T) { 16 defer netnsutils.SetupTestOSContext(t)() 17 18 nh, err := netlink.NewHandle() 19 if err != nil { 20 t.Fatal(err) 21 } 22 defer nh.Close() 23 24 config := &networkConfiguration{BridgeName: DefaultBridgeName} 25 br := &bridgeInterface{nlh: nh} 26 27 if err := setupDevice(config, br); err != nil { 28 t.Fatalf("Bridge creation failed: %v", err) 29 } 30 if br.Link == nil { 31 t.Fatal("bridgeInterface link is nil (expected valid link)") 32 } 33 if _, err := nh.LinkByName(DefaultBridgeName); err != nil { 34 t.Fatalf("Failed to retrieve bridge device: %v", err) 35 } 36 if br.Link.Attrs().Flags&net.FlagUp == net.FlagUp { 37 t.Fatal("bridgeInterface should be created down") 38 } 39 } 40 41 func TestSetupNewNonDefaultBridge(t *testing.T) { 42 defer netnsutils.SetupTestOSContext(t)() 43 44 nh, err := netlink.NewHandle() 45 if err != nil { 46 t.Fatal(err) 47 } 48 defer nh.Close() 49 50 config := &networkConfiguration{BridgeName: "test0", DefaultBridge: true} 51 br := &bridgeInterface{nlh: nh} 52 53 err = setupDevice(config, br) 54 if err == nil { 55 t.Fatal(`Expected bridge creation failure with "non default name", succeeded`) 56 } 57 58 if _, ok := err.(NonDefaultBridgeExistError); !ok { 59 t.Fatalf("Did not fail with expected error. Actual error: %v", err) 60 } 61 } 62 63 func TestSetupDeviceUp(t *testing.T) { 64 defer netnsutils.SetupTestOSContext(t)() 65 66 nh, err := netlink.NewHandle() 67 if err != nil { 68 t.Fatal(err) 69 } 70 defer nh.Close() 71 72 config := &networkConfiguration{BridgeName: DefaultBridgeName} 73 br := &bridgeInterface{nlh: nh} 74 75 if err := setupDevice(config, br); err != nil { 76 t.Fatalf("Bridge creation failed: %v", err) 77 } 78 if err := setupDeviceUp(config, br); err != nil { 79 t.Fatalf("Failed to up bridge device: %v", err) 80 } 81 82 lnk, _ := nh.LinkByName(DefaultBridgeName) 83 if lnk.Attrs().Flags&net.FlagUp != net.FlagUp { 84 t.Fatal("bridgeInterface should be up") 85 } 86 } 87 88 func TestGenerateRandomMAC(t *testing.T) { 89 defer netnsutils.SetupTestOSContext(t)() 90 91 mac1 := netutils.GenerateRandomMAC() 92 mac2 := netutils.GenerateRandomMAC() 93 if bytes.Equal(mac1, mac2) { 94 t.Fatalf("Generated twice the same MAC address %v", mac1) 95 } 96 } 97 98 func TestMTUBiggerThan1500(t *testing.T) { 99 defer netnsutils.SetupTestOSContext(t)() 100 101 nh, err := netlink.NewHandle() 102 if err != nil { 103 t.Fatal(err) 104 } 105 defer nh.Close() 106 107 config := &networkConfiguration{BridgeName: DefaultBridgeName, Mtu: 9000} 108 br := &bridgeInterface{nlh: nh} 109 110 assert.NilError(t, setupDevice(config, br)) 111 assert.NilError(t, setupMTU(config, br)) 112 } 113 114 func TestMTUBiggerThan64K(t *testing.T) { 115 defer netnsutils.SetupTestOSContext(t)() 116 117 nh, err := netlink.NewHandle() 118 if err != nil { 119 t.Fatal(err) 120 } 121 defer nh.Close() 122 123 config := &networkConfiguration{BridgeName: DefaultBridgeName, Mtu: 65536} 124 br := &bridgeInterface{nlh: nh} 125 126 assert.NilError(t, setupDevice(config, br)) 127 assert.ErrorIs(t, setupMTU(config, br), syscall.EINVAL) 128 }