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 }