func TestDurationOptSetAndValue(t *testing.T) { var duration DurationOpt assert.NilError(t, duration.Set("300s")) assert.Equal(t, *duration.Value(), time.Duration(300*10e8)) assert.NilError(t, duration.Set("-300s")) assert.Equal(t, *duration.Value(), time.Duration(-300*10e8)) }
// TestUpdateSecretUpdateInPlace tests the ability to update the "target" of an secret with "docker service update" // by combining "--secret-rm" and "--secret-add" for the same secret. func TestUpdateSecretUpdateInPlace(t *testing.T) { apiClient := secretAPIClientMock{ listResult: []swarm.Secret{ { ID: "tn9qiblgnuuut11eufquw5dev", Spec: swarm.SecretSpec{Annotations: swarm.Annotations{Name: "foo"}}, }, }, } flags := newUpdateCommand(nil).Flags() flags.Set("secret-add", "source=foo,target=foo2") flags.Set("secret-rm", "foo") secrets := []*swarm.SecretReference{ { File: &swarm.SecretReferenceFileTarget{ Name: "foo", UID: "0", GID: "0", Mode: 292, }, SecretID: "tn9qiblgnuuut11eufquw5dev", SecretName: "foo", }, } updatedSecrets, err := getUpdatedSecrets(apiClient, flags, secrets) assert.Equal(t, err, nil) assert.Equal(t, len(updatedSecrets), 1) assert.Equal(t, updatedSecrets[0].SecretID, "tn9qiblgnuuut11eufquw5dev") assert.Equal(t, updatedSecrets[0].SecretName, "foo") assert.Equal(t, updatedSecrets[0].File.Name, "foo2") }
// Check the deserialization of the meta stats structure func TestNodeMetastate_FromBytes(t *testing.T) { metastate := NewNodeMetastate(0) // Serialize into bytes array bytes, err := metastate.Bytes() assert.NilError(t, err) if bytes == nil { t.Fatal("Was not able to serialize meta state into byte array.") } // Deserialize back and check, that state still have same // height value state, err := FromBytes(bytes) assert.NilError(t, err) assert.Equal(t, state.Height(), uint64(0)) // Update state to the new height and serialize it again state.Update(17) bytes, err = state.Bytes() assert.NilError(t, err) if bytes == nil { t.Fatal("Was not able to serialize meta state into byte array.") } // Restore state from byte array and validate // that stored height is still the same updatedState, err := FromBytes(bytes) assert.NilError(t, err) assert.Equal(t, updatedState.Height(), uint64(17)) }
func TestIsReadOnly(t *testing.T) { assert.Equal(t, isReadOnly([]string{"foo", "bar", "ro"}), true) assert.Equal(t, isReadOnly([]string{"ro"}), true) assert.Equal(t, isReadOnly([]string{}), false) assert.Equal(t, isReadOnly([]string{"foo", "rw"}), false) assert.Equal(t, isReadOnly([]string{"foo"}), false) }
func TestExternalCAOptionMultiple(t *testing.T) { opt := &ExternalCAOption{} assert.NilError(t, opt.Set("protocol=cfssl,url=https://example.com")) assert.NilError(t, opt.Set("protocol=CFSSL,url=anything")) assert.Equal(t, len(opt.Value()), 2) assert.Equal(t, opt.String(), "cfssl: https://example.com, cfssl: anything") }
func TestQuotedStringSetWithQuotes(t *testing.T) { value := "" qs := NewQuotedString(&value) assert.NilError(t, qs.Set("\"something\"")) assert.Equal(t, qs.String(), "something") assert.Equal(t, value, "something") }
func TestUint64OptString(t *testing.T) { value := uint64(2345678) opt := Uint64Opt{value: &value} assert.Equal(t, opt.String(), "2345678") opt = Uint64Opt{} assert.Equal(t, opt.String(), "none") }
func TestBuildContainerListOptions(t *testing.T) { filters := opts.NewFilterOpt() assert.NilError(t, filters.Set("foo=bar")) assert.NilError(t, filters.Set("baz=foo")) contexts := []struct { psOpts *psOptions expectedAll bool expectedSize bool expectedLimit int expectedFilters map[string]string }{ { psOpts: &psOptions{ all: true, size: true, last: 5, filter: filters, }, expectedAll: true, expectedSize: true, expectedLimit: 5, expectedFilters: map[string]string{ "foo": "bar", "baz": "foo", }, }, { psOpts: &psOptions{ all: true, size: true, last: -1, nLatest: true, }, expectedAll: true, expectedSize: true, expectedLimit: 1, expectedFilters: make(map[string]string), }, } for _, c := range contexts { options, err := buildContainerListOptions(c.psOpts) assert.NilError(t, err) assert.Equal(t, c.expectedAll, options.All) assert.Equal(t, c.expectedSize, options.Size) assert.Equal(t, c.expectedLimit, options.Limit) assert.Equal(t, options.Filter.Len(), len(c.expectedFilters)) for k, v := range c.expectedFilters { f := options.Filter if !f.ExactMatch(k, v) { t.Fatalf("Expected filter with key %s to be %s but got %s", k, v, f.Get(k)) } } } }
func TestLoadDaemonCliConfigWithLogLevel(t *testing.T) { tempFile := tempfile.NewTempFile(t, "config", `{"log-level": "warn"}`) defer tempFile.Remove() opts := defaultOptions(tempFile.Name()) loadedConfig, err := loadDaemonCliConfig(opts) assert.NilError(t, err) assert.NotNil(t, loadedConfig) assert.Equal(t, loadedConfig.LogLevel, "warn") assert.Equal(t, logrus.GetLevel(), logrus.WarnLevel) }
func TestClientDebugEnabled(t *testing.T) { defer debug.Disable() cmd := newDockerCommand(&command.DockerCli{}) cmd.Flags().Set("debug", "true") err := cmd.PersistentPreRunE(cmd, []string{}) assert.NilError(t, err) assert.Equal(t, os.Getenv("DEBUG"), "1") assert.Equal(t, logrus.GetLevel(), logrus.DebugLevel) }
func TestCommonOptionsInstallFlagsWithDefaults(t *testing.T) { flags := pflag.NewFlagSet("testing", pflag.ContinueOnError) opts := NewCommonOptions() opts.InstallFlags(flags) err := flags.Parse([]string{}) assert.NilError(t, err) assert.Equal(t, opts.TLSOptions.CAFile, defaultPath("ca.pem")) assert.Equal(t, opts.TLSOptions.CertFile, defaultPath("cert.pem")) assert.Equal(t, opts.TLSOptions.KeyFile, defaultPath("key.pem")) }
func TestUpdateEnvironmentWithDuplicateKeys(t *testing.T) { // Test case for #25404 flags := newUpdateCommand(nil).Flags() flags.Set("env-add", "A=b") envs := []string{"A=c"} updateEnvironment(flags, &envs) assert.Equal(t, len(envs), 1) assert.Equal(t, envs[0], "A=b") }
func TestUpdateEnvironment(t *testing.T) { flags := newUpdateCommand(nil).Flags() flags.Set("env-add", "toadd=newenv") flags.Set("env-rm", "toremove") envs := []string{"toremove=theenvtoremove", "tokeep=value"} updateEnvironment(flags, &envs) assert.Equal(t, len(envs), 2) assert.Equal(t, envs[0], "tokeep=value") assert.Equal(t, envs[1], "toadd=newenv") }
func TestSecretOptionsSourceTarget(t *testing.T) { var opt SecretOpt testCase := "source=foo,target=testing" assert.NilError(t, opt.Set(testCase)) reqs := opt.Value() assert.Equal(t, len(reqs), 1) req := reqs[0] assert.Equal(t, req.Source, "foo") assert.Equal(t, req.Target, "testing") }
func TestMountOptSetNoError(t *testing.T) { var mount MountOpt assert.NilError(t, mount.Set("type=bind,target=/target,source=/foo")) mounts := mount.Value() assert.Equal(t, len(mounts), 1) assert.Equal(t, mounts[0], swarm.Mount{ Type: swarm.MountType("BIND"), Source: "/foo", Target: "/target", }) }
func TestLoadDaemonConfigWithEmbeddedOptions(t *testing.T) { content := `{"tlscacert": "/etc/certs/ca.pem", "log-driver": "syslog"}` tempFile := tempfile.NewTempFile(t, "config", content) defer tempFile.Remove() opts := defaultOptions(tempFile.Name()) loadedConfig, err := loadDaemonCliConfig(opts) assert.NilError(t, err) assert.NotNil(t, loadedConfig) assert.Equal(t, loadedConfig.CommonTLSOptions.CAFile, "/etc/certs/ca.pem") assert.Equal(t, loadedConfig.LogConfig.Type, "syslog") }
func TestLoadDaemonConfigWithNetwork(t *testing.T) { content := `{"bip": "127.0.0.2", "ip": "127.0.0.1"}` tempFile := tempfile.NewTempFile(t, "config", content) defer tempFile.Remove() opts := defaultOptions(tempFile.Name()) loadedConfig, err := loadDaemonCliConfig(opts) assert.NilError(t, err) assert.NotNil(t, loadedConfig) assert.Equal(t, loadedConfig.IP, "127.0.0.2") assert.Equal(t, loadedConfig.DefaultIP.String(), "127.0.0.1") }
func TestSecretOptionsCustomUidGid(t *testing.T) { var opt SecretOpt testCase := "source=foo,target=testing,uid=1000,gid=1001" assert.NilError(t, opt.Set(testCase)) reqs := opt.Value() assert.Equal(t, len(reqs), 1) req := reqs[0] assert.Equal(t, req.Source, "foo") assert.Equal(t, req.Target, "testing") assert.Equal(t, req.UID, "1000") assert.Equal(t, req.GID, "1001") }
func TestSecretOptionsSimple(t *testing.T) { var opt SecretOpt testCase := "app-secret" assert.NilError(t, opt.Set(testCase)) reqs := opt.Value() assert.Equal(t, len(reqs), 1) req := reqs[0] assert.Equal(t, req.Source, "app-secret") assert.Equal(t, req.Target, "app-secret") assert.Equal(t, req.UID, "0") assert.Equal(t, req.GID, "0") }
func TestUpdatePlacement(t *testing.T) { flags := newUpdateCommand(nil).Flags() flags.Set("constraint-add", "node=toadd") flags.Set("constraint-rm", "node!=toremove") placement := &swarm.Placement{ Constraints: []string{"node!=toremove", "container=tokeep"}, } updatePlacement(flags, placement) assert.Equal(t, len(placement.Constraints), 2) assert.Equal(t, placement.Constraints[0], "container=tokeep") assert.Equal(t, placement.Constraints[1], "node=toadd") }
func TestUpdatePortsDuplicateKeys(t *testing.T) { // Test case for #25375 flags := newUpdateCommand(nil).Flags() flags.Set("publish-add", "80:20") portConfigs := []swarm.PortConfig{ {TargetPort: 80, PublishedPort: 80}, } err := updatePorts(flags, &portConfigs) assert.Equal(t, err, nil) assert.Equal(t, len(portConfigs), 1) assert.Equal(t, portConfigs[0].TargetPort, uint32(20)) }
func TestUpdateLabels(t *testing.T) { flags := newUpdateCommand(nil).Flags() flags.Set("label-add", "toadd=newlabel") flags.Set("label-rm", "toremove") labels := map[string]string{ "toremove": "thelabeltoremove", "tokeep": "value", } updateLabels(flags, &labels) assert.Equal(t, len(labels), 2) assert.Equal(t, labels["tokeep"], "value") assert.Equal(t, labels["toadd"], "newlabel") }
func TestCommonOptionsInstallFlags(t *testing.T) { flags := pflag.NewFlagSet("testing", pflag.ContinueOnError) opts := NewCommonOptions() opts.InstallFlags(flags) err := flags.Parse([]string{ "--tlscacert=\"/foo/cafile\"", "--tlscert=\"/foo/cert\"", "--tlskey=\"/foo/key\"", }) assert.NilError(t, err) assert.Equal(t, opts.TLSOptions.CAFile, "/foo/cafile") assert.Equal(t, opts.TLSOptions.CertFile, "/foo/cert") assert.Equal(t, opts.TLSOptions.KeyFile, "/foo/key") }
func TestUpdateNetworks(t *testing.T) { flags := newUpdateCommand(nil).Flags() flags.Set("network-add", "toadd") flags.Set("network-rm", "toremove") attachments := []swarm.NetworkAttachmentConfig{ {Target: "toremove", Aliases: []string{"foo"}}, {Target: "tokeep"}, } updateNetworks(flags, &attachments) assert.Equal(t, len(attachments), 2) assert.Equal(t, attachments[0].Target, "tokeep") assert.Equal(t, attachments[1].Target, "toadd") }
func TestUpdateMounts(t *testing.T) { flags := newUpdateCommand(nil).Flags() flags.Set("mount-add", "type=volume,target=/toadd") flags.Set("mount-rm", "/toremove") mounts := []mounttypes.Mount{ {Target: "/toremove", Type: mounttypes.TypeBind}, {Target: "/tokeep", Type: mounttypes.TypeBind}, } updateMounts(flags, &mounts) assert.Equal(t, len(mounts), 2) assert.Equal(t, mounts[0].Target, "/tokeep") assert.Equal(t, mounts[1].Target, "/toadd") }
func TestUpdatePorts(t *testing.T) { flags := newUpdateCommand(nil).Flags() flags.Set("publish-add", "1000:1000") flags.Set("publish-rm", "333/udp") portConfigs := []swarm.PortConfig{ {TargetPort: 333, Protocol: swarm.PortConfigProtocolUDP}, {TargetPort: 555}, } updatePorts(flags, &portConfigs) assert.Equal(t, len(portConfigs), 2) assert.Equal(t, portConfigs[0].TargetPort, uint32(555)) assert.Equal(t, portConfigs[1].TargetPort, uint32(1000)) }
func TestExternalCAOption(t *testing.T) { testCases := []struct { externalCA string expected string }{ { externalCA: "protocol=cfssl,url=anything", expected: "cfssl: anything", }, { externalCA: "protocol=CFSSL,url=anything", expected: "cfssl: anything", }, { externalCA: "protocol=Cfssl,url=https://example.com", expected: "cfssl: https://example.com", }, { externalCA: "protocol=Cfssl,url=https://example.com,foo=bar", expected: "cfssl: https://example.com", }, { externalCA: "protocol=Cfssl,url=https://example.com,foo=bar,foo=baz", expected: "cfssl: https://example.com", }, } for _, tc := range testCases { opt := &ExternalCAOption{} assert.NilError(t, opt.Set(tc.externalCA)) assert.Equal(t, opt.String(), tc.expected) } }
func TestUpdateMountsWithDuplicateMounts(t *testing.T) { flags := newUpdateCommand(nil).Flags() flags.Set("mount-add", "type=volume,source=vol4,target=/toadd") mounts := []mounttypes.Mount{ {Target: "/tokeep1", Source: "vol1", Type: mounttypes.TypeBind}, {Target: "/toadd", Source: "vol2", Type: mounttypes.TypeBind}, {Target: "/tokeep2", Source: "vol3", Type: mounttypes.TypeBind}, } updateMounts(flags, &mounts) assert.Equal(t, len(mounts), 3) assert.Equal(t, mounts[0].Target, "/tokeep1") assert.Equal(t, mounts[1].Target, "/tokeep2") assert.Equal(t, mounts[2].Target, "/toadd") }
func TestUpdateGroups(t *testing.T) { flags := newUpdateCommand(nil).Flags() flags.Set("group-add", "wheel") flags.Set("group-add", "docker") flags.Set("group-rm", "root") flags.Set("group-add", "foo") flags.Set("group-rm", "docker") groups := []string{"bar", "root"} updateGroups(flags, &groups) assert.Equal(t, len(groups), 3) assert.Equal(t, groups[0], "bar") assert.Equal(t, groups[1], "foo") assert.Equal(t, groups[2], "wheel") }
func TestSwarmLeave(t *testing.T) { buf := new(bytes.Buffer) cmd := newLeaveCommand( test.NewFakeCli(&fakeClient{}, buf)) assert.NilError(t, cmd.Execute()) assert.Equal(t, strings.TrimSpace(buf.String()), "Node left the swarm.") }