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 }