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