github.com/mika/distribution@v2.2.2-0.20160108133430-a75790e3d8e0+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 } 21 22 func checkBlobDescriptorCacheEmptyRepository(t *testing.T, ctx context.Context, provider cache.BlobDescriptorCacheProvider) { 23 if _, err := provider.Stat(ctx, "sha384:abc111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"); err != distribution.ErrBlobUnknown { 24 t.Fatalf("expected unknown blob error with empty store: %v", err) 25 } 26 27 cache, err := provider.RepositoryScoped("") 28 if err == nil { 29 t.Fatalf("expected an error when asking for invalid repo") 30 } 31 32 cache, err = provider.RepositoryScoped("foo/bar") 33 if err != nil { 34 t.Fatalf("unexpected error getting repository: %v", err) 35 } 36 37 if err := cache.SetDescriptor(ctx, "", distribution.Descriptor{ 38 Digest: "sha384:abc", 39 Size: 10, 40 MediaType: "application/octet-stream"}); err != digest.ErrDigestInvalidFormat { 41 t.Fatalf("expected error with invalid digest: %v", err) 42 } 43 44 if err := cache.SetDescriptor(ctx, "sha384:abc111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", distribution.Descriptor{ 45 Digest: "", 46 Size: 10, 47 MediaType: "application/octet-stream"}); err == nil { 48 t.Fatalf("expected error setting value on invalid descriptor") 49 } 50 51 if _, err := cache.Stat(ctx, ""); err != digest.ErrDigestInvalidFormat { 52 t.Fatalf("expected error checking for cache item with empty digest: %v", err) 53 } 54 55 if _, err := cache.Stat(ctx, "sha384:abc111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"); err != distribution.ErrBlobUnknown { 56 t.Fatalf("expected unknown blob error with empty repo: %v", err) 57 } 58 } 59 60 func checkBlobDescriptorCacheSetAndRead(t *testing.T, ctx context.Context, provider cache.BlobDescriptorCacheProvider) { 61 localDigest := digest.Digest("sha384:abc111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111") 62 expected := distribution.Descriptor{ 63 Digest: "sha256:abc1111111111111111111111111111111111111111111111111111111111111", 64 Size: 10, 65 MediaType: "application/octet-stream"} 66 67 cache, err := provider.RepositoryScoped("foo/bar") 68 if err != nil { 69 t.Fatalf("unexpected error getting scoped cache: %v", err) 70 } 71 72 if err := cache.SetDescriptor(ctx, localDigest, expected); err != nil { 73 t.Fatalf("error setting descriptor: %v", err) 74 } 75 76 desc, err := cache.Stat(ctx, localDigest) 77 if err != nil { 78 t.Fatalf("unexpected error statting fake2:abc: %v", err) 79 } 80 81 if expected != desc { 82 t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) 83 } 84 85 // also check that we set the canonical key ("fake:abc") 86 desc, err = cache.Stat(ctx, localDigest) 87 if err != nil { 88 t.Fatalf("descriptor not returned for canonical key: %v", err) 89 } 90 91 if expected != desc { 92 t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) 93 } 94 95 // ensure that global gets extra descriptor mapping 96 desc, err = provider.Stat(ctx, localDigest) 97 if err != nil { 98 t.Fatalf("expected blob unknown in global cache: %v, %v", err, desc) 99 } 100 101 if desc != expected { 102 t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) 103 } 104 105 // get at it through canonical descriptor 106 desc, err = provider.Stat(ctx, expected.Digest) 107 if err != nil { 108 t.Fatalf("unexpected error checking glboal descriptor: %v", err) 109 } 110 111 if desc != expected { 112 t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) 113 } 114 115 // now, we set the repo local mediatype to something else and ensure it 116 // doesn't get changed in the provider cache. 117 expected.MediaType = "application/json" 118 119 if err := cache.SetDescriptor(ctx, localDigest, expected); err != nil { 120 t.Fatalf("unexpected error setting descriptor: %v", err) 121 } 122 123 desc, err = cache.Stat(ctx, localDigest) 124 if err != nil { 125 t.Fatalf("unexpected error getting descriptor: %v", err) 126 } 127 128 if desc != expected { 129 t.Fatalf("unexpected descriptor: %#v != %#v", desc, expected) 130 } 131 132 desc, err = provider.Stat(ctx, localDigest) 133 if err != nil { 134 t.Fatalf("unexpected error getting global descriptor: %v", err) 135 } 136 137 expected.MediaType = "application/octet-stream" // expect original mediatype in global 138 139 if desc != expected { 140 t.Fatalf("unexpected descriptor: %#v != %#v", desc, expected) 141 } 142 } 143 144 func checkBlobDescriptorClear(t *testing.T, ctx context.Context, provider cache.BlobDescriptorCacheProvider) { 145 localDigest := digest.Digest("sha384:abc") 146 expected := distribution.Descriptor{ 147 Digest: "sha256:abc", 148 Size: 10, 149 MediaType: "application/octet-stream"} 150 151 cache, err := provider.RepositoryScoped("foo/bar") 152 if err != nil { 153 t.Fatalf("unexpected error getting scoped cache: %v", err) 154 } 155 156 if err := cache.SetDescriptor(ctx, localDigest, expected); err != nil { 157 t.Fatalf("error setting descriptor: %v", err) 158 } 159 160 desc, err := cache.Stat(ctx, localDigest) 161 if err != nil { 162 t.Fatalf("unexpected error statting fake2:abc: %v", err) 163 } 164 165 if expected != desc { 166 t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) 167 } 168 169 err = cache.Clear(ctx, localDigest) 170 if err != nil { 171 t.Fatalf("unexpected error deleting descriptor") 172 } 173 174 nonExistantDigest := digest.Digest("sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") 175 err = cache.Clear(ctx, nonExistantDigest) 176 if err == nil { 177 t.Fatalf("expected error deleting unknown descriptor") 178 } 179 }