1 package disk
2
3 import (
4 "fmt"
5 "os"
6 "testing"
7
8 "github.com/google/go-containerregistry/pkg/name"
9 "github.com/stretchr/testify/assert"
10
11 "edge-infra.dev/pkg/f8n/warehouse/lift"
12 "edge-infra.dev/pkg/f8n/warehouse/oci"
13 "edge-infra.dev/pkg/f8n/warehouse/oci/layout"
14 "edge-infra.dev/pkg/lib/build/bazel"
15 "edge-infra.dev/pkg/lib/uuid"
16 "edge-infra.dev/test/fixtures"
17 )
18
19 var (
20 fixturePath *fixtures.Path
21 shoot oci.Artifact
22 redpanda oci.Artifact
23 )
24
25 func TestMain(m *testing.M) {
26 var err error
27
28 fixturePath, err = fixtures.Layout()
29 if err != nil {
30 panic(err)
31 }
32 shoot, err = fixturePath.Get(name.MustParseReference("shoot:latest"))
33 if err != nil {
34 panic(err)
35 }
36 redpanda, err = fixturePath.Get(name.MustParseReference("redpanda-system:latest"))
37 if err != nil {
38 panic(err)
39 }
40
41 os.Exit(m.Run())
42 }
43
44 func TestNew(t *testing.T) {
45 assert.NotEmpty(t, New(testLayout(t, "new-cache")))
46 }
47
48 func TestCache(t *testing.T) {
49 t.Parallel()
50 var (
51 diskCache = New(testLayout(t, "add"))
52 shootTag = testTag(t, "shoot", uuid.New().Hash())
53 shootDigest = testDigest(t, "shoot", shoot)
54 redpandaDigest = testDigest(t, "redpanda", redpanda)
55 )
56
57 assert.NotEmpty(t, diskCache)
58
59 t.Run("Add", func(t *testing.T) {
60 assert.NoError(t, diskCache.Add(shootTag, shoot))
61 assert.NoError(t, diskCache.Add(redpandaDigest, redpanda))
62 })
63
64 t.Run("Get", func(t *testing.T) {
65 a, err := diskCache.Get(shootTag)
66 assert.NoError(t, err)
67 sameDigest(t, shoot, a)
68
69 a, err = diskCache.Get(shootDigest)
70 assert.NoError(t, err)
71 sameDigest(t, shoot, a)
72
73 a, err = diskCache.Get(redpandaDigest)
74 assert.NoError(t, err)
75 sameDigest(t, redpanda, a)
76 })
77
78 t.Run("Exists", func(t *testing.T) {
79 assert.True(t, diskCache.Exists(shootTag))
80 assert.True(t, diskCache.Exists(redpandaDigest))
81 assert.False(t, diskCache.Exists(name.MustParseReference("ubuntu:latest")))
82 })
83 }
84
85 func TestPurge(t *testing.T) {
86 t.Parallel()
87
88 diskCache := New(testLayout(t, "purge"))
89 assert.NotEmpty(t, diskCache)
90 assert.NoError(t, diskCache.Add(testTag(t, "shoot", uuid.New().Hash()), shoot))
91 assert.NoError(t, diskCache.Add(testTag(t, "redpanda", uuid.New().Hash()), redpanda))
92
93 assert.NoError(t, diskCache.Purge())
94
95 assert.NoError(t, diskCache.Add(testTag(t, "shoot", uuid.New().Hash()), shoot))
96 assert.NoError(t, diskCache.Add(testTag(t, "redpanda", uuid.New().Hash()), redpanda))
97 }
98
99 func testLayout(t *testing.T, id string) *layout.Path {
100 t.Helper()
101 dir, err := bazel.NewTestTmpDir(fmt.Sprintf("edge-infra-disk-cache-%s-", id))
102 assert.NoError(t, err)
103 path, err := layout.New(dir)
104 assert.NoError(t, err)
105 return path
106 }
107
108 func testTag(t *testing.T, n, tag string) name.Reference {
109 t.Helper()
110 ref, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, n, tag))
111 assert.NoError(t, err)
112 return ref
113 }
114
115 func testDigest(t *testing.T, n string, a oci.Artifact) name.Reference {
116 t.Helper()
117 d, err := a.Digest()
118 assert.NoError(t, err)
119 ref, err := name.NewDigest(fmt.Sprintf("%s/%s@%s", lift.LocalRegistryAlias, n, d))
120 assert.NoError(t, err)
121 return ref
122 }
123
124 func sameDigest(t *testing.T, exp, actual oci.Artifact) {
125 ad, err := actual.Digest()
126 assert.NoError(t, err)
127
128 ed, err := exp.Digest()
129 assert.NoError(t, err)
130
131 assert.Equal(t, ed, ad)
132 }
133
View as plain text