1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package remote
17
18 import (
19 "testing"
20
21 "github.com/google/go-containerregistry/pkg/name"
22 v1 "github.com/google/go-containerregistry/pkg/v1"
23 "github.com/google/go-containerregistry/pkg/v1/empty"
24 "github.com/google/go-containerregistry/pkg/v1/mutate"
25 "github.com/google/go-containerregistry/pkg/v1/random"
26 "github.com/google/go-containerregistry/pkg/v1/remote"
27 "github.com/google/go-containerregistry/pkg/v1/types"
28 "github.com/sigstore/cosign/v2/pkg/oci"
29 )
30
31 func TestSignedImageIndex(t *testing.T) {
32 ri := remote.Image
33 rix := remote.Index
34 t.Cleanup(func() {
35 remoteImage = ri
36 remoteIndex = rix
37 })
38 wantLayers := int64(7)
39 wantImages := int64(1)
40
41 l1, err := random.Image(300 , wantLayers)
42 if err != nil {
43 t.Fatalf("random.Index() = %v", err)
44 }
45 l2, err := random.Index(300 , wantLayers, wantImages)
46 if err != nil {
47 t.Fatalf("random.Index() = %v", err)
48 }
49 l3 := mutate.AppendManifests(
50 empty.Index,
51 mutate.IndexAddendum{
52 Add: l2,
53 },
54 mutate.IndexAddendum{
55 Add: l1,
56 },
57 )
58
59 remoteImage = func(_ name.Reference, _ ...remote.Option) (v1.Image, error) {
60
61 return random.Image(300 , wantLayers)
62 }
63 remoteIndex = func(_ name.Reference, _ ...remote.Option) (ii v1.ImageIndex, err error) {
64 return l3, nil
65 }
66
67 ref, err := name.ParseReference("gcr.io/distroless/static:nonroot")
68 if err != nil {
69 t.Fatalf("ParseRef() = %v", err)
70 }
71
72 sii, err := SignedImageIndex(ref)
73 if err != nil {
74 t.Fatalf("Signatures() = %v", err)
75 }
76
77 sigs, err := sii.Signatures()
78 if err != nil {
79 t.Fatalf("Signatures() = %v", err)
80 }
81
82 if sl, err := sigs.Get(); err != nil {
83 t.Errorf("Get() = %v", err)
84 } else if got := int64(len(sl)); got != wantLayers {
85 t.Errorf("len(Get()) = %d, wanted %d", got, wantLayers)
86 }
87
88 imf, err := sii.IndexManifest()
89 if err != nil {
90 t.Fatalf("IndexManifest() = %v", err)
91 }
92
93 for _, desc := range imf.Manifests {
94 var se oci.SignedEntity
95 switch desc.MediaType {
96 case types.OCIImageIndex, types.DockerManifestList:
97 se, err = sii.SignedImageIndex(desc.Digest)
98 if err != nil {
99 t.Fatalf("SignedImage() = %v", err)
100 }
101
102 case types.OCIManifestSchema1, types.DockerManifestSchema2:
103 se, err = sii.SignedImage(desc.Digest)
104 if err != nil {
105 t.Fatalf("SignedImage() = %v", err)
106 }
107 default:
108 t.Fatalf("unknown mime type: %v", desc.MediaType)
109 }
110
111 sigs, err := se.Signatures()
112 if err != nil {
113 t.Fatalf("Signatures() = %v", err)
114 }
115
116 if sl, err := sigs.Get(); err != nil {
117 t.Errorf("Get() = %v", err)
118 } else if got := int64(len(sl)); got != wantLayers {
119 t.Errorf("len(Get()) = %d, wanted %d", got, wantLayers)
120 }
121
122 atts, err := se.Attestations()
123 if err != nil {
124 t.Fatalf("Signatures() = %v", err)
125 }
126
127 if al, err := atts.Get(); err != nil {
128 t.Errorf("Get() = %v", err)
129 } else if got := int64(len(al)); got != wantLayers {
130 t.Errorf("len(Get()) = %d, wanted %d", got, wantLayers)
131 }
132 }
133 }
134
View as plain text