github.com/jfrazelle/docker@v1.1.2-0.20210712172922-bf78e25fe508/libnetwork/drvregistry/drvregistry_test.go (about) 1 package drvregistry 2 3 import ( 4 "runtime" 5 "sort" 6 "testing" 7 8 "github.com/docker/docker/libnetwork/datastore" 9 "github.com/docker/docker/libnetwork/discoverapi" 10 "github.com/docker/docker/libnetwork/driverapi" 11 "github.com/docker/docker/libnetwork/ipamapi" 12 builtinIpam "github.com/docker/docker/libnetwork/ipams/builtin" 13 nullIpam "github.com/docker/docker/libnetwork/ipams/null" 14 remoteIpam "github.com/docker/docker/libnetwork/ipams/remote" 15 "gotest.tools/v3/assert" 16 is "gotest.tools/v3/assert/cmp" 17 18 // this takes care of the incontainer flag 19 _ "github.com/docker/docker/libnetwork/testutils" 20 ) 21 22 const mockDriverName = "mock-driver" 23 24 type mockDriver struct{} 25 26 var md = mockDriver{} 27 28 func mockDriverInit(reg driverapi.DriverCallback, opt map[string]interface{}) error { 29 return reg.RegisterDriver(mockDriverName, &md, driverapi.Capability{DataScope: datastore.LocalScope}) 30 } 31 32 func (m *mockDriver) CreateNetwork(nid string, options map[string]interface{}, nInfo driverapi.NetworkInfo, ipV4Data, ipV6Data []driverapi.IPAMData) error { 33 return nil 34 } 35 36 func (m *mockDriver) DeleteNetwork(nid string) error { 37 return nil 38 } 39 40 func (m *mockDriver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo, options map[string]interface{}) error { 41 return nil 42 } 43 44 func (m *mockDriver) DeleteEndpoint(nid, eid string) error { 45 return nil 46 } 47 48 func (m *mockDriver) EndpointOperInfo(nid, eid string) (map[string]interface{}, error) { 49 return nil, nil 50 } 51 52 func (m *mockDriver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo, options map[string]interface{}) error { 53 return nil 54 } 55 56 func (m *mockDriver) Leave(nid, eid string) error { 57 return nil 58 } 59 60 func (m *mockDriver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{}) error { 61 return nil 62 } 63 64 func (m *mockDriver) DiscoverDelete(dType discoverapi.DiscoveryType, data interface{}) error { 65 return nil 66 } 67 68 func (m *mockDriver) Type() string { 69 return mockDriverName 70 } 71 72 func (m *mockDriver) IsBuiltIn() bool { 73 return true 74 } 75 76 func (m *mockDriver) ProgramExternalConnectivity(nid, eid string, options map[string]interface{}) error { 77 return nil 78 } 79 80 func (m *mockDriver) RevokeExternalConnectivity(nid, eid string) error { 81 return nil 82 } 83 84 func (m *mockDriver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) { 85 return nil, nil 86 } 87 88 func (m *mockDriver) NetworkFree(id string) error { 89 return nil 90 } 91 92 func (m *mockDriver) EventNotify(etype driverapi.EventType, nid, tableName, key string, value []byte) { 93 } 94 95 func (m *mockDriver) DecodeTableEntry(tablename string, key string, value []byte) (string, map[string]string) { 96 return "", nil 97 } 98 99 func getNew(t *testing.T) *DrvRegistry { 100 reg, err := New(nil, nil, nil, nil, nil) 101 if err != nil { 102 t.Fatal(err) 103 } 104 105 err = initIPAMDrivers(reg, nil, nil) 106 if err != nil { 107 t.Fatal(err) 108 } 109 return reg 110 } 111 112 func initIPAMDrivers(r *DrvRegistry, lDs, gDs interface{}) error { 113 for _, fn := range [](func(ipamapi.Callback, interface{}, interface{}) error){ 114 builtinIpam.Init, 115 remoteIpam.Init, 116 nullIpam.Init, 117 } { 118 if err := fn(r, lDs, gDs); err != nil { 119 return err 120 } 121 } 122 123 return nil 124 } 125 func TestNew(t *testing.T) { 126 getNew(t) 127 } 128 129 func TestAddDriver(t *testing.T) { 130 reg := getNew(t) 131 132 err := reg.AddDriver(mockDriverName, mockDriverInit, nil) 133 assert.NilError(t, err) 134 } 135 136 func TestAddDuplicateDriver(t *testing.T) { 137 reg := getNew(t) 138 139 err := reg.AddDriver(mockDriverName, mockDriverInit, nil) 140 assert.NilError(t, err) 141 142 // Try adding the same driver 143 err = reg.AddDriver(mockDriverName, mockDriverInit, nil) 144 assert.Check(t, is.ErrorContains(err, "")) 145 } 146 147 func TestIPAMDefaultAddressSpaces(t *testing.T) { 148 reg := getNew(t) 149 150 as1, as2, err := reg.IPAMDefaultAddressSpaces("default") 151 assert.NilError(t, err) 152 assert.Check(t, as1 != "") 153 assert.Check(t, as2 != "") 154 } 155 156 func TestDriver(t *testing.T) { 157 reg := getNew(t) 158 159 err := reg.AddDriver(mockDriverName, mockDriverInit, nil) 160 assert.NilError(t, err) 161 162 d, cap := reg.Driver(mockDriverName) 163 assert.Check(t, d != nil) 164 assert.Check(t, cap != nil) 165 } 166 167 func TestIPAM(t *testing.T) { 168 reg := getNew(t) 169 170 i, cap := reg.IPAM("default") 171 assert.Check(t, i != nil) 172 assert.Check(t, cap != nil) 173 } 174 175 func TestWalkIPAMs(t *testing.T) { 176 reg := getNew(t) 177 178 ipams := make([]string, 0, 2) 179 reg.WalkIPAMs(func(name string, driver ipamapi.Ipam, cap *ipamapi.Capability) bool { 180 ipams = append(ipams, name) 181 return false 182 }) 183 184 sort.Strings(ipams) 185 expected := []string{"default", "null"} 186 if runtime.GOOS == "windows" { 187 expected = append(expected, "windows") 188 } 189 assert.Check(t, is.DeepEqual(ipams, expected)) 190 } 191 192 func TestWalkDrivers(t *testing.T) { 193 reg := getNew(t) 194 195 err := reg.AddDriver(mockDriverName, mockDriverInit, nil) 196 assert.NilError(t, err) 197 198 var driverName string 199 reg.WalkDrivers(func(name string, driver driverapi.Driver, capability driverapi.Capability) bool { 200 driverName = name 201 return false 202 }) 203 204 assert.Check(t, is.Equal(driverName, mockDriverName)) 205 }