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  }