github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/manifest/inspect_test.go (about)

     1  package manifest
     2  
     3  import (
     4  	"context"
     5  	"io"
     6  	"testing"
     7  
     8  	"github.com/distribution/reference"
     9  	"github.com/docker/cli/cli/manifest/store"
    10  	"github.com/docker/cli/cli/manifest/types"
    11  	"github.com/docker/cli/internal/test"
    12  	"github.com/docker/distribution"
    13  	"github.com/docker/distribution/manifest/schema2"
    14  	"github.com/opencontainers/go-digest"
    15  	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
    16  	"github.com/pkg/errors"
    17  	"gotest.tools/v3/assert"
    18  	is "gotest.tools/v3/assert/cmp"
    19  	"gotest.tools/v3/golden"
    20  )
    21  
    22  func ref(t *testing.T, name string) reference.Named {
    23  	t.Helper()
    24  	named, err := reference.ParseNamed("example.com/" + name)
    25  	assert.NilError(t, err)
    26  	return named
    27  }
    28  
    29  func fullImageManifest(t *testing.T, ref reference.Named) types.ImageManifest {
    30  	t.Helper()
    31  	man, err := schema2.FromStruct(schema2.Manifest{
    32  		Versioned: schema2.SchemaVersion,
    33  		Config: distribution.Descriptor{
    34  			Digest:    "sha256:7328f6f8b41890597575cbaadc884e7386ae0acc53b747401ebce5cf0d624560",
    35  			Size:      1520,
    36  			MediaType: schema2.MediaTypeImageConfig,
    37  		},
    38  		Layers: []distribution.Descriptor{
    39  			{
    40  				MediaType: schema2.MediaTypeLayer,
    41  				Size:      1990402,
    42  				Digest:    "sha256:88286f41530e93dffd4b964e1db22ce4939fffa4a4c665dab8591fbab03d4926",
    43  			},
    44  		},
    45  	})
    46  	assert.NilError(t, err)
    47  
    48  	// TODO: include image data for verbose inspect
    49  	mt, raw, err := man.Payload()
    50  	assert.NilError(t, err)
    51  
    52  	desc := ocispec.Descriptor{
    53  		Digest:    digest.FromBytes(raw),
    54  		Size:      int64(len(raw)),
    55  		MediaType: mt,
    56  		Platform: &ocispec.Platform{
    57  			Architecture: "amd64",
    58  			OS:           "linux",
    59  		},
    60  	}
    61  
    62  	return types.NewImageManifest(ref, desc, man)
    63  }
    64  
    65  func TestInspectCommandLocalManifestNotFound(t *testing.T) {
    66  	refStore := store.NewStore(t.TempDir())
    67  
    68  	cli := test.NewFakeCli(nil)
    69  	cli.SetManifestStore(refStore)
    70  
    71  	cmd := newInspectCommand(cli)
    72  	cmd.SetOut(io.Discard)
    73  	cmd.SetArgs([]string{"example.com/list:v1", "example.com/alpine:3.0"})
    74  	err := cmd.Execute()
    75  	assert.Error(t, err, "No such manifest: example.com/alpine:3.0")
    76  }
    77  
    78  func TestInspectCommandNotFound(t *testing.T) {
    79  	refStore := store.NewStore(t.TempDir())
    80  
    81  	cli := test.NewFakeCli(nil)
    82  	cli.SetManifestStore(refStore)
    83  	cli.SetRegistryClient(&fakeRegistryClient{
    84  		getManifestFunc: func(_ context.Context, _ reference.Named) (types.ImageManifest, error) {
    85  			return types.ImageManifest{}, errors.New("missing")
    86  		},
    87  		getManifestListFunc: func(ctx context.Context, ref reference.Named) ([]types.ImageManifest, error) {
    88  			return nil, errors.Errorf("No such manifest: %s", ref)
    89  		},
    90  	})
    91  
    92  	cmd := newInspectCommand(cli)
    93  	cmd.SetOut(io.Discard)
    94  	cmd.SetArgs([]string{"example.com/alpine:3.0"})
    95  	err := cmd.Execute()
    96  	assert.Error(t, err, "No such manifest: example.com/alpine:3.0")
    97  }
    98  
    99  func TestInspectCommandLocalManifest(t *testing.T) {
   100  	refStore := store.NewStore(t.TempDir())
   101  
   102  	cli := test.NewFakeCli(nil)
   103  	cli.SetManifestStore(refStore)
   104  	namedRef := ref(t, "alpine:3.0")
   105  	imageManifest := fullImageManifest(t, namedRef)
   106  	err := refStore.Save(ref(t, "list:v1"), namedRef, imageManifest)
   107  	assert.NilError(t, err)
   108  
   109  	cmd := newInspectCommand(cli)
   110  	cmd.SetArgs([]string{"example.com/list:v1", "example.com/alpine:3.0"})
   111  	assert.NilError(t, cmd.Execute())
   112  	actual := cli.OutBuffer()
   113  	expected := golden.Get(t, "inspect-manifest.golden")
   114  	assert.Check(t, is.Equal(string(expected), actual.String()))
   115  }
   116  
   117  func TestInspectcommandRemoteManifest(t *testing.T) {
   118  	refStore := store.NewStore(t.TempDir())
   119  
   120  	cli := test.NewFakeCli(nil)
   121  	cli.SetManifestStore(refStore)
   122  	cli.SetRegistryClient(&fakeRegistryClient{
   123  		getManifestFunc: func(_ context.Context, ref reference.Named) (types.ImageManifest, error) {
   124  			return fullImageManifest(t, ref), nil
   125  		},
   126  	})
   127  
   128  	cmd := newInspectCommand(cli)
   129  	cmd.SetOut(io.Discard)
   130  	cmd.SetArgs([]string{"example.com/alpine:3.0"})
   131  	assert.NilError(t, cmd.Execute())
   132  	actual := cli.OutBuffer()
   133  	expected := golden.Get(t, "inspect-manifest.golden")
   134  	assert.Check(t, is.Equal(string(expected), actual.String()))
   135  }