...

Source file src/github.com/docker/distribution/registry/storage/cache/cachecheck/suite.go

Documentation: github.com/docker/distribution/registry/storage/cache/cachecheck

     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  // CheckBlobDescriptorCache takes a cache implementation through a common set
    14  // of operations. If adding new tests, please add them here so new
    15  // implementations get the benefit. This should be used for unit tests.
    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  	// also check that we set the canonical key ("fake:abc")
    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  	// ensure that global gets extra descriptor mapping
    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  	// get at it through canonical descriptor
   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  	// now, we set the repo local mediatype to something else and ensure it
   118  	// doesn't get changed in the provider cache.
   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" // expect original mediatype in global
   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