| package drvregistry | |
| import ( | |
| "runtime" | |
| "sort" | |
| "testing" | |
| "github.com/docker/docker/libnetwork/datastore" | |
| "github.com/docker/docker/libnetwork/driverapi" | |
| "github.com/docker/docker/libnetwork/ipamapi" | |
| builtinIpam "github.com/docker/docker/libnetwork/ipams/builtin" | |
| nullIpam "github.com/docker/docker/libnetwork/ipams/null" | |
| remoteIpam "github.com/docker/docker/libnetwork/ipams/remote" | |
| "gotest.tools/v3/assert" | |
| is "gotest.tools/v3/assert/cmp" | |
| ) | |
| const mockDriverName = "mock-driver" | |
| type mockDriver struct { | |
| driverapi.Driver | |
| } | |
| var mockDriverCaps = driverapi.Capability{DataScope: datastore.LocalScope} | |
| var md = mockDriver{} | |
| func mockDriverInit(reg driverapi.DriverCallback, opt map[string]interface{}) error { | |
| return reg.RegisterDriver(mockDriverName, &md, mockDriverCaps) | |
| } | |
| func (m *mockDriver) Type() string { | |
| return mockDriverName | |
| } | |
| func (m *mockDriver) IsBuiltIn() bool { | |
| return true | |
| } | |
| func getNew(t *testing.T) *DrvRegistry { | |
| reg, err := New(nil, nil, nil, nil, nil) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| err = initIPAMDrivers(reg) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| return reg | |
| } | |
| func initIPAMDrivers(r *DrvRegistry) error { | |
| for _, fn := range [](func(ipamapi.Callback, interface{}, interface{}) error){ | |
| builtinIpam.Init, //nolint:staticcheck | |
| remoteIpam.Init, //nolint:staticcheck | |
| nullIpam.Init, //nolint:staticcheck | |
| } { | |
| if err := fn(r, nil, nil); err != nil { | |
| return err | |
| } | |
| } | |
| return nil | |
| } | |
| func TestNew(t *testing.T) { | |
| getNew(t) | |
| } | |
| func TestAddDriver(t *testing.T) { | |
| reg := getNew(t) | |
| err := reg.AddDriver(mockDriverName, mockDriverInit, nil) | |
| assert.NilError(t, err) | |
| } | |
| func TestAddDuplicateDriver(t *testing.T) { | |
| reg := getNew(t) | |
| err := reg.AddDriver(mockDriverName, mockDriverInit, nil) | |
| assert.NilError(t, err) | |
| // Try adding the same driver | |
| err = reg.AddDriver(mockDriverName, mockDriverInit, nil) | |
| assert.Check(t, is.ErrorContains(err, "")) | |
| } | |
| func TestIPAMDefaultAddressSpaces(t *testing.T) { | |
| reg := getNew(t) | |
| as1, as2, err := reg.IPAMDefaultAddressSpaces("default") | |
| assert.NilError(t, err) | |
| assert.Check(t, as1 != "") | |
| assert.Check(t, as2 != "") | |
| } | |
| func TestDriver(t *testing.T) { | |
| reg := getNew(t) | |
| err := reg.AddDriver(mockDriverName, mockDriverInit, nil) | |
| assert.NilError(t, err) | |
| d, cap := reg.Driver(mockDriverName) | |
| assert.Check(t, d != nil) | |
| assert.Check(t, cap != nil) | |
| } | |
| func TestIPAM(t *testing.T) { | |
| reg := getNew(t) | |
| i, cap := reg.IPAM("default") | |
| assert.Check(t, i != nil) | |
| assert.Check(t, cap != nil) | |
| } | |
| func TestWalkIPAMs(t *testing.T) { | |
| reg := getNew(t) | |
| ipams := make([]string, 0, 2) | |
| reg.WalkIPAMs(func(name string, driver ipamapi.Ipam, cap *ipamapi.Capability) bool { | |
| ipams = append(ipams, name) | |
| return false | |
| }) | |
| sort.Strings(ipams) | |
| expected := []string{"default", "null"} | |
| if runtime.GOOS == "windows" { | |
| expected = append(expected, "windows") | |
| } | |
| assert.Check(t, is.DeepEqual(ipams, expected)) | |
| } | |
| func TestWalkDrivers(t *testing.T) { | |
| reg := getNew(t) | |
| err := reg.AddDriver(mockDriverName, mockDriverInit, nil) | |
| assert.NilError(t, err) | |
| var driverName string | |
| reg.WalkDrivers(func(name string, driver driverapi.Driver, capability driverapi.Capability) bool { | |
| driverName = name | |
| return false | |
| }) | |
| assert.Check(t, is.Equal(driverName, mockDriverName)) | |
| } |