github.com/npaton/distribution@v2.3.1-rc.0+incompatible/registry/storage/cache/cachecheck/suite.go (about) 1 package cachecheck 2 3 import ( 4 "testing" 5 6 "github.com/docker/distribution" 7 "github.com/docker/distribution/context" 8 "github.com/docker/distribution/digest" 9 "github.com/docker/distribution/registry/storage/cache" 10 ) 11 12 // CheckBlobDescriptorCache takes a cache implementation through a common set 13 // of operations. If adding new tests, please add them here so new 14 // implementations get the benefit. This should be used for unit tests. 15 func CheckBlobDescriptorCache(t *testing.T, provider cache.BlobDescriptorCacheProvider) { 16 ctx := context.Background() 17 18 checkBlobDescriptorCacheEmptyRepository(t, ctx, provider) 19 checkBlobDescriptorCacheSetAndRead(t, ctx, provider) 20 checkBlobDescriptorCacheClear(t, ctx, provider) 21 } 22 23 func checkBlobDescriptorCacheEmptyRepository(t *testing.T, ctx context.Context, provider cache.BlobDescriptorCacheProvider) { 24 if _, err := provider.Stat(ctx, "sha384:abc111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"); err != distribution.ErrBlobUnknown { 25 t.Fatalf("expected unknown blob error with empty store: %v", err) 26 } 27 28 cache, err := provider.RepositoryScoped("") 29 if err == nil { 30 t.Fatalf("expected an error when asking for invalid repo") 31 } 32 33 cache, err = provider.RepositoryScoped("foo/bar") 34 if err != nil { 35 t.Fatalf("unexpected error getting repository: %v", err) 36 } 37 38 if err := cache.SetDescriptor(ctx, "", distribution.Descriptor{ 39 Digest: "sha384:abc", 40 Size: 10, 41 MediaType: "application/octet-stream"}); err != digest.ErrDigestInvalidFormat { 42 t.Fatalf("expected error with invalid digest: %v", err) 43 } 44 45 if err := cache.SetDescriptor(ctx, "sha384:abc111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", distribution.Descriptor{ 46 Digest: "", 47 Size: 10, 48 MediaType: "application/octet-stream"}); err == nil { 49 t.Fatalf("expected error setting value on invalid descriptor") 50 } 51 52 if _, err := cache.Stat(ctx, ""); err != digest.ErrDigestInvalidFormat { 53 t.Fatalf("expected error checking for cache item with empty digest: %v", err) 54 } 55 56 if _, err := cache.Stat(ctx, "sha384:abc111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"); err != distribution.ErrBlobUnknown { 57 t.Fatalf("expected unknown blob error with empty repo: %v", err) 58 } 59 } 60 61 func checkBlobDescriptorCacheSetAndRead(t *testing.T, ctx context.Context, provider cache.BlobDescriptorCacheProvider) { 62 localDigest := digest.Digest("sha384:abc111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111") 63 expected := distribution.Descriptor{ 64 Digest: "sha256:abc1111111111111111111111111111111111111111111111111111111111111", 65 Size: 10, 66 MediaType: "application/octet-stream"} 67 68 cache, err := provider.RepositoryScoped("foo/bar") 69 if err != nil { 70 t.Fatalf("unexpected error getting scoped cache: %v", err) 71 } 72 73 if err := cache.SetDescriptor(ctx, localDigest, expected); err != nil { 74 t.Fatalf("error setting descriptor: %v", err) 75 } 76 77 desc, err := cache.Stat(ctx, localDigest) 78 if err != nil { 79 t.Fatalf("unexpected error statting fake2:abc: %v", err) 80 } 81 82 if expected != desc { 83 t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) 84 } 85 86 // also check that we set the canonical key ("fake:abc") 87 desc, err = cache.Stat(ctx, localDigest) 88 if err != nil { 89 t.Fatalf("descriptor not returned for canonical key: %v", err) 90 } 91 92 if expected != desc { 93 t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) 94 } 95 96 // ensure that global gets extra descriptor mapping 97 desc, err = provider.Stat(ctx, localDigest) 98 if err != nil { 99 t.Fatalf("expected blob unknown in global cache: %v, %v", err, desc) 100 } 101 102 if desc != expected { 103 t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) 104 } 105 106 // get at it through canonical descriptor 107 desc, err = provider.Stat(ctx, expected.Digest) 108 if err != nil { 109 t.Fatalf("unexpected error checking glboal descriptor: %v", err) 110 } 111 112 if desc != expected { 113 t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) 114 } 115 116 // now, we set the repo local mediatype to something else and ensure it 117 // doesn't get changed in the provider cache. 118 expected.MediaType = "application/json" 119 120 if err := cache.SetDescriptor(ctx, localDigest, expected); err != nil { 121 t.Fatalf("unexpected error setting descriptor: %v", err) 122 } 123 124 desc, err = cache.Stat(ctx, localDigest) 125 if err != nil { 126 t.Fatalf("unexpected error getting descriptor: %v", err) 127 } 128 129 if desc != expected { 130 t.Fatalf("unexpected descriptor: %#v != %#v", desc, expected) 131 } 132 133 desc, err = provider.Stat(ctx, localDigest) 134 if err != nil { 135 t.Fatalf("unexpected error getting global descriptor: %v", err) 136 } 137 138 expected.MediaType = "application/octet-stream" // expect original mediatype in global 139 140 if desc != expected { 141 t.Fatalf("unexpected descriptor: %#v != %#v", desc, expected) 142 } 143 } 144 145 func checkBlobDescriptorCacheClear(t *testing.T, ctx context.Context, provider cache.BlobDescriptorCacheProvider) { 146 localDigest := digest.Digest("sha384:def111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111") 147 expected := distribution.Descriptor{ 148 Digest: "sha256:def1111111111111111111111111111111111111111111111111111111111111", 149 Size: 10, 150 MediaType: "application/octet-stream"} 151 152 cache, err := provider.RepositoryScoped("foo/bar") 153 if err != nil { 154 t.Fatalf("unexpected error getting scoped cache: %v", err) 155 } 156 157 if err := cache.SetDescriptor(ctx, localDigest, expected); err != nil { 158 t.Fatalf("error setting descriptor: %v", err) 159 } 160 161 desc, err := cache.Stat(ctx, localDigest) 162 if err != nil { 163 t.Fatalf("unexpected error statting fake2:abc: %v", err) 164 } 165 166 if expected != desc { 167 t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) 168 } 169 170 err = cache.Clear(ctx, localDigest) 171 if err != nil { 172 t.Error(err) 173 } 174 175 desc, err = cache.Stat(ctx, localDigest) 176 if err == nil { 177 t.Fatalf("expected error statting deleted blob: %v", err) 178 } 179 }