forked from TrueCloudLab/distribution
b1f616cbff
This changeset defines the interface for layer info caches. Layer info caches speed up access to layer meta data accessed in storage driver backends. The two main operations are tests for repository membership and resolving path and size information for backend blobs. Two implementations are available. The main implementation leverages redis to store layer info. An alternative implementation simply caches layer info in maps, which should speed up resolution for less sophisticated implementations. Signed-off-by: Stephen J Day <stephen.day@docker.com>
86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
package cache
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"golang.org/x/net/context"
|
|
)
|
|
|
|
// checkLayerInfoCache takes a cache implementation through a common set of
|
|
// operations. If adding new tests, please add them here so new
|
|
// implementations get the benefit.
|
|
func checkLayerInfoCache(t *testing.T, lic LayerInfoCache) {
|
|
ctx := context.Background()
|
|
|
|
exists, err := lic.Contains(ctx, "", "fake:abc")
|
|
if err == nil {
|
|
t.Fatalf("expected error checking for cache item with empty repo")
|
|
}
|
|
|
|
exists, err = lic.Contains(ctx, "foo/bar", "")
|
|
if err == nil {
|
|
t.Fatalf("expected error checking for cache item with empty digest")
|
|
}
|
|
|
|
exists, err = lic.Contains(ctx, "foo/bar", "fake:abc")
|
|
if err != nil {
|
|
t.Fatalf("unexpected error checking for cache item: %v", err)
|
|
}
|
|
|
|
if exists {
|
|
t.Fatalf("item should not exist")
|
|
}
|
|
|
|
if err := lic.Add(ctx, "", "fake:abc"); err == nil {
|
|
t.Fatalf("expected error adding cache item with empty name")
|
|
}
|
|
|
|
if err := lic.Add(ctx, "foo/bar", ""); err == nil {
|
|
t.Fatalf("expected error adding cache item with empty digest")
|
|
}
|
|
|
|
if err := lic.Add(ctx, "foo/bar", "fake:abc"); err != nil {
|
|
t.Fatalf("unexpected error adding item: %v", err)
|
|
}
|
|
|
|
exists, err = lic.Contains(ctx, "foo/bar", "fake:abc")
|
|
if err != nil {
|
|
t.Fatalf("unexpected error checking for cache item: %v", err)
|
|
}
|
|
|
|
if !exists {
|
|
t.Fatalf("item should exist")
|
|
}
|
|
|
|
_, err = lic.Meta(ctx, "")
|
|
if err == nil || err == ErrNotFound {
|
|
t.Fatalf("expected error getting meta for cache item with empty digest")
|
|
}
|
|
|
|
_, err = lic.Meta(ctx, "fake:abc")
|
|
if err != ErrNotFound {
|
|
t.Fatalf("expected unknown layer error getting meta for cache item with empty digest")
|
|
}
|
|
|
|
if err = lic.SetMeta(ctx, "", LayerMeta{}); err == nil {
|
|
t.Fatalf("expected error setting meta for cache item with empty digest")
|
|
}
|
|
|
|
if err = lic.SetMeta(ctx, "foo/bar", LayerMeta{}); err == nil {
|
|
t.Fatalf("expected error setting meta for cache item with empty meta")
|
|
}
|
|
|
|
expected := LayerMeta{Path: "/foo/bar", Length: 20}
|
|
if err := lic.SetMeta(ctx, "foo/bar", expected); err != nil {
|
|
t.Fatalf("unexpected error setting meta: %v", err)
|
|
}
|
|
|
|
meta, err := lic.Meta(ctx, "foo/bar")
|
|
if err != nil {
|
|
t.Fatalf("unexpected error getting meta: %v", err)
|
|
}
|
|
|
|
if meta != expected {
|
|
t.Fatalf("retrieved meta data did not match: %v", err)
|
|
}
|
|
}
|