zotregistry.dev/zot@v1.4.4-0.20240314164342-eec277e14d20/pkg/extensions/sync/references/references_internal_test.go (about)

     1  //go:build sync
     2  // +build sync
     3  
     4  package references
     5  
     6  import (
     7  	"context"
     8  	"errors"
     9  	"testing"
    10  
    11  	godigest "github.com/opencontainers/go-digest"
    12  	ispec "github.com/opencontainers/image-spec/specs-go/v1"
    13  	. "github.com/smartystreets/goconvey/convey"
    14  
    15  	zerr "zotregistry.dev/zot/errors"
    16  	client "zotregistry.dev/zot/pkg/extensions/sync/httpclient"
    17  	"zotregistry.dev/zot/pkg/log"
    18  	"zotregistry.dev/zot/pkg/storage"
    19  	"zotregistry.dev/zot/pkg/test/mocks"
    20  )
    21  
    22  var errRef = errors.New("err")
    23  
    24  func TestCosign(t *testing.T) {
    25  	Convey("trigger errors", t, func() {
    26  		cfg := client.Config{
    27  			URL:       "url",
    28  			TLSVerify: false,
    29  		}
    30  
    31  		client, err := client.New(cfg, log.NewLogger("debug", ""))
    32  		So(err, ShouldBeNil)
    33  
    34  		cosign := NewCosignReference(client, storage.StoreController{DefaultStore: mocks.MockedImageStore{
    35  			GetImageManifestFn: func(repo, reference string) ([]byte, godigest.Digest, string, error) {
    36  				return []byte{}, "", "", errRef
    37  			},
    38  		}}, nil, log.NewLogger("debug", ""))
    39  
    40  		ok, err := cosign.canSkipReferences("repo", "tag", nil)
    41  		So(err, ShouldBeNil)
    42  		So(ok, ShouldBeTrue)
    43  
    44  		// trigger GetImageManifest err
    45  		ok, err = cosign.canSkipReferences("repo", "tag", &ispec.Manifest{MediaType: ispec.MediaTypeImageManifest})
    46  		So(err, ShouldNotBeNil)
    47  		So(ok, ShouldBeFalse)
    48  
    49  		cosign = NewCosignReference(client, storage.StoreController{DefaultStore: mocks.MockedImageStore{
    50  			GetImageManifestFn: func(repo, reference string) ([]byte, godigest.Digest, string, error) {
    51  				return []byte{}, "digest", "", nil
    52  			},
    53  		}}, nil, log.NewLogger("debug", ""))
    54  
    55  		// different digest
    56  		ok, err = cosign.canSkipReferences("repo", "tag", &ispec.Manifest{MediaType: ispec.MediaTypeImageManifest})
    57  		So(err, ShouldBeNil)
    58  		So(ok, ShouldBeFalse)
    59  	})
    60  }
    61  
    62  func TestOci(t *testing.T) {
    63  	Convey("trigger errors", t, func() {
    64  		cfg := client.Config{
    65  			URL:       "url",
    66  			TLSVerify: false,
    67  		}
    68  
    69  		client, err := client.New(cfg, log.NewLogger("debug", ""))
    70  		So(err, ShouldBeNil)
    71  
    72  		oci := NewOciReferences(client, storage.StoreController{DefaultStore: mocks.MockedImageStore{
    73  			GetReferrersFn: func(repo string, digest godigest.Digest, artifactTypes []string) (ispec.Index, error) {
    74  				return ispec.Index{}, zerr.ErrManifestNotFound
    75  			},
    76  		}}, nil, log.NewLogger("debug", ""))
    77  
    78  		ok := oci.IsSigned(context.Background(), "repo", "")
    79  		So(ok, ShouldBeFalse)
    80  
    81  		// trigger GetReferrers err
    82  		ok, err = oci.canSkipReferences("repo", "tag", ispec.Index{Manifests: []ispec.Descriptor{{Digest: "digest1"}}})
    83  		So(err, ShouldBeNil)
    84  		So(ok, ShouldBeFalse)
    85  	})
    86  }
    87  
    88  func TestReferrersTag(t *testing.T) {
    89  	Convey("trigger errors", t, func() {
    90  		cfg := client.Config{
    91  			URL:       "url",
    92  			TLSVerify: false,
    93  		}
    94  
    95  		client, err := client.New(cfg, log.NewLogger("debug", ""))
    96  		So(err, ShouldBeNil)
    97  
    98  		referrersTag := NewTagReferences(client, storage.StoreController{DefaultStore: mocks.MockedImageStore{
    99  			GetImageManifestFn: func(repo, reference string) ([]byte, godigest.Digest, string, error) {
   100  				return []byte{}, "", "", errRef
   101  			},
   102  		}}, nil, log.NewLogger("debug", ""))
   103  
   104  		ok := referrersTag.IsSigned(context.Background(), "repo", "")
   105  		So(ok, ShouldBeFalse)
   106  
   107  		// trigger GetImageManifest err
   108  		ok, err = referrersTag.canSkipReferences("repo", "subjectdigest", "digest")
   109  		So(err, ShouldNotBeNil)
   110  		So(ok, ShouldBeFalse)
   111  
   112  		referrersTag = NewTagReferences(client, storage.StoreController{DefaultStore: mocks.MockedImageStore{
   113  			GetImageManifestFn: func(repo, reference string) ([]byte, godigest.Digest, string, error) {
   114  				return []byte{}, "", "", zerr.ErrManifestNotFound
   115  			},
   116  		}}, nil, log.NewLogger("debug", ""))
   117  
   118  		// trigger GetImageManifest err
   119  		ok, err = referrersTag.canSkipReferences("repo", "subjectdigest", "digest")
   120  		So(err, ShouldBeNil)
   121  		So(ok, ShouldBeFalse)
   122  
   123  		referrersTag = NewTagReferences(client, storage.StoreController{DefaultStore: mocks.MockedImageStore{
   124  			GetImageManifestFn: func(repo, reference string) ([]byte, godigest.Digest, string, error) {
   125  				return []byte{}, "digest", "", nil
   126  			},
   127  		}}, nil, log.NewLogger("debug", ""))
   128  
   129  		// different digest
   130  		ok, err = referrersTag.canSkipReferences("repo", "subjectdigest", "newdigest")
   131  		So(err, ShouldBeNil)
   132  		So(ok, ShouldBeFalse)
   133  	})
   134  }
   135  
   136  func TestSyncManifest(t *testing.T) {
   137  	Convey("sync manifest not found err", t, func() {
   138  		cfg := client.Config{
   139  			URL:       "url",
   140  			TLSVerify: false,
   141  		}
   142  
   143  		client, err := client.New(cfg, log.NewLogger("debug", ""))
   144  		So(err, ShouldBeNil)
   145  
   146  		digest := godigest.FromString("test")
   147  
   148  		buf, refDigest, err := syncManifest(context.Background(), client, mocks.MockedImageStore{},
   149  			"repo", "repo", ispec.Descriptor{
   150  				Digest:    digest,
   151  				Size:      10,
   152  				MediaType: ispec.MediaTypeImageManifest,
   153  			}, digest.String(), log.Logger{})
   154  
   155  		So(buf, ShouldBeEmpty)
   156  		So(refDigest, ShouldBeEmpty)
   157  		So(err, ShouldNotBeNil)
   158  	})
   159  }
   160  
   161  func TestCompareManifest(t *testing.T) {
   162  	testCases := []struct {
   163  		manifest1 ispec.Manifest
   164  		manifest2 ispec.Manifest
   165  		expected  bool
   166  	}{
   167  		{
   168  			manifest1: ispec.Manifest{
   169  				Config: ispec.Descriptor{
   170  					Digest: "digest1",
   171  				},
   172  			},
   173  			manifest2: ispec.Manifest{
   174  				Config: ispec.Descriptor{
   175  					Digest: "digest2",
   176  				},
   177  			},
   178  			expected: false,
   179  		},
   180  		{
   181  			manifest1: ispec.Manifest{
   182  				Config: ispec.Descriptor{
   183  					Digest: "digest",
   184  				},
   185  			},
   186  			manifest2: ispec.Manifest{
   187  				Config: ispec.Descriptor{
   188  					Digest: "digest",
   189  				},
   190  			},
   191  			expected: true,
   192  		},
   193  		{
   194  			manifest1: ispec.Manifest{
   195  				Layers: []ispec.Descriptor{{
   196  					Digest: "digest",
   197  					Size:   1,
   198  				}},
   199  			},
   200  			manifest2: ispec.Manifest{
   201  				Layers: []ispec.Descriptor{{
   202  					Digest: "digest",
   203  					Size:   1,
   204  				}},
   205  			},
   206  			expected: true,
   207  		},
   208  		{
   209  			manifest1: ispec.Manifest{
   210  				Layers: []ispec.Descriptor{{
   211  					Digest: "digest1",
   212  					Size:   1,
   213  				}},
   214  			},
   215  			manifest2: ispec.Manifest{
   216  				Layers: []ispec.Descriptor{{
   217  					Digest: "digest2",
   218  					Size:   2,
   219  				}},
   220  			},
   221  			expected: false,
   222  		},
   223  		{
   224  			manifest1: ispec.Manifest{
   225  				Layers: []ispec.Descriptor{
   226  					{
   227  						Digest: "digest",
   228  						Size:   1,
   229  					},
   230  					{
   231  						Digest: "digest1",
   232  						Size:   1,
   233  					},
   234  				},
   235  			},
   236  			manifest2: ispec.Manifest{
   237  				Layers: []ispec.Descriptor{{
   238  					Digest: "digest",
   239  					Size:   1,
   240  				}},
   241  			},
   242  			expected: false,
   243  		},
   244  		{
   245  			manifest1: ispec.Manifest{
   246  				Layers: []ispec.Descriptor{
   247  					{
   248  						Digest: "digest1",
   249  						Size:   1,
   250  					},
   251  					{
   252  						Digest: "digest2",
   253  						Size:   2,
   254  					},
   255  				},
   256  			},
   257  			manifest2: ispec.Manifest{
   258  				Layers: []ispec.Descriptor{
   259  					{
   260  						Digest: "digest1",
   261  						Size:   1,
   262  					},
   263  					{
   264  						Digest: "digest2",
   265  						Size:   2,
   266  					},
   267  				},
   268  			},
   269  			expected: true,
   270  		},
   271  		{
   272  			manifest1: ispec.Manifest{
   273  				Layers: []ispec.Descriptor{
   274  					{
   275  						Digest: "digest",
   276  						Size:   1,
   277  					},
   278  					{
   279  						Digest: "digest1",
   280  						Size:   1,
   281  					},
   282  				},
   283  			},
   284  			manifest2: ispec.Manifest{
   285  				Layers: []ispec.Descriptor{
   286  					{
   287  						Digest: "digest",
   288  						Size:   1,
   289  					},
   290  					{
   291  						Digest: "digest2",
   292  						Size:   2,
   293  					},
   294  				},
   295  			},
   296  			expected: false,
   297  		},
   298  	}
   299  
   300  	Convey("Test manifestsEqual()", t, func() {
   301  		for _, test := range testCases {
   302  			actualResult := manifestsEqual(test.manifest1, test.manifest2)
   303  			So(actualResult, ShouldEqual, test.expected)
   304  		}
   305  	})
   306  }