1 package edgeconfigsync
2
3 import (
4 "context"
5 _ "embed"
6 "os"
7 "path/filepath"
8 "testing"
9 "time"
10
11 "github.com/go-logr/logr/testr"
12 "github.com/stretchr/testify/assert"
13 "github.com/stretchr/testify/require"
14 "gopkg.in/yaml.v3"
15 "gotest.tools/v3/fs"
16 ctrl "sigs.k8s.io/controller-runtime"
17
18 "edge-infra.dev/pkg/k8s/runtime/controller/reconcile"
19 )
20
21
22 var edgeRegistriesYAML []byte
23
24 type TestContent struct {
25 Example string `yaml:"example"`
26 }
27
28 func TestMain(m *testing.M) {
29 os.Exit(m.Run())
30 }
31
32 func setupTestCtx(t *testing.T) context.Context {
33 logOptions := testr.Options{
34 LogTimestamp: true,
35 Verbosity: -1,
36 }
37
38 return ctrl.LoggerInto(context.Background(), testr.NewWithOptions(t, logOptions))
39 }
40
41 func TestCompare(t *testing.T) {
42 tests := map[string]struct {
43 oldContent []byte
44 newContent []byte
45 expectChanged bool
46 }{
47 "Changed": {
48 oldContent: []byte("old"),
49 newContent: []byte("new"),
50 expectChanged: true,
51 },
52 "NotChanged": {
53 oldContent: []byte("unchanged"),
54 newContent: []byte("unchanged"),
55 expectChanged: false,
56 },
57 }
58 for name, tc := range tests {
59 t.Run(name, func(t *testing.T) {
60 dir := fs.NewDir(t, DefaultEdgeRegistriesFilepath)
61 defer dir.Remove()
62 dirPath := dir.Path()
63
64 fp := filepath.Join(dirPath, "test")
65
66 err := os.WriteFile(fp, tc.oldContent, 0644)
67 require.NoError(t, err)
68
69 changed, err := compare(fp, tc.newContent)
70 require.NoError(t, err)
71 assert.Equal(t, tc.expectChanged, changed)
72 })
73 }
74 }
75
76 func TestSyncFile(t *testing.T) {
77 dir := fs.NewDir(t, DefaultEdgeRegistriesFilepath)
78 defer dir.Remove()
79 dirPath := dir.Path()
80
81 tests := map[string]struct {
82 f file
83 expectWrite bool
84 }{
85 "Changed": {
86 f: file{
87 path: filepath.Join(dirPath, "changed"),
88 desiredContent: TestContent{Example: "changed"},
89 mode: 0644,
90 },
91 expectWrite: true,
92 },
93 "NotChanged": {
94 f: file{
95 path: filepath.Join(dirPath, "unchanged"),
96 desiredContent: TestContent{Example: "unchanged"},
97 mode: 0644,
98 },
99 expectWrite: false,
100 },
101 }
102 for name, tc := range tests {
103 t.Run(name, func(t *testing.T) {
104 ctx := setupTestCtx(t)
105
106 orig := TestContent{Example: "unchanged"}
107 origYAML, err := yaml.Marshal(&orig)
108 require.NoError(t, err)
109
110 err = os.WriteFile(tc.f.path, origYAML, 0644)
111 require.NoError(t, err)
112
113 fOld, err := os.Open(tc.f.path)
114 require.NoError(t, err)
115 defer fOld.Close()
116
117 oldInfo, err := fOld.Stat()
118 require.NoError(t, err)
119
120 oldModTime := oldInfo.ModTime()
121
122 time.Sleep(10 * time.Millisecond)
123
124 err = syncFile(ctx, tc.f)
125 require.NoError(t, err)
126
127 content, err := os.ReadFile(tc.f.path)
128 require.NoError(t, err)
129
130 fNew, err := os.Open(tc.f.path)
131 require.NoError(t, err)
132 defer fNew.Close()
133
134 newInfo, err := fNew.Stat()
135 require.NoError(t, err)
136
137 newModTime := newInfo.ModTime()
138
139 out := TestContent{}
140 err = yaml.Unmarshal(content, &out)
141 require.NoError(t, err)
142
143 assert.Equal(t, tc.f.desiredContent, out)
144 switch tc.expectWrite {
145 case true:
146 assert.NotEqual(t, oldModTime, newModTime)
147 case false:
148 assert.Equal(t, oldModTime, newModTime)
149 }
150 })
151 }
152 }
153
154 func TestReconcile(t *testing.T) {
155 ctx := setupTestCtx(t)
156
157 dir := fs.NewDir(t, DefaultEdgeRegistriesFilepath)
158 defer dir.Remove()
159 dirPath := dir.Path()
160
161 fp := filepath.Join(dirPath, "test")
162
163 p := Plugin{
164 EdgeRegistriesFilepath: fp,
165 }
166
167 res, err := p.Reconcile(ctx, nil, nil)
168 require.NoError(t, err)
169 require.Equal(t, reconcile.ResultSuccess, res)
170
171 content, err := os.ReadFile(fp)
172 require.NoError(t, err)
173
174 assert.Equal(t, string(edgeRegistriesYAML), string(content))
175 }
176
View as plain text