2018-02-15 11:58:17 -05:00
|
|
|
package container
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/docker/cli/cli/config/configfile"
|
|
|
|
"github.com/docker/cli/internal/test"
|
2019-04-02 11:20:21 -04:00
|
|
|
. "github.com/docker/cli/internal/test/builders" // Import builders to get the builder function as package function
|
2018-02-15 11:58:17 -05:00
|
|
|
"github.com/docker/docker/api/types"
|
2018-06-08 12:24:26 -04:00
|
|
|
"gotest.tools/assert"
|
|
|
|
"gotest.tools/golden"
|
2018-02-15 11:58:17 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestContainerListErrors(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
args []string
|
|
|
|
flags map[string]string
|
|
|
|
containerListFunc func(types.ContainerListOptions) ([]types.Container, error)
|
|
|
|
expectedError string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
flags: map[string]string{
|
|
|
|
"format": "{{invalid}}",
|
|
|
|
},
|
|
|
|
expectedError: `function "invalid" not defined`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
flags: map[string]string{
|
|
|
|
"format": "{{join}}",
|
|
|
|
},
|
|
|
|
expectedError: `wrong number of args for join`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
containerListFunc: func(_ types.ContainerListOptions) ([]types.Container, error) {
|
|
|
|
return nil, fmt.Errorf("error listing containers")
|
|
|
|
},
|
|
|
|
expectedError: "error listing containers",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
|
|
cmd := newListCommand(
|
|
|
|
test.NewFakeCli(&fakeClient{
|
|
|
|
containerListFunc: tc.containerListFunc,
|
|
|
|
}),
|
|
|
|
)
|
|
|
|
cmd.SetArgs(tc.args)
|
|
|
|
for key, value := range tc.flags {
|
|
|
|
cmd.Flags().Set(key, value)
|
|
|
|
}
|
|
|
|
cmd.SetOutput(ioutil.Discard)
|
2018-03-06 14:03:47 -05:00
|
|
|
assert.ErrorContains(t, cmd.Execute(), tc.expectedError)
|
2018-02-15 11:58:17 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestContainerListWithoutFormat(t *testing.T) {
|
|
|
|
cli := test.NewFakeCli(&fakeClient{
|
|
|
|
containerListFunc: func(_ types.ContainerListOptions) ([]types.Container, error) {
|
|
|
|
return []types.Container{
|
|
|
|
*Container("c1"),
|
|
|
|
*Container("c2", WithName("foo")),
|
|
|
|
*Container("c3", WithPort(80, 80, TCP), WithPort(81, 81, TCP), WithPort(82, 82, TCP)),
|
|
|
|
*Container("c4", WithPort(81, 81, UDP)),
|
|
|
|
*Container("c5", WithPort(82, 82, IP("8.8.8.8"), TCP)),
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
})
|
|
|
|
cmd := newListCommand(cli)
|
2018-03-06 15:13:00 -05:00
|
|
|
assert.NilError(t, cmd.Execute())
|
2018-02-15 11:58:17 -05:00
|
|
|
golden.Assert(t, cli.OutBuffer().String(), "container-list-without-format.golden")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestContainerListNoTrunc(t *testing.T) {
|
|
|
|
cli := test.NewFakeCli(&fakeClient{
|
|
|
|
containerListFunc: func(_ types.ContainerListOptions) ([]types.Container, error) {
|
|
|
|
return []types.Container{
|
|
|
|
*Container("c1"),
|
|
|
|
*Container("c2", WithName("foo/bar")),
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
})
|
|
|
|
cmd := newListCommand(cli)
|
|
|
|
cmd.Flags().Set("no-trunc", "true")
|
2018-03-06 15:13:00 -05:00
|
|
|
assert.NilError(t, cmd.Execute())
|
2018-02-15 11:58:17 -05:00
|
|
|
golden.Assert(t, cli.OutBuffer().String(), "container-list-without-format-no-trunc.golden")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test for GitHub issue docker/docker#21772
|
|
|
|
func TestContainerListNamesMultipleTime(t *testing.T) {
|
|
|
|
cli := test.NewFakeCli(&fakeClient{
|
|
|
|
containerListFunc: func(_ types.ContainerListOptions) ([]types.Container, error) {
|
|
|
|
return []types.Container{
|
|
|
|
*Container("c1"),
|
|
|
|
*Container("c2", WithName("foo/bar")),
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
})
|
|
|
|
cmd := newListCommand(cli)
|
|
|
|
cmd.Flags().Set("format", "{{.Names}} {{.Names}}")
|
2018-03-06 15:13:00 -05:00
|
|
|
assert.NilError(t, cmd.Execute())
|
2018-02-15 11:58:17 -05:00
|
|
|
golden.Assert(t, cli.OutBuffer().String(), "container-list-format-name-name.golden")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test for GitHub issue docker/docker#30291
|
|
|
|
func TestContainerListFormatTemplateWithArg(t *testing.T) {
|
|
|
|
cli := test.NewFakeCli(&fakeClient{
|
|
|
|
containerListFunc: func(_ types.ContainerListOptions) ([]types.Container, error) {
|
|
|
|
return []types.Container{
|
|
|
|
*Container("c1", WithLabel("some.label", "value")),
|
|
|
|
*Container("c2", WithName("foo/bar"), WithLabel("foo", "bar")),
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
})
|
|
|
|
cmd := newListCommand(cli)
|
|
|
|
cmd.Flags().Set("format", `{{.Names}} {{.Label "some.label"}}`)
|
2018-03-06 15:13:00 -05:00
|
|
|
assert.NilError(t, cmd.Execute())
|
2018-02-15 11:58:17 -05:00
|
|
|
golden.Assert(t, cli.OutBuffer().String(), "container-list-format-with-arg.golden")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestContainerListFormatSizeSetsOption(t *testing.T) {
|
|
|
|
cli := test.NewFakeCli(&fakeClient{
|
|
|
|
containerListFunc: func(options types.ContainerListOptions) ([]types.Container, error) {
|
2018-03-05 18:53:52 -05:00
|
|
|
assert.Check(t, options.Size)
|
2018-02-15 11:58:17 -05:00
|
|
|
return []types.Container{}, nil
|
|
|
|
},
|
|
|
|
})
|
|
|
|
cmd := newListCommand(cli)
|
|
|
|
cmd.Flags().Set("format", `{{.Size}}`)
|
2018-03-06 15:13:00 -05:00
|
|
|
assert.NilError(t, cmd.Execute())
|
2018-02-15 11:58:17 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestContainerListWithConfigFormat(t *testing.T) {
|
|
|
|
cli := test.NewFakeCli(&fakeClient{
|
|
|
|
containerListFunc: func(_ types.ContainerListOptions) ([]types.Container, error) {
|
|
|
|
return []types.Container{
|
|
|
|
*Container("c1", WithLabel("some.label", "value")),
|
|
|
|
*Container("c2", WithName("foo/bar"), WithLabel("foo", "bar")),
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
})
|
|
|
|
cli.SetConfigFile(&configfile.ConfigFile{
|
|
|
|
PsFormat: "{{ .Names }} {{ .Image }} {{ .Labels }}",
|
|
|
|
})
|
|
|
|
cmd := newListCommand(cli)
|
2018-03-06 15:13:00 -05:00
|
|
|
assert.NilError(t, cmd.Execute())
|
2018-02-15 11:58:17 -05:00
|
|
|
golden.Assert(t, cli.OutBuffer().String(), "container-list-with-config-format.golden")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestContainerListWithFormat(t *testing.T) {
|
|
|
|
cli := test.NewFakeCli(&fakeClient{
|
|
|
|
containerListFunc: func(_ types.ContainerListOptions) ([]types.Container, error) {
|
|
|
|
return []types.Container{
|
|
|
|
*Container("c1", WithLabel("some.label", "value")),
|
|
|
|
*Container("c2", WithName("foo/bar"), WithLabel("foo", "bar")),
|
|
|
|
}, nil
|
|
|
|
},
|
|
|
|
})
|
|
|
|
cmd := newListCommand(cli)
|
|
|
|
cmd.Flags().Set("format", "{{ .Names }} {{ .Image }} {{ .Labels }}")
|
2018-03-06 15:13:00 -05:00
|
|
|
assert.NilError(t, cmd.Execute())
|
2018-02-15 11:58:17 -05:00
|
|
|
golden.Assert(t, cli.OutBuffer().String(), "container-list-with-format.golden")
|
|
|
|
}
|