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  }