1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package cache
16
17 import (
18 "errors"
19 "io"
20 "testing"
21
22 v1 "github.com/google/go-containerregistry/pkg/v1"
23 "github.com/google/go-containerregistry/pkg/v1/mutate"
24 "github.com/google/go-containerregistry/pkg/v1/random"
25 "github.com/google/go-containerregistry/pkg/v1/validate"
26 )
27
28 func TestImage(t *testing.T) {
29 img, err := random.Image(1024, 5)
30 if err != nil {
31 t.Fatalf("random.Image: %v", err)
32 }
33 m := &memcache{map[v1.Hash]v1.Layer{}}
34 img = Image(img, m)
35
36
37 if err := validate.Image(img); err != nil {
38 t.Errorf("Validate: %v", err)
39 }
40 if err := validate.Image(img); err != nil {
41 t.Errorf("Validate: %v", err)
42 }
43 }
44
45 func TestImageIndex(t *testing.T) {
46
47 ii, err := random.Index(1024, 5, 2)
48 if err != nil {
49 t.Fatalf("random.Index: %v", err)
50 }
51 iiChild, err := random.Index(1024, 5, 2)
52 if err != nil {
53 t.Fatalf("random.Index: %v", err)
54 }
55 ii = mutate.AppendManifests(ii, mutate.IndexAddendum{Add: iiChild})
56
57 m := &memcache{map[v1.Hash]v1.Layer{}}
58 ii = ImageIndex(ii, m)
59
60
61 if err := validate.Index(ii); err != nil {
62 t.Errorf("Validate: %v", err)
63 }
64 if err := validate.Index(ii); err != nil {
65 t.Errorf("Validate: %v", err)
66 }
67 }
68
69 func TestLayersLazy(t *testing.T) {
70 img, err := random.Image(1024, 5)
71 if err != nil {
72 t.Fatalf("random.Image: %v", err)
73 }
74 m := &memcache{map[v1.Hash]v1.Layer{}}
75 img = Image(img, m)
76
77 layers, err := img.Layers()
78 if err != nil {
79 t.Fatalf("img.Layers: %v", err)
80 }
81
82
83 if got, want := len(m.m), 0; got != want {
84 t.Errorf("Cache has %d entries, want %d", got, want)
85 }
86
87 rc, err := layers[0].Uncompressed()
88 if err != nil {
89 t.Fatalf("layer.Uncompressed: %v", err)
90 }
91 io.Copy(io.Discard, rc)
92
93 if got, expected := len(m.m), 1; got != expected {
94 t.Errorf("expected %v layers in cache after reading, got %v", expected, got)
95 }
96 }
97
98
99
100 func TestCacheShortCircuit(t *testing.T) {
101 l := &fakeLayer{}
102 m := &memcache{map[v1.Hash]v1.Layer{
103 fakeHash: l,
104 }}
105 img := Image(&fakeImage{}, m)
106
107 for i := 0; i < 10; i++ {
108 if _, err := img.LayerByDigest(fakeHash); err != nil {
109 t.Errorf("LayerByDigest[%d]: %v", i, err)
110 }
111 }
112 }
113
114 var fakeHash = v1.Hash{Algorithm: "fake", Hex: "data"}
115
116 type fakeLayer struct{ v1.Layer }
117 type fakeImage struct{ v1.Image }
118
119 func (f *fakeImage) LayerByDigest(v1.Hash) (v1.Layer, error) {
120 return nil, errors.New("LayerByDigest was called")
121 }
122
123
124
125
126
127
128
129
130 type memcache struct {
131 m map[v1.Hash]v1.Layer
132 }
133
134 func (m *memcache) Put(l v1.Layer) (v1.Layer, error) {
135 digest, err := l.Digest()
136 if err != nil {
137 return nil, err
138 }
139 m.m[digest] = l
140 return l, nil
141 }
142
143 func (m *memcache) Get(h v1.Hash) (v1.Layer, error) {
144 l, found := m.m[h]
145 if !found {
146 return nil, ErrNotFound
147 }
148 return l, nil
149 }
150
151 func (m *memcache) Delete(h v1.Hash) error {
152 delete(m.m, h)
153 return nil
154 }
155
View as plain text