func TestAutoAcceptOptionSetConflict(t *testing.T) { opt := NewAutoAcceptOption() assert.NilError(t, opt.Set("manager")) assert.Error(t, opt.Set("none"), "value NONE is incompatible with MANAGER") opt = NewAutoAcceptOption() assert.NilError(t, opt.Set("none")) assert.Error(t, opt.Set("worker"), "value NONE is incompatible with WORKER") }
func TestAutoAcceptOptionSetConflict(t *testing.T) { opt := NewAutoAcceptOption() assert.Error(t, opt.Set("none,manager"), "value NONE cannot be specified alongside other node types") opt = NewAutoAcceptOption() assert.Error(t, opt.Set("none,worker"), "value NONE cannot be specified alongside other node types") opt = NewAutoAcceptOption() assert.Error(t, opt.Set("worker,none,manager"), "value NONE cannot be specified alongside other node types") opt = NewAutoAcceptOption() assert.Error(t, opt.Set("worker,manager,none"), "value NONE cannot be specified alongside other node types") }
func TestExitStatusForInvalidSubcommandWithHelpFlag(t *testing.T) { discard := ioutil.Discard cmd := newDockerCommand(command.NewDockerCli(os.Stdin, discard, discard)) cmd.SetArgs([]string{"help", "invalid"}) err := cmd.Execute() assert.Error(t, err, "unknown help topic: invalid") }
func TestExternalCAOptionErrors(t *testing.T) { testCases := []struct { externalCA string expectedError string }{ { externalCA: "", expectedError: "EOF", }, { externalCA: "anything", expectedError: "invalid field 'anything' must be a key=value pair", }, { externalCA: "foo=bar", expectedError: "the external-ca option needs a protocol= parameter", }, { externalCA: "protocol=baz", expectedError: "unrecognized external CA protocol baz", }, { externalCA: "protocol=cfssl", expectedError: "the external-ca option needs a url= parameter", }, } for _, tc := range testCases { opt := &ExternalCAOption{} assert.Error(t, opt.Set(tc.externalCA), tc.expectedError) } }
func TestDaemonCommand(t *testing.T) { cmd := newDaemonCommand() cmd.SetArgs([]string{"--help"}) err := cmd.Execute() assert.Error(t, err, "Please run `dockerd`") }
func TestNodeRemoveErrors(t *testing.T) { testCases := []struct { args []string nodeRemoveFunc func() error expectedError string }{ { expectedError: "requires at least 1 argument", }, { args: []string{"nodeID"}, nodeRemoveFunc: func() error { return fmt.Errorf("error removing the node") }, expectedError: "error removing the node", }, } for _, tc := range testCases { buf := new(bytes.Buffer) cmd := newRemoveCommand( test.NewFakeCli(&fakeClient{ nodeRemoveFunc: tc.nodeRemoveFunc, }, buf)) cmd.SetArgs(tc.args) cmd.SetOutput(ioutil.Discard) assert.Error(t, cmd.Execute(), tc.expectedError) } }
func TestSwarmLeaveErrors(t *testing.T) { testCases := []struct { name string args []string swarmLeaveFunc func() error expectedError string }{ { name: "too-many-args", args: []string{"foo"}, expectedError: "accepts no argument(s)", }, { name: "leave-failed", swarmLeaveFunc: func() error { return fmt.Errorf("error leaving the swarm") }, expectedError: "error leaving the swarm", }, } for _, tc := range testCases { buf := new(bytes.Buffer) cmd := newLeaveCommand( test.NewFakeCli(&fakeClient{ swarmLeaveFunc: tc.swarmLeaveFunc, }, buf)) cmd.SetArgs(tc.args) cmd.SetOutput(ioutil.Discard) assert.Error(t, cmd.Execute(), tc.expectedError) } }
func TestConvertHealthcheckDisableWithTest(t *testing.T) { source := &composetypes.HealthCheckConfig{ Disable: true, Test: []string{"EXEC", "touch"}, } _, err := convertHealthcheck(source) assert.Error(t, err, "test and disable can't be set") }
func TestHealthCheckOptionsToHealthConfigConflict(t *testing.T) { opt := healthCheckOptions{ cmd: "curl", noHealthcheck: true, } _, err := opt.toHealthConfig() assert.Error(t, err, "--no-healthcheck conflicts with --health-* options") }
func TestConvertVolumeToMountInvalidFormat(t *testing.T) { namespace := NewNamespace("foo") invalids := []string{"::", "::cc", ":bb:", "aa::", "aa::cc", "aa:bb:", " : : ", " : :cc", " :bb: ", "aa: : ", "aa: :cc", "aa:bb: "} for _, vol := range invalids { _, err := convertVolumeToMount(vol, volumes{}, namespace) assert.Error(t, err, "invalid volume: "+vol) } }
func TestUpdateDNSConfig(t *testing.T) { flags := newUpdateCommand(nil).Flags() // IPv4, with duplicates flags.Set("dns-add", "1.1.1.1") flags.Set("dns-add", "1.1.1.1") flags.Set("dns-add", "2.2.2.2") flags.Set("dns-rm", "3.3.3.3") flags.Set("dns-rm", "2.2.2.2") // IPv6 flags.Set("dns-add", "2001:db8:abc8::1") // Invalid dns record assert.Error(t, flags.Set("dns-add", "x.y.z.w"), "x.y.z.w is not an ip address") // domains with duplicates flags.Set("dns-search-add", "example.com") flags.Set("dns-search-add", "example.com") flags.Set("dns-search-add", "example.org") flags.Set("dns-search-rm", "example.org") // Invalid dns search domain assert.Error(t, flags.Set("dns-search-add", "example$com"), "example$com is not a valid domain") flags.Set("dns-option-add", "ndots:9") flags.Set("dns-option-rm", "timeout:3") config := &swarm.DNSConfig{ Nameservers: []string{"3.3.3.3", "5.5.5.5"}, Search: []string{"localdomain"}, Options: []string{"timeout:3"}, } updateDNSConfig(flags, &config) assert.Equal(t, len(config.Nameservers), 3) assert.Equal(t, config.Nameservers[0], "1.1.1.1") assert.Equal(t, config.Nameservers[1], "2001:db8:abc8::1") assert.Equal(t, config.Nameservers[2], "5.5.5.5") assert.Equal(t, len(config.Search), 2) assert.Equal(t, config.Search[0], "example.com") assert.Equal(t, config.Search[1], "localdomain") assert.Equal(t, len(config.Options), 1) assert.Equal(t, config.Options[0], "ndots:9") }
func TestLoadFileSyntaxError(t *testing.T) { reader := strings.NewReader(`{ "Version": "0.1", "Services": unquoted string }`) _, err := LoadFile(reader) assert.Error(t, err, "syntax error at byte 37: invalid character 'u'") }
func TestNodeUpdateErrors(t *testing.T) { testCases := []struct { args []string flags map[string]string nodeInspectFunc func() (swarm.Node, []byte, error) nodeUpdateFunc func(nodeID string, version swarm.Version, node swarm.NodeSpec) error expectedError string }{ { expectedError: "requires exactly 1 argument", }, { args: []string{"node1", "node2"}, expectedError: "requires exactly 1 argument", }, { args: []string{"nodeID"}, nodeInspectFunc: func() (swarm.Node, []byte, error) { return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node") }, expectedError: "error inspecting the node", }, { args: []string{"nodeID"}, nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { return fmt.Errorf("error updating the node") }, expectedError: "error updating the node", }, { args: []string{"nodeID"}, nodeInspectFunc: func() (swarm.Node, []byte, error) { return *Node(NodeLabels(map[string]string{ "key": "value", })), []byte{}, nil }, flags: map[string]string{ "label-rm": "notpresent", }, expectedError: "key notpresent doesn't exist in node's labels", }, } for _, tc := range testCases { buf := new(bytes.Buffer) cmd := newUpdateCommand( test.NewFakeCli(&fakeClient{ nodeInspectFunc: tc.nodeInspectFunc, nodeUpdateFunc: tc.nodeUpdateFunc, }, buf)) cmd.SetArgs(tc.args) for key, value := range tc.flags { cmd.Flags().Set(key, value) } cmd.SetOutput(ioutil.Discard) assert.Error(t, cmd.Execute(), tc.expectedError) } }
func TestFindConfigurationConflicts(t *testing.T) { config := map[string]interface{}{"authorization-plugins": "foobar"} flags := pflag.NewFlagSet("test", pflag.ContinueOnError) flags.String("authorization-plugins", "", "") assert.NilError(t, flags.Set("authorization-plugins", "asdf")) assert.Error(t, findConfigurationConflicts(config, flags), "authorization-plugins: (from flag: asdf, from file: foobar)") }
func TestContainersPruneError(t *testing.T) { client := &Client{ client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), version: "1.25", } filters := filters.NewArgs() _, err := client.ContainersPrune(context.Background(), filters) assert.Error(t, err, "Error response from daemon: Server error") }
func TestFindConfigurationConflictsWithNamedOptions(t *testing.T) { config := map[string]interface{}{"hosts": []string{"qwer"}} flags := pflag.NewFlagSet("test", pflag.ContinueOnError) var hosts []string flags.VarP(opts.NewNamedListOptsRef("hosts", &hosts, opts.ValidateHost), "host", "H", "Daemon socket(s) to connect to") assert.NilError(t, flags.Set("host", "tcp://127.0.0.1:4444")) assert.NilError(t, flags.Set("host", "unix:///var/run/docker.sock")) assert.Error(t, findConfigurationConflicts(config, flags), "hosts") }
func TestUpdatePortsConflictingFlags(t *testing.T) { // Test case for #25375 flags := newUpdateCommand(nil).Flags() flags.Set("publish-add", "80:80") flags.Set("publish-add", "80:20") portConfigs := []swarm.PortConfig{ {TargetPort: 80, PublishedPort: 80}, } err := updatePorts(flags, &portConfigs) assert.Error(t, err, "conflicting port mapping") }
func TestLoadFileTypeError(t *testing.T) { reader := strings.NewReader(`{ "Version": "0.1", "Services": { "web": { "Image": "redis", "Networks": "none" } } }`) _, err := LoadFile(reader) assert.Error(t, err, "Unexpected type at byte 94. Expected []string but received string") }
func TestLoadDaemonCliConfigWithConflicts(t *testing.T) { tempFile := tempfile.NewTempFile(t, "config", `{"labels": ["l3=foo"]}`) defer tempFile.Remove() configFile := tempFile.Name() opts := defaultOptions(configFile) flags := opts.flags assert.NilError(t, flags.Set(flagDaemonConfigFile, configFile)) assert.NilError(t, flags.Set("label", "l1=bar")) assert.NilError(t, flags.Set("label", "l2=baz")) _, err := loadDaemonCliConfig(opts) assert.Error(t, err, "as a flag and in the configuration file: labels") }
func TestNodePsErrors(t *testing.T) { testCases := []struct { args []string flags map[string]string infoFunc func() (types.Info, error) nodeInspectFunc func() (swarm.Node, []byte, error) taskListFunc func(options types.TaskListOptions) ([]swarm.Task, error) taskInspectFunc func(taskID string) (swarm.Task, []byte, error) expectedError string }{ { infoFunc: func() (types.Info, error) { return types.Info{}, fmt.Errorf("error asking for node info") }, expectedError: "error asking for node info", }, { args: []string{"nodeID"}, nodeInspectFunc: func() (swarm.Node, []byte, error) { return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node") }, expectedError: "error inspecting the node", }, { args: []string{"nodeID"}, taskListFunc: func(options types.TaskListOptions) ([]swarm.Task, error) { return []swarm.Task{}, fmt.Errorf("error returning the task list") }, expectedError: "error returning the task list", }, } for _, tc := range testCases { buf := new(bytes.Buffer) cmd := newPsCommand( test.NewFakeCli(&fakeClient{ infoFunc: tc.infoFunc, nodeInspectFunc: tc.nodeInspectFunc, taskInspectFunc: tc.taskInspectFunc, taskListFunc: tc.taskListFunc, }, buf)) cmd.SetArgs(tc.args) for key, value := range tc.flags { cmd.Flags().Set(key, value) } cmd.SetOutput(ioutil.Discard) assert.Error(t, cmd.Execute(), tc.expectedError) } }
func TestPortOptInvalidComplexSyntax(t *testing.T) { testCases := []struct { value string expectedError string }{ { value: "invalid,target=80", expectedError: "invalid field", }, { value: "invalid=field", expectedError: "invalid field", }, { value: "protocol=invalid", expectedError: "invalid protocol value", }, { value: "target=invalid", expectedError: "invalid syntax", }, { value: "published=invalid", expectedError: "invalid syntax", }, { value: "mode=invalid", expectedError: "invalid publish mode value", }, { value: "published=8080,protocol=tcp,mode=ingress", expectedError: "missing mandatory field", }, { value: `target=80,protocol="tcp,mode=ingress"`, expectedError: "non-quoted-field", }, { value: `target=80,"protocol=tcp,mode=ingress"`, expectedError: "invalid protocol value", }, } for _, tc := range testCases { var port PortOpt assert.Error(t, port.Set(tc.value), tc.expectedError) } }
func TestSwarmJoinErrors(t *testing.T) { testCases := []struct { name string args []string swarmJoinFunc func() error infoFunc func() (types.Info, error) expectedError string }{ { name: "not-enough-args", expectedError: "requires exactly 1 argument", }, { name: "too-many-args", args: []string{"remote1", "remote2"}, expectedError: "requires exactly 1 argument", }, { name: "join-failed", args: []string{"remote"}, swarmJoinFunc: func() error { return fmt.Errorf("error joining the swarm") }, expectedError: "error joining the swarm", }, { name: "join-failed-on-init", args: []string{"remote"}, infoFunc: func() (types.Info, error) { return types.Info{}, fmt.Errorf("error asking for node info") }, expectedError: "error asking for node info", }, } for _, tc := range testCases { buf := new(bytes.Buffer) cmd := newJoinCommand( test.NewFakeCli(&fakeClient{ swarmJoinFunc: tc.swarmJoinFunc, infoFunc: tc.infoFunc, }, buf)) cmd.SetArgs(tc.args) cmd.SetOutput(ioutil.Discard) assert.Error(t, cmd.Execute(), tc.expectedError) } }
func TestUpdateHosts(t *testing.T) { flags := newUpdateCommand(nil).Flags() flags.Set("host-add", "example.net:2.2.2.2") flags.Set("host-add", "ipv6.net:2001:db8:abc8::1") // remove with ipv6 should work flags.Set("host-rm", "example.net:2001:db8:abc8::1") // just hostname should work as well flags.Set("host-rm", "example.net") // bad format error assert.Error(t, flags.Set("host-add", "$example.com$"), "bad format for add-host:") hosts := []string{"1.2.3.4 example.com", "4.3.2.1 example.org", "2001:db8:abc8::1 example.net"} updateHosts(flags, &hosts) assert.Equal(t, len(hosts), 3) assert.Equal(t, hosts[0], "1.2.3.4 example.com") assert.Equal(t, hosts[1], "2001:db8:abc8::1 ipv6.net") assert.Equal(t, hosts[2], "4.3.2.1 example.org") }
// FIXME(vdemeester) port to opts.PortOpt func TestValidatePort(t *testing.T) { validPorts := []string{"80/tcp", "80", "80/udp"} invalidPorts := map[string]string{ "9999999": "out of range", "80:80/tcp": "invalid port format", "53:53/udp": "invalid port format", "80:80": "invalid port format", "80/xyz": "invalid protocol", "tcp": "invalid syntax", "udp": "invalid syntax", "": "invalid protocol", } for _, port := range validPorts { _, err := validatePublishRemove(port) assert.Equal(t, err, nil) } for port, e := range invalidPorts { _, err := validatePublishRemove(port) assert.Error(t, err, e) } }
func TestMountOptVolumeNoCopy(t *testing.T) { var m MountOpt assert.Error(t, m.Set("type=volume,target=/foo,volume-nocopy"), "source is required") m = MountOpt{} assert.NilError(t, m.Set("type=volume,target=/foo,source=foo")) assert.Equal(t, m.values[0].VolumeOptions == nil, true) m = MountOpt{} assert.NilError(t, m.Set("type=volume,target=/foo,source=foo,volume-nocopy=true")) assert.Equal(t, m.values[0].VolumeOptions != nil, true) assert.Equal(t, m.values[0].VolumeOptions.NoCopy, true) m = MountOpt{} assert.NilError(t, m.Set("type=volume,target=/foo,source=foo,volume-nocopy")) assert.Equal(t, m.values[0].VolumeOptions != nil, true) assert.Equal(t, m.values[0].VolumeOptions.NoCopy, true) m = MountOpt{} assert.NilError(t, m.Set("type=volume,target=/foo,source=foo,volume-nocopy=1")) assert.Equal(t, m.values[0].VolumeOptions != nil, true) assert.Equal(t, m.values[0].VolumeOptions.NoCopy, true) }
func TestNodeDemoteErrors(t *testing.T) { testCases := []struct { args []string nodeInspectFunc func() (swarm.Node, []byte, error) nodeUpdateFunc func(nodeID string, version swarm.Version, node swarm.NodeSpec) error expectedError string }{ { expectedError: "requires at least 1 argument", }, { args: []string{"nodeID"}, nodeInspectFunc: func() (swarm.Node, []byte, error) { return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node") }, expectedError: "error inspecting the node", }, { args: []string{"nodeID"}, nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { return fmt.Errorf("error updating the node") }, expectedError: "error updating the node", }, } for _, tc := range testCases { buf := new(bytes.Buffer) cmd := newDemoteCommand( test.NewFakeCli(&fakeClient{ nodeInspectFunc: tc.nodeInspectFunc, nodeUpdateFunc: tc.nodeUpdateFunc, }, buf)) cmd.SetArgs(tc.args) cmd.SetOutput(ioutil.Discard) assert.Error(t, cmd.Execute(), tc.expectedError) } }
func TestNodeListErrorOnAPIFailure(t *testing.T) { testCases := []struct { nodeListFunc func() ([]swarm.Node, error) infoFunc func() (types.Info, error) expectedError string }{ { nodeListFunc: func() ([]swarm.Node, error) { return []swarm.Node{}, fmt.Errorf("error listing nodes") }, expectedError: "error listing nodes", }, { nodeListFunc: func() ([]swarm.Node, error) { return []swarm.Node{ { ID: "nodeID", }, }, nil }, infoFunc: func() (types.Info, error) { return types.Info{}, fmt.Errorf("error asking for node info") }, expectedError: "error asking for node info", }, } for _, tc := range testCases { buf := new(bytes.Buffer) cmd := newListCommand( test.NewFakeCli(&fakeClient{ nodeListFunc: tc.nodeListFunc, infoFunc: tc.infoFunc, }, buf)) cmd.SetOutput(ioutil.Discard) assert.Error(t, cmd.Execute(), tc.expectedError) } }
func TestUpdateHealthcheckTable(t *testing.T) { type test struct { flags [][2]string initial *container.HealthConfig expected *container.HealthConfig err string } testCases := []test{ { flags: [][2]string{{"no-healthcheck", "true"}}, initial: &container.HealthConfig{Test: []string{"CMD-SHELL", "cmd1"}, Retries: 10}, expected: &container.HealthConfig{Test: []string{"NONE"}}, }, { flags: [][2]string{{"health-cmd", "cmd1"}}, initial: &container.HealthConfig{Test: []string{"NONE"}}, expected: &container.HealthConfig{Test: []string{"CMD-SHELL", "cmd1"}}, }, { flags: [][2]string{{"health-retries", "10"}}, initial: &container.HealthConfig{Test: []string{"NONE"}}, expected: &container.HealthConfig{Retries: 10}, }, { flags: [][2]string{{"health-retries", "10"}}, initial: &container.HealthConfig{Test: []string{"CMD", "cmd1"}}, expected: &container.HealthConfig{Test: []string{"CMD", "cmd1"}, Retries: 10}, }, { flags: [][2]string{{"health-interval", "1m"}}, initial: &container.HealthConfig{Test: []string{"CMD", "cmd1"}}, expected: &container.HealthConfig{Test: []string{"CMD", "cmd1"}, Interval: time.Minute}, }, { flags: [][2]string{{"health-cmd", ""}}, initial: &container.HealthConfig{Test: []string{"CMD", "cmd1"}, Retries: 10}, expected: &container.HealthConfig{Retries: 10}, }, { flags: [][2]string{{"health-retries", "0"}}, initial: &container.HealthConfig{Test: []string{"CMD", "cmd1"}, Retries: 10}, expected: &container.HealthConfig{Test: []string{"CMD", "cmd1"}}, }, { flags: [][2]string{{"health-cmd", "cmd1"}, {"no-healthcheck", "true"}}, err: "--no-healthcheck conflicts with --health-* options", }, { flags: [][2]string{{"health-interval", "10m"}, {"no-healthcheck", "true"}}, err: "--no-healthcheck conflicts with --health-* options", }, { flags: [][2]string{{"health-timeout", "1m"}, {"no-healthcheck", "true"}}, err: "--no-healthcheck conflicts with --health-* options", }, } for i, c := range testCases { flags := newUpdateCommand(nil).Flags() for _, flag := range c.flags { flags.Set(flag[0], flag[1]) } cspec := &swarm.ContainerSpec{ Healthcheck: c.initial, } err := updateHealthcheck(flags, cspec) if c.err != "" { assert.Error(t, err, c.err) } else { assert.NilError(t, err) if !reflect.DeepEqual(cspec.Healthcheck, c.expected) { t.Errorf("incorrect result for test %d, expected health config:\n\t%#v\ngot:\n\t%#v", i, c.expected, cspec.Healthcheck) } } } }
func TestContainerContextWrite(t *testing.T) { unixTime := time.Now().AddDate(0, 0, -1).Unix() expectedTime := time.Unix(unixTime, 0).String() cases := []struct { context Context expected string }{ // Errors { Context{Format: "{{InvalidFunction}}"}, `Template parsing error: template: :1: function "InvalidFunction" not defined `, }, { Context{Format: "{{nil}}"}, `Template parsing error: template: :1:2: executing "" at <nil>: nil is not a command `, }, // Table Format { Context{Format: NewContainerFormat("table", false, true)}, `CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE containerID1 ubuntu "" 24 hours ago foobar_baz 0 B containerID2 ubuntu "" 24 hours ago foobar_bar 0 B `, }, { Context{Format: NewContainerFormat("table", false, false)}, `CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES containerID1 ubuntu "" 24 hours ago foobar_baz containerID2 ubuntu "" 24 hours ago foobar_bar `, }, { Context{Format: NewContainerFormat("table {{.Image}}", false, false)}, "IMAGE\nubuntu\nubuntu\n", }, { Context{Format: NewContainerFormat("table {{.Image}}", false, true)}, "IMAGE\nubuntu\nubuntu\n", }, { Context{Format: NewContainerFormat("table {{.Image}}", true, false)}, "IMAGE\nubuntu\nubuntu\n", }, { Context{Format: NewContainerFormat("table", true, false)}, "containerID1\ncontainerID2\n", }, // Raw Format { Context{Format: NewContainerFormat("raw", false, false)}, fmt.Sprintf(`container_id: containerID1 image: ubuntu command: "" created_at: %s status: names: foobar_baz labels: ports: container_id: containerID2 image: ubuntu command: "" created_at: %s status: names: foobar_bar labels: ports: `, expectedTime, expectedTime), }, { Context{Format: NewContainerFormat("raw", false, true)}, fmt.Sprintf(`container_id: containerID1 image: ubuntu command: "" created_at: %s status: names: foobar_baz labels: ports: size: 0 B container_id: containerID2 image: ubuntu command: "" created_at: %s status: names: foobar_bar labels: ports: size: 0 B `, expectedTime, expectedTime), }, { Context{Format: NewContainerFormat("raw", true, false)}, "container_id: containerID1\ncontainer_id: containerID2\n", }, // Custom Format { Context{Format: "{{.Image}}"}, "ubuntu\nubuntu\n", }, { Context{Format: NewContainerFormat("{{.Image}}", false, true)}, "ubuntu\nubuntu\n", }, } for _, testcase := range cases { containers := []types.Container{ {ID: "containerID1", Names: []string{"/foobar_baz"}, Image: "ubuntu", Created: unixTime}, {ID: "containerID2", Names: []string{"/foobar_bar"}, Image: "ubuntu", Created: unixTime}, } out := bytes.NewBufferString("") testcase.context.Output = out err := ContainerWrite(testcase.context, containers) if err != nil { assert.Error(t, err, testcase.expected) } else { assert.Equal(t, out.String(), testcase.expected) } } }
func TestMountOptTypeConflict(t *testing.T) { var m MountOpt assert.Error(t, m.Set("type=bind,target=/foo,source=/foo,volume-nocopy=true"), "cannot mix") assert.Error(t, m.Set("type=volume,target=/foo,source=/foo,bind-propagation=rprivate"), "cannot mix") }