66 "path/filepath"
77 "testing"
88
9- "github.com/opencontainers/go-digest"
9+ digest "github.com/opencontainers/go-digest"
1010 ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
1111 "github.com/stretchr/testify/assert"
1212 "github.com/stretchr/testify/require"
@@ -85,7 +85,7 @@ func TestWriteSingleDescriptor(t *testing.T) {
8585 store := NewStoreIndex (dir )
8686
8787 desc := randDescriptor ("foo" )
88- err := store .Put ("" , desc )
88+ err := store .Put (desc )
8989 require .NoError (t , err )
9090
9191 readDesc , err := store .GetSingle ()
@@ -113,7 +113,7 @@ func TestAddDescriptor(t *testing.T) {
113113
114114 store := NewStoreIndex (dir )
115115 three := randDescriptor ("baz" )
116- err = store .Put ("" , three )
116+ err = store .Put (three )
117117 require .NoError (t , err )
118118
119119 readIdx , err := store .Read ()
@@ -149,7 +149,7 @@ func TestAddDescriptorWithTag(t *testing.T) {
149149
150150 store := NewStoreIndex (dir )
151151 three := randDescriptor ("baz" )
152- err = store .Put ("ver1" , three )
152+ err = store .Put (three , Tag ( "ver1" ) )
153153 require .NoError (t , err )
154154
155155 desc , err := store .Get ("ver1" )
@@ -170,6 +170,101 @@ func TestAddDescriptorWithTag(t *testing.T) {
170170 assert .Equal (t , * desc , readIdx .Manifests [2 ])
171171}
172172
173+ func TestAddMultipleNames (t * testing.T ) {
174+ dir := t .TempDir ()
175+
176+ store := NewStoreIndex (dir )
177+
178+ one := randDescriptor ("foo" )
179+ err := store .Put (one , Name ("app/name:v1" ), Name ("app/name:v1.0" ), Name ("app/other:latest" ))
180+ require .NoError (t , err )
181+
182+ var idx ocispecs.Index
183+ dt , err := os .ReadFile (filepath .Join (dir , "index.json" ))
184+ require .NoError (t , err )
185+
186+ err = json .Unmarshal (dt , & idx )
187+ require .NoError (t , err )
188+
189+ require .Len (t , idx .Manifests , 3 )
190+
191+ require .Equal (t , one .Digest , idx .Manifests [0 ].Digest )
192+ require .Equal (t , one .Size , idx .Manifests [0 ].Size )
193+ require .Equal (t , one .MediaType , idx .Manifests [0 ].MediaType )
194+
195+ require .Equal (t , "v1" , idx .Manifests [0 ].Annotations ["org.opencontainers.image.ref.name" ])
196+ require .Equal (t , "app/name:v1" , idx .Manifests [0 ].Annotations ["io.containerd.image.name" ])
197+
198+ require .Equal (t , one .Digest , idx .Manifests [1 ].Digest )
199+ require .Equal (t , one .Size , idx .Manifests [1 ].Size )
200+ require .Equal (t , one .MediaType , idx .Manifests [1 ].MediaType )
201+
202+ require .Equal (t , "v1.0" , idx .Manifests [1 ].Annotations ["org.opencontainers.image.ref.name" ])
203+ require .Equal (t , "app/name:v1.0" , idx .Manifests [1 ].Annotations ["io.containerd.image.name" ])
204+
205+ require .Equal (t , one .Digest , idx .Manifests [2 ].Digest )
206+ require .Equal (t , one .Size , idx .Manifests [2 ].Size )
207+ require .Equal (t , one .MediaType , idx .Manifests [1 ].MediaType )
208+
209+ require .Equal (t , "latest" , idx .Manifests [2 ].Annotations ["org.opencontainers.image.ref.name" ])
210+ require .Equal (t , "app/other:latest" , idx .Manifests [2 ].Annotations ["io.containerd.image.name" ])
211+
212+ desc , err := store .Get ("app/name:v1" )
213+ require .NoError (t , err )
214+ require .NotNil (t , desc )
215+
216+ require .Equal (t , one .Digest , desc .Digest )
217+ require .Equal (t , one .Size , desc .Size )
218+ require .Equal (t , one .MediaType , desc .MediaType )
219+
220+ require .Equal (t , "v1" , desc .Annotations ["org.opencontainers.image.ref.name" ])
221+ require .Equal (t , "app/name:v1" , desc .Annotations ["io.containerd.image.name" ])
222+ }
223+
224+ func TestReplaceByImageName (t * testing.T ) {
225+ dir := t .TempDir ()
226+
227+ strore := NewStoreIndex (dir )
228+ one := randDescriptor ("foo" )
229+ two := randDescriptor ("bar" )
230+ three := randDescriptor ("baz" )
231+
232+ err := strore .Put (one )
233+ require .NoError (t , err )
234+
235+ err = strore .Put (two , Name ("app/name:v1" ))
236+ require .NoError (t , err )
237+
238+ err = strore .Put (three , Name ("app/name:v2" ))
239+ require .NoError (t , err )
240+
241+ // replace by image name
242+ four := randDescriptor ("qux" )
243+ err = strore .Put (four , Name ("app/name:v1" ))
244+ require .NoError (t , err )
245+
246+ readIdx , err := strore .Read ()
247+ require .NoError (t , err )
248+
249+ assert .Len (t , readIdx .Manifests , 3 )
250+
251+ assert .Equal (t , one , readIdx .Manifests [0 ])
252+
253+ assert .Equal (t , three .Digest , readIdx .Manifests [1 ].Digest )
254+ assert .Equal (t , three .Size , readIdx .Manifests [1 ].Size )
255+ assert .Equal (t , three .MediaType , readIdx .Manifests [1 ].MediaType )
256+
257+ assert .Equal (t , "v2" , readIdx .Manifests [1 ].Annotations ["org.opencontainers.image.ref.name" ])
258+ assert .Equal (t , "app/name:v2" , readIdx .Manifests [1 ].Annotations ["io.containerd.image.name" ])
259+
260+ assert .Equal (t , four .Digest , readIdx .Manifests [2 ].Digest )
261+ assert .Equal (t , four .Size , readIdx .Manifests [2 ].Size )
262+ assert .Equal (t , four .MediaType , readIdx .Manifests [2 ].MediaType )
263+
264+ assert .Equal (t , "v1" , readIdx .Manifests [2 ].Annotations ["org.opencontainers.image.ref.name" ])
265+ assert .Equal (t , "app/name:v1" , readIdx .Manifests [2 ].Annotations ["io.containerd.image.name" ])
266+ }
267+
173268func randDescriptor (seed string ) ocispecs.Descriptor {
174269 dgst := digest .FromBytes ([]byte (seed ))
175270 return ocispecs.Descriptor {
0 commit comments