@@ -9,6 +9,11 @@ import (
99 "testing"
1010 "time"
1111
12+ "github.com/distribution/distribution/v3/manifest"
13+ "github.com/distribution/distribution/v3/manifest/manifestlist"
14+ "github.com/distribution/distribution/v3/manifest/ocischema"
15+ "github.com/distribution/distribution/v3/manifest/schema2"
16+
1217 "github.com/distribution/distribution/v3"
1318 "github.com/distribution/distribution/v3/manifest/schema1" //nolint:staticcheck
1419 v1 "github.com/opencontainers/image-spec/specs-go/v1"
@@ -444,7 +449,7 @@ func Test_TagMetadata(t *testing.T) {
444449
445450 })
446451
447- t .Run ("Check for correct error handling when time stamp cannot be parsed " , func (t * testing.T ) {
452+ t .Run ("Check for invalid/valid timestamp and non-match platforms " , func (t * testing.T ) {
448453 ts := "invalid"
449454 meta1 := & schema1.SignedManifest { //nolint:staticcheck
450455 Manifest : schema1.Manifest { //nolint:staticcheck
@@ -461,6 +466,103 @@ func Test_TagMetadata(t *testing.T) {
461466 require .NoError (t , err )
462467 _ , err = client .TagMetadata (meta1 , & options.ManifestOptions {})
463468 require .Error (t , err )
469+
470+ ts = time .Now ().Format (time .RFC3339Nano )
471+ opts := & options.ManifestOptions {}
472+ meta1 .Manifest .History [0 ].V1Compatibility = `{"created":"` + ts + `"}`
473+ tagInfo , _ := client .TagMetadata (meta1 , opts )
474+ assert .Equal (t , ts , tagInfo .CreatedAt .Format (time .RFC3339Nano ))
475+
476+ opts .WithPlatform ("testOS" , "testArch" , "testVariant" )
477+ tagInfo , err = client .TagMetadata (meta1 , opts )
478+ assert .Nil (t , tagInfo )
479+ assert .Nil (t , err )
480+ })
481+ }
482+
483+ func Test_TagMetadata_2 (t * testing.T ) {
484+ t .Run ("ocischema DeserializedManifest invalid digest format" , func (t * testing.T ) {
485+ meta1 := & ocischema.DeserializedManifest {
486+ Manifest : ocischema.Manifest {
487+ Versioned : manifest.Versioned {
488+ SchemaVersion : 1 ,
489+ MediaType : "" ,
490+ },
491+ },
492+ }
493+ ep , err := GetRegistryEndpoint ("" )
494+ require .NoError (t , err )
495+ client , err := NewClient (ep , "" , "" )
496+
497+ require .NoError (t , err )
498+ err = client .NewRepository ("test/test" )
499+ require .NoError (t , err )
500+ _ , err = client .TagMetadata (meta1 , & options.ManifestOptions {})
501+ require .Error (t , err ) // invalid digest format
502+ })
503+ t .Run ("schema2 DeserializedManifest invalid digest format" , func (t * testing.T ) {
504+ meta1 := & schema2.DeserializedManifest {
505+ Manifest : schema2.Manifest {
506+ Versioned : manifest.Versioned {
507+ SchemaVersion : 1 ,
508+ MediaType : "" ,
509+ },
510+ Config : distribution.Descriptor {
511+ MediaType : "" ,
512+ Digest : "sha256:abc" ,
513+ },
514+ },
515+ }
516+ ep , err := GetRegistryEndpoint ("" )
517+ require .NoError (t , err )
518+ client , err := NewClient (ep , "" , "" )
519+
520+ require .NoError (t , err )
521+ err = client .NewRepository ("test/test" )
522+ require .NoError (t , err )
523+ _ , err = client .TagMetadata (meta1 , & options.ManifestOptions {})
524+ require .Error (t , err ) // invalid digest format
525+ })
526+ t .Run ("ocischema DeserializedImageIndex empty index not supported" , func (t * testing.T ) {
527+ meta1 := & ocischema.DeserializedImageIndex {
528+ ImageIndex : ocischema.ImageIndex {
529+ Versioned : manifest.Versioned {
530+ SchemaVersion : 1 ,
531+ MediaType : "" ,
532+ },
533+ Manifests : nil ,
534+ Annotations : nil ,
535+ },
536+ }
537+ ep , err := GetRegistryEndpoint ("" )
538+ require .NoError (t , err )
539+ client , err := NewClient (ep , "" , "" )
540+
541+ require .NoError (t , err )
542+ err = client .NewRepository ("test/test" )
543+ require .NoError (t , err )
544+ _ , err = client .TagMetadata (meta1 , & options.ManifestOptions {})
545+ require .Error (t , err ) // empty index not supported
546+ })
547+ t .Run ("ocischema DeserializedImageIndex empty manifestlist not supported" , func (t * testing.T ) {
548+ meta1 := & manifestlist.DeserializedManifestList {
549+ ManifestList : manifestlist.ManifestList {
550+ Versioned : manifest.Versioned {
551+ SchemaVersion : 1 ,
552+ MediaType : "" ,
553+ },
554+ Manifests : nil ,
555+ },
556+ }
557+ ep , err := GetRegistryEndpoint ("" )
558+ require .NoError (t , err )
559+ client , err := NewClient (ep , "" , "" )
560+
561+ require .NoError (t , err )
562+ err = client .NewRepository ("test/test" )
563+ require .NoError (t , err )
564+ _ , err = client .TagMetadata (meta1 , & options.ManifestOptions {})
565+ require .Error (t , err ) // empty manifestlist not supported
464566 })
465567}
466568
@@ -495,4 +597,13 @@ func TestPing(t *testing.T) {
495597 assert .ErrorContains (t , err , "does not seem to be a valid v2 Docker Registry API" )
496598 })
497599
600+ t .Run ("Empty Registry API" , func (t * testing.T ) {
601+ mockManager := new (mocks.Manager )
602+ ep := & RegistryEndpoint {RegistryAPI : "" }
603+ mockManager .On ("AddResponse" , mock .Anything ).Return (nil )
604+ _ , err := ping (mockManager , ep , "" )
605+ require .Error (t , err )
606+ assert .ErrorContains (t , err , "unsupported protocol scheme" )
607+ })
608+
498609}
0 commit comments