@@ -28,6 +28,7 @@ import (
2828
2929 oci "github.com/opencontainers/image-spec/specs-go/v1"
3030 "github.com/stretchr/testify/assert"
31+ "github.com/stretchr/testify/require"
3132)
3233
3334func TestPackageContainer (t * testing.T ) {
@@ -70,13 +71,12 @@ func TestPackageContainer(t *testing.T) {
7071
7172 manifestDigest := "sha256:4f10484d1c1bb13e3956b4de1cd42db8e0f14a75be1617b60f2de3cd59c803c6"
7273 manifestContent := `{"schemaVersion":2,"mediaType":"` + container_module .ContentTypeDockerDistributionManifestV2 + `","config":{"mediaType":"application/vnd.docker.container.image.v1+json","digest":"sha256:4607e093bec406eaadb6f3a340f63400c9d3a7038680744c406903766b938f0d","size":1069},"layers":[{"mediaType":"application/vnd.docker.image.rootfs.diff.tar.gzip","digest":"sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4","size":32}]}`
73- manifestContentType := container_module .ContentTypeDockerDistributionManifestV2
7474
7575 untaggedManifestDigest := "sha256:4305f5f5572b9a426b88909b036e52ee3cf3d7b9c1b01fac840e90747f56623d"
7676 untaggedManifestContent := `{"schemaVersion":2,"mediaType":"` + oci .MediaTypeImageManifest + `","config":{"mediaType":"application/vnd.docker.container.image.v1+json","digest":"sha256:4607e093bec406eaadb6f3a340f63400c9d3a7038680744c406903766b938f0d","size":1069},"layers":[{"mediaType":"application/vnd.docker.image.rootfs.diff.tar.gzip","digest":"sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4","size":32}]}`
7777
78- indexManifestDigest := "sha256:bab112d6efb9e7f221995caaaa880352feb5bd8b1faf52fae8d12c113aa123ec "
79- indexManifestContent := `{"schemaVersion":2,"mediaType":"` + oci .MediaTypeImageIndex + `","manifests":[{"mediaType":"application/vnd.docker.distribution.manifest.v2+json","digest":"` + manifestDigest + `","platform":{"os":"linux","architecture":"arm","variant":"v7"}},{"mediaType":"` + oci .MediaTypeImageManifest + `","digest":"` + untaggedManifestDigest + `","platform":{"os":"linux","architecture":"arm64","variant":"v8"}}]}`
78+ indexManifestDigest := "sha256:2c6b5afb967d5de02795ee1d177c3746d005df4b4c2b829385b0d186b3414b6b "
79+ indexManifestContent := `{"schemaVersion":2,"mediaType":"` + oci .MediaTypeImageIndex + `","is_tagged":true," manifests":[{"mediaType":"application/vnd.docker.distribution.manifest.v2+json","digest":"` + manifestDigest + `","platform":{"os":"linux","architecture":"arm","variant":"v7"}},{"mediaType":"` + oci .MediaTypeImageManifest + `","digest":"` + untaggedManifestDigest + `","platform":{"os":"linux","architecture":"arm64","variant":"v8"}}]}`
8080
8181 anonymousToken := ""
8282 userToken := ""
@@ -467,15 +467,16 @@ func TestPackageContainer(t *testing.T) {
467467 assert .NoError (t , err )
468468 assert .EqualValues (t , 1 , pv .DownloadCount )
469469
470- // Overwrite existing tag should keep the download count
471- req = NewRequestWithBody (t , "PUT" , fmt .Sprintf ("%s/manifests/%s" , url , tag ), strings .NewReader (manifestContent )).
472- AddTokenAuth (userToken ).
473- SetHeader ("Content-Type" , oci .MediaTypeImageManifest )
474- MakeRequest (t , req , http .StatusCreated )
470+ t . Run ( "OverwriteTagKeepDownloadCount" , func ( t * testing. T ) {
471+ req = NewRequestWithBody (t , "PUT" , fmt .Sprintf ("%s/manifests/%s" , url , tag ), strings .NewReader (manifestContent )).
472+ AddTokenAuth (userToken ).
473+ SetHeader ("Content-Type" , oci .MediaTypeImageManifest )
474+ MakeRequest (t , req , http .StatusCreated )
475475
476- pv , err = packages_model .GetVersionByNameAndVersion (t .Context (), user .ID , packages_model .TypeContainer , image , tag )
477- assert .NoError (t , err )
478- assert .EqualValues (t , 1 , pv .DownloadCount )
476+ pv , err = packages_model .GetVersionByNameAndVersion (t .Context (), user .ID , packages_model .TypeContainer , image , tag )
477+ assert .NoError (t , err )
478+ assert .EqualValues (t , 1 , pv .DownloadCount )
479+ })
479480 })
480481
481482 t .Run ("HeadManifest" , func (t * testing.T ) {
@@ -505,7 +506,7 @@ func TestPackageContainer(t *testing.T) {
505506 resp := MakeRequest (t , req , http .StatusOK )
506507
507508 assert .Equal (t , strconv .Itoa (len (manifestContent )), resp .Header ().Get ("Content-Length" ))
508- assert .Equal (t , manifestContentType , resp .Header ().Get ("Content-Type" ))
509+ assert .Equal (t , oci . MediaTypeImageManifest , resp .Header ().Get ("Content-Type" )) // the manifest is overwritten by above OverwriteTagKeepDownloadCount
509510 assert .Equal (t , manifestDigest , resp .Header ().Get ("Docker-Content-Digest" ))
510511 assert .Equal (t , manifestContent , resp .Body .String ())
511512 })
@@ -599,6 +600,17 @@ func TestPackageContainer(t *testing.T) {
599600 assert .True (t , pd .Files [0 ].File .IsLead )
600601 assert .Equal (t , oci .MediaTypeImageIndex , pd .Files [0 ].Properties .GetByName (container_module .PropertyMediaType ))
601602 assert .Equal (t , indexManifestDigest , pd .Files [0 ].Properties .GetByName (container_module .PropertyDigest ))
603+
604+ lastPackageVersionID := pv .ID
605+ t .Run ("UploadAgain" , func (t * testing.T ) {
606+ req := NewRequestWithBody (t , "PUT" , fmt .Sprintf ("%s/manifests/%s" , url , multiTag ), strings .NewReader (indexManifestContent )).
607+ AddTokenAuth (userToken ).
608+ SetHeader ("Content-Type" , oci .MediaTypeImageIndex )
609+ MakeRequest (t , req , http .StatusCreated )
610+ pv , err := packages_model .GetVersionByNameAndVersion (t .Context (), user .ID , packages_model .TypeContainer , image , multiTag )
611+ require .NoError (t , err )
612+ assert .NotEqual (t , lastPackageVersionID , pv .ID )
613+ })
602614 })
603615
604616 t .Run ("HeadBlob" , func (t * testing.T ) {
0 commit comments