1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package remote_test
16
17 import (
18 "fmt"
19 "net/http/httptest"
20 "net/url"
21 "testing"
22
23 "github.com/google/go-cmp/cmp"
24 "github.com/google/go-containerregistry/pkg/name"
25 "github.com/google/go-containerregistry/pkg/registry"
26 v1 "github.com/google/go-containerregistry/pkg/v1"
27 "github.com/google/go-containerregistry/pkg/v1/mutate"
28 "github.com/google/go-containerregistry/pkg/v1/random"
29 "github.com/google/go-containerregistry/pkg/v1/remote"
30 "github.com/google/go-containerregistry/pkg/v1/types"
31 )
32
33 func TestReferrers(t *testing.T) {
34
35
36
37
38
39 for _, leg := range []struct {
40 server *httptest.Server
41 tryFallback bool
42 }{
43 {
44 server: httptest.NewServer(registry.New(registry.WithReferrersSupport(false))),
45 tryFallback: true,
46 },
47 {
48 server: httptest.NewServer(registry.New(registry.WithReferrersSupport(true))),
49 tryFallback: false,
50 },
51 } {
52 s := leg.server
53 defer s.Close()
54 u, err := url.Parse(s.URL)
55 if err != nil {
56 t.Fatal(err)
57 }
58
59 descriptor := func(img v1.Image) v1.Descriptor {
60 d, err := img.Digest()
61 if err != nil {
62 t.Fatal(err)
63 }
64 sz, err := img.Size()
65 if err != nil {
66 t.Fatal(err)
67 }
68 mt, err := img.MediaType()
69 if err != nil {
70 t.Fatal(err)
71 }
72 return v1.Descriptor{
73 Digest: d,
74 Size: sz,
75 MediaType: mt,
76 ArtifactType: "application/testing123",
77 }
78 }
79
80
81
82 rootRef, err := name.ParseReference(fmt.Sprintf("%s/repo:root", u.Host))
83 if err != nil {
84 t.Fatal(err)
85 }
86 rootImg, err := random.Image(10, 10)
87 if err != nil {
88 t.Fatal(err)
89 }
90 rootImg = mutate.ConfigMediaType(rootImg, types.MediaType("application/testing123"))
91 if err := remote.Write(rootRef, rootImg); err != nil {
92 t.Fatal(err)
93 }
94 rootDesc := descriptor(rootImg)
95 t.Logf("root image is %s", rootDesc.Digest)
96
97
98 rootRefDigest := rootRef.Context().Digest(rootDesc.Digest.String())
99 index, err := remote.Referrers(rootRefDigest)
100 if err != nil {
101 t.Fatal(err)
102 }
103 m, err := index.IndexManifest()
104 if err != nil {
105 t.Fatal(err)
106 }
107 if numManifests := len(m.Manifests); numManifests != 0 {
108 t.Fatalf("expected index to contain 0 manifests, but had %d", numManifests)
109 }
110
111
112 leafRef, err := name.ParseReference(fmt.Sprintf("%s/repo:leaf", u.Host))
113 if err != nil {
114 t.Fatal(err)
115 }
116 leafImg, err := random.Image(20, 20)
117 if err != nil {
118 t.Fatal(err)
119 }
120 leafImg = mutate.ConfigMediaType(leafImg, types.MediaType("application/testing123"))
121 leafImg = mutate.Subject(leafImg, rootDesc).(v1.Image)
122 if err := remote.Write(leafRef, leafImg); err != nil {
123 t.Fatal(err)
124 }
125 leafDesc := descriptor(leafImg)
126 t.Logf("leaf image is %s", leafDesc.Digest)
127
128
129 index, err = remote.Referrers(rootRefDigest)
130 if err != nil {
131 t.Fatal(err)
132 }
133 m2, err := index.IndexManifest()
134 if err != nil {
135 t.Fatal(err)
136 }
137 if d := cmp.Diff([]v1.Descriptor{leafDesc}, m2.Manifests); d != "" {
138 t.Logf("m2.Manifests: %v", m2.Manifests)
139 t.Fatalf("referrers diff (-want,+got): %s", d)
140 }
141
142 if leg.tryFallback {
143
144 tag, err := name.ParseReference(fmt.Sprintf("%s/repo:sha256-%s", u.Host, rootDesc.Digest.Hex))
145 if err != nil {
146 t.Fatal(err)
147 }
148 idx, err := remote.Index(tag)
149 if err != nil {
150 t.Fatal(err)
151 }
152 mf, err := idx.IndexManifest()
153 if err != nil {
154 t.Fatal(err)
155 }
156 m2, err := index.IndexManifest()
157 if err != nil {
158 t.Fatal(err)
159 }
160 if d := cmp.Diff(m2.Manifests, mf.Manifests); d != "" {
161 t.Fatalf("fallback tag diff (-want,+got): %s", d)
162 }
163 }
164
165
166
167
168
169 leaf2Ref, err := name.ParseReference(fmt.Sprintf("%s/repo:leaf2", u.Host))
170 if err != nil {
171 t.Fatal(err)
172 }
173 if err := remote.Write(leaf2Ref, leafImg); err != nil {
174 t.Fatal(err)
175 }
176
177 rootRefDigest = rootRef.Context().Digest(rootDesc.Digest.String())
178 index, err = remote.Referrers(rootRefDigest)
179 if err != nil {
180 t.Fatal(err)
181 }
182 m3, err := index.IndexManifest()
183 if err != nil {
184 t.Fatal(err)
185 }
186 if d := cmp.Diff([]v1.Descriptor{leafDesc}, m3.Manifests); d != "" {
187 t.Fatalf("referrers diff after second push (-want,+got): %s", d)
188 }
189
190
191 index, err = remote.Referrers(rootRefDigest,
192 remote.WithFilter("artifactType", "application/testing123"))
193 if err != nil {
194 t.Fatal(err)
195 }
196 m4, err := index.IndexManifest()
197 if err != nil {
198 t.Fatal(err)
199 }
200 if numManifests := len(m4.Manifests); numManifests == 0 {
201 t.Fatal("index contained 0 manifests")
202 }
203
204 index, err = remote.Referrers(rootRefDigest,
205 remote.WithFilter("artifactType", "application/testing123BADDDD"))
206 if err != nil {
207 t.Fatal(err)
208 }
209 m5, err := index.IndexManifest()
210 if err != nil {
211 t.Fatal(err)
212 }
213 if numManifests := len(m5.Manifests); numManifests != 0 {
214 t.Fatalf("expected index to contain 0 manifests, but had %d", numManifests)
215 }
216 }
217 }
218
View as plain text