Skip to content

Commit 1d82cce

Browse files
committed
ociindex: add unit test coverage before changes
Signed-off-by: Tonis Tiigi <[email protected]>
1 parent 147bf0e commit 1d82cce

File tree

1 file changed

+180
-0
lines changed

1 file changed

+180
-0
lines changed

client/ociindex/ociindex_test.go

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
package ociindex
2+
3+
import (
4+
"encoding/json"
5+
"os"
6+
"path/filepath"
7+
"testing"
8+
9+
"github.com/opencontainers/go-digest"
10+
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
13+
)
14+
15+
func TestEmptyDir(t *testing.T) {
16+
dir := t.TempDir()
17+
store := NewStoreIndex(dir)
18+
idx, err := store.Read()
19+
require.Error(t, err)
20+
assert.Nil(t, idx)
21+
assert.ErrorIs(t, err, os.ErrNotExist)
22+
}
23+
24+
func TestReadIndex(t *testing.T) {
25+
dir := t.TempDir()
26+
idx := ocispecs.Index{
27+
Manifests: []ocispecs.Descriptor{
28+
randDescriptor("foo"),
29+
},
30+
}
31+
dt, err := json.Marshal(idx)
32+
require.NoError(t, err)
33+
err = os.WriteFile(filepath.Join(dir, "index.json"), dt, 0644)
34+
require.NoError(t, err)
35+
36+
store := NewStoreIndex(dir)
37+
readIdx, err := store.Read()
38+
require.NoError(t, err)
39+
assert.Len(t, readIdx.Manifests, 1)
40+
41+
assert.Equal(t, idx.Manifests[0], readIdx.Manifests[0])
42+
}
43+
44+
func TestReadByTag(t *testing.T) {
45+
dir := t.TempDir()
46+
47+
one := randDescriptor("foo")
48+
two := randDescriptor("bar")
49+
three := randDescriptor("baz")
50+
51+
const refName = "org.opencontainers.image.ref.name"
52+
53+
two.Annotations = map[string]string{
54+
refName: "ver1",
55+
}
56+
three.Annotations = map[string]string{
57+
refName: "ver2",
58+
}
59+
60+
idx := ocispecs.Index{
61+
Manifests: []ocispecs.Descriptor{
62+
one,
63+
two,
64+
three,
65+
},
66+
}
67+
dt, err := json.Marshal(idx)
68+
require.NoError(t, err)
69+
err = os.WriteFile(filepath.Join(dir, "index.json"), dt, 0644)
70+
require.NoError(t, err)
71+
72+
store := NewStoreIndex(dir)
73+
desc, err := store.Get("ver1")
74+
require.NoError(t, err)
75+
76+
assert.Equal(t, *desc, two)
77+
78+
desc, err = store.Get("ver3")
79+
require.NoError(t, err)
80+
assert.Nil(t, desc)
81+
}
82+
83+
func TestWriteSingleDescriptor(t *testing.T) {
84+
dir := t.TempDir()
85+
store := NewStoreIndex(dir)
86+
87+
desc := randDescriptor("foo")
88+
err := store.Put("", desc)
89+
require.NoError(t, err)
90+
91+
readDesc, err := store.GetSingle()
92+
require.NoError(t, err)
93+
assert.Equal(t, desc, *readDesc)
94+
}
95+
96+
func TestAddDescriptor(t *testing.T) {
97+
dir := t.TempDir()
98+
99+
one := randDescriptor("foo")
100+
two := randDescriptor("bar")
101+
102+
idx := ocispecs.Index{
103+
Manifests: []ocispecs.Descriptor{
104+
one,
105+
two,
106+
},
107+
}
108+
dt, err := json.Marshal(idx)
109+
require.NoError(t, err)
110+
111+
err = os.WriteFile(filepath.Join(dir, "index.json"), dt, 0644)
112+
require.NoError(t, err)
113+
114+
store := NewStoreIndex(dir)
115+
three := randDescriptor("baz")
116+
err = store.Put("", three)
117+
require.NoError(t, err)
118+
119+
readIdx, err := store.Read()
120+
require.NoError(t, err)
121+
122+
assert.Len(t, readIdx.Manifests, 3)
123+
assert.Equal(t, one, readIdx.Manifests[0])
124+
assert.Equal(t, two, readIdx.Manifests[1])
125+
assert.Equal(t, three, readIdx.Manifests[2])
126+
127+
// store.Put also sets defaults for MediaType and SchemaVersion
128+
assert.Equal(t, ocispecs.MediaTypeImageIndex, readIdx.MediaType)
129+
assert.Equal(t, 2, readIdx.SchemaVersion)
130+
}
131+
132+
func TestAddDescriptorWithTag(t *testing.T) {
133+
dir := t.TempDir()
134+
135+
one := randDescriptor("foo")
136+
two := randDescriptor("bar")
137+
138+
idx := ocispecs.Index{
139+
Manifests: []ocispecs.Descriptor{
140+
one,
141+
two,
142+
},
143+
}
144+
dt, err := json.Marshal(idx)
145+
require.NoError(t, err)
146+
147+
err = os.WriteFile(filepath.Join(dir, "index.json"), dt, 0644)
148+
require.NoError(t, err)
149+
150+
store := NewStoreIndex(dir)
151+
three := randDescriptor("baz")
152+
err = store.Put("ver1", three)
153+
require.NoError(t, err)
154+
155+
desc, err := store.Get("ver1")
156+
require.NoError(t, err)
157+
158+
assert.Equal(t, three.Digest, desc.Digest)
159+
assert.Equal(t, three.Size, desc.Size)
160+
assert.Equal(t, three.MediaType, desc.MediaType)
161+
162+
assert.Equal(t, "ver1", desc.Annotations["org.opencontainers.image.ref.name"])
163+
164+
readIdx, err := store.Read()
165+
require.NoError(t, err)
166+
167+
assert.Len(t, readIdx.Manifests, 3)
168+
assert.Equal(t, one, readIdx.Manifests[0])
169+
assert.Equal(t, two, readIdx.Manifests[1])
170+
assert.Equal(t, *desc, readIdx.Manifests[2])
171+
}
172+
173+
func randDescriptor(seed string) ocispecs.Descriptor {
174+
dgst := digest.FromBytes([]byte(seed))
175+
return ocispecs.Descriptor{
176+
MediaType: "application/vnd.test.descriptor+json",
177+
Digest: dgst,
178+
Size: int64(len(seed)),
179+
}
180+
}

0 commit comments

Comments
 (0)