github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/container/run_test.go (about) 1 package container 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "io" 8 "testing" 9 10 "github.com/docker/cli/cli" 11 "github.com/docker/cli/internal/test" 12 "github.com/docker/cli/internal/test/notary" 13 "github.com/docker/docker/api/types/container" 14 "github.com/docker/docker/api/types/network" 15 specs "github.com/opencontainers/image-spec/specs-go/v1" 16 "github.com/spf13/pflag" 17 "gotest.tools/v3/assert" 18 is "gotest.tools/v3/assert/cmp" 19 ) 20 21 func TestRunLabel(t *testing.T) { 22 fakeCLI := test.NewFakeCli(&fakeClient{ 23 createContainerFunc: func(_ *container.Config, _ *container.HostConfig, _ *network.NetworkingConfig, _ *specs.Platform, _ string) (container.CreateResponse, error) { 24 return container.CreateResponse{ 25 ID: "id", 26 }, nil 27 }, 28 Version: "1.36", 29 }) 30 cmd := NewRunCommand(fakeCLI) 31 cmd.SetArgs([]string{"--detach=true", "--label", "foo", "busybox"}) 32 assert.NilError(t, cmd.Execute()) 33 } 34 35 func TestRunCommandWithContentTrustErrors(t *testing.T) { 36 testCases := []struct { 37 name string 38 args []string 39 expectedError string 40 notaryFunc test.NotaryClientFuncType 41 }{ 42 { 43 name: "offline-notary-server", 44 notaryFunc: notary.GetOfflineNotaryRepository, 45 expectedError: "client is offline", 46 args: []string{"image:tag"}, 47 }, 48 { 49 name: "uninitialized-notary-server", 50 notaryFunc: notary.GetUninitializedNotaryRepository, 51 expectedError: "remote trust data does not exist", 52 args: []string{"image:tag"}, 53 }, 54 { 55 name: "empty-notary-server", 56 notaryFunc: notary.GetEmptyTargetsNotaryRepository, 57 expectedError: "No valid trust data for tag", 58 args: []string{"image:tag"}, 59 }, 60 } 61 for _, tc := range testCases { 62 fakeCLI := test.NewFakeCli(&fakeClient{ 63 createContainerFunc: func(config *container.Config, 64 hostConfig *container.HostConfig, 65 networkingConfig *network.NetworkingConfig, 66 platform *specs.Platform, 67 containerName string, 68 ) (container.CreateResponse, error) { 69 return container.CreateResponse{}, fmt.Errorf("shouldn't try to pull image") 70 }, 71 }, test.EnableContentTrust) 72 fakeCLI.SetNotaryClient(tc.notaryFunc) 73 cmd := NewRunCommand(fakeCLI) 74 cmd.SetArgs(tc.args) 75 cmd.SetOut(io.Discard) 76 err := cmd.Execute() 77 assert.Assert(t, err != nil) 78 assert.Assert(t, is.Contains(fakeCLI.ErrBuffer().String(), tc.expectedError)) 79 } 80 } 81 82 func TestRunContainerImagePullPolicyInvalid(t *testing.T) { 83 cases := []struct { 84 PullPolicy string 85 ExpectedErrMsg string 86 }{ 87 { 88 PullPolicy: "busybox:latest", 89 ExpectedErrMsg: `invalid pull option: 'busybox:latest': must be one of "always", "missing" or "never"`, 90 }, 91 { 92 PullPolicy: "--network=foo", 93 ExpectedErrMsg: `invalid pull option: '--network=foo': must be one of "always", "missing" or "never"`, 94 }, 95 } 96 for _, tc := range cases { 97 tc := tc 98 t.Run(tc.PullPolicy, func(t *testing.T) { 99 dockerCli := test.NewFakeCli(&fakeClient{}) 100 err := runRun( 101 context.TODO(), 102 dockerCli, 103 &pflag.FlagSet{}, 104 &runOptions{createOptions: createOptions{pull: tc.PullPolicy}}, 105 &containerOptions{}, 106 ) 107 108 statusErr := cli.StatusError{} 109 assert.Check(t, errors.As(err, &statusErr)) 110 assert.Equal(t, statusErr.StatusCode, 125) 111 assert.Check(t, is.Contains(dockerCli.ErrBuffer().String(), tc.ExpectedErrMsg)) 112 }) 113 } 114 }