Add cache unit test
Test base functionality of the cache statter Signed-off-by: Derek McGowan <derek@mcgstyle.net>master
							parent
							
								
									2d1126ecc1
								
							
						
					
					
						commit
						4c7c63b557
					
				|  | @ -0,0 +1,131 @@ | ||||||
|  | package cache | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"errors" | ||||||
|  | 	"testing" | ||||||
|  | 
 | ||||||
|  | 	"github.com/docker/distribution" | ||||||
|  | 	digest "github.com/opencontainers/go-digest" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func TestCacheSet(t *testing.T) { | ||||||
|  | 	cache := newTestStatter() | ||||||
|  | 	backend := newTestStatter() | ||||||
|  | 	st := NewCachedBlobStatter(cache, backend) | ||||||
|  | 	ctx := context.Background() | ||||||
|  | 
 | ||||||
|  | 	dgst := digest.Digest("dontvalidate") | ||||||
|  | 	_, err := st.Stat(ctx, dgst) | ||||||
|  | 	if err != distribution.ErrBlobUnknown { | ||||||
|  | 		t.Fatalf("Unexpected error %v, expected %v", err, distribution.ErrBlobUnknown) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	desc := distribution.Descriptor{ | ||||||
|  | 		Digest: dgst, | ||||||
|  | 	} | ||||||
|  | 	if err := backend.SetDescriptor(ctx, dgst, desc); err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	actual, err := st.Stat(ctx, dgst) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 	if actual.Digest != desc.Digest { | ||||||
|  | 		t.Fatalf("Unexpected descriptor %v, expected %v", actual, desc) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(cache.sets) != 1 || len(cache.sets[dgst]) == 0 { | ||||||
|  | 		t.Fatalf("Expected cache set") | ||||||
|  | 	} | ||||||
|  | 	if cache.sets[dgst][0].Digest != desc.Digest { | ||||||
|  | 		t.Fatalf("Unexpected descriptor %v, expected %v", cache.sets[dgst][0], desc) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	desc2 := distribution.Descriptor{ | ||||||
|  | 		Digest: digest.Digest("dontvalidate 2"), | ||||||
|  | 	} | ||||||
|  | 	cache.sets[dgst] = append(cache.sets[dgst], desc2) | ||||||
|  | 
 | ||||||
|  | 	actual, err = st.Stat(ctx, dgst) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 	if actual.Digest != desc2.Digest { | ||||||
|  | 		t.Fatalf("Unexpected descriptor %v, expected %v", actual, desc) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestCacheError(t *testing.T) { | ||||||
|  | 	cache := newErrTestStatter(errors.New("cache error")) | ||||||
|  | 	backend := newTestStatter() | ||||||
|  | 	st := NewCachedBlobStatter(cache, backend) | ||||||
|  | 	ctx := context.Background() | ||||||
|  | 
 | ||||||
|  | 	dgst := digest.Digest("dontvalidate") | ||||||
|  | 	_, err := st.Stat(ctx, dgst) | ||||||
|  | 	if err != distribution.ErrBlobUnknown { | ||||||
|  | 		t.Fatalf("Unexpected error %v, expected %v", err, distribution.ErrBlobUnknown) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	desc := distribution.Descriptor{ | ||||||
|  | 		Digest: dgst, | ||||||
|  | 	} | ||||||
|  | 	if err := backend.SetDescriptor(ctx, dgst, desc); err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	actual, err := st.Stat(ctx, dgst) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 	if actual.Digest != desc.Digest { | ||||||
|  | 		t.Fatalf("Unexpected descriptor %v, expected %v", actual, desc) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(cache.sets) > 0 { | ||||||
|  | 		t.Fatalf("Set should not be called after stat error") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func newTestStatter() *testStatter { | ||||||
|  | 	return &testStatter{ | ||||||
|  | 		stats: []digest.Digest{}, | ||||||
|  | 		sets:  map[digest.Digest][]distribution.Descriptor{}, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func newErrTestStatter(err error) *testStatter { | ||||||
|  | 	return &testStatter{ | ||||||
|  | 		sets: map[digest.Digest][]distribution.Descriptor{}, | ||||||
|  | 		err:  err, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type testStatter struct { | ||||||
|  | 	stats []digest.Digest | ||||||
|  | 	sets  map[digest.Digest][]distribution.Descriptor | ||||||
|  | 	err   error | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *testStatter) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { | ||||||
|  | 	if s.err != nil { | ||||||
|  | 		return distribution.Descriptor{}, s.err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if set := s.sets[dgst]; len(set) > 0 { | ||||||
|  | 		return set[len(set)-1], nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return distribution.Descriptor{}, distribution.ErrBlobUnknown | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *testStatter) SetDescriptor(ctx context.Context, dgst digest.Digest, desc distribution.Descriptor) error { | ||||||
|  | 	s.sets[dgst] = append(s.sets[dgst], desc) | ||||||
|  | 	return s.err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *testStatter) Clear(ctx context.Context, dgst digest.Digest) error { | ||||||
|  | 	return s.err | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue