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  }