1 package server
2
3 import (
4 "context"
5 _ "embed"
6 "os"
7 "testing"
8
9 "github.com/go-logr/logr/testr"
10 "github.com/golang/mock/gomock"
11 "github.com/spf13/afero"
12 "github.com/stretchr/testify/assert"
13 "github.com/stretchr/testify/require"
14 corev1 "k8s.io/api/core/v1"
15 ctrl "sigs.k8s.io/controller-runtime"
16
17 "edge-infra.dev/pkg/sds/lib/containerd"
18 containerdMocks "edge-infra.dev/pkg/sds/lib/containerd/mocks"
19 "edge-infra.dev/pkg/sds/lib/dbus/systemd"
20 systemdMocks "edge-infra.dev/pkg/sds/lib/dbus/systemd/mocks"
21 "edge-infra.dev/pkg/sds/lib/k8s/manifest"
22 )
23
24 var (
25 etcdFilepath = "/etc/kubernetes/manifests/etcd.yaml"
26
27 withFNC []byte
28
29 withoutFNC []byte
30 )
31
32 func TestMain(m *testing.M) {
33 os.Exit(m.Run())
34 }
35
36 func setupTestCtx(t *testing.T) context.Context {
37 logOptions := testr.Options{
38 LogTimestamp: true,
39 Verbosity: -1,
40 }
41
42 return ctrl.LoggerInto(context.Background(), testr.NewWithOptions(t, logOptions))
43 }
44
45 func TestNewClusterMode(t *testing.T) {
46 mockCtrl := gomock.NewController(t)
47
48 tests := map[string]struct {
49 startingContent []byte
50 expectedContent []byte
51 fn func(context.Context, *manifest.Manifest, systemd.Restarter, containerd.Terminator) error
52 }{
53 "Enter": {
54 startingContent: withoutFNC,
55 expectedContent: withFNC,
56 fn: EnterNewClusterMode,
57 },
58 "AlreadyEntered": {
59 startingContent: withFNC,
60 expectedContent: withFNC,
61 fn: EnterNewClusterMode,
62 },
63 "Exit": {
64 startingContent: withFNC,
65 expectedContent: withoutFNC,
66 fn: ExitNewClusterMode,
67 },
68 "AlreadyExited": {
69 startingContent: withoutFNC,
70 expectedContent: withoutFNC,
71 fn: ExitNewClusterMode,
72 },
73 }
74
75 for name, tc := range tests {
76 t.Run(name, func(t *testing.T) {
77 ctx := setupTestCtx(t)
78 memFs := afero.NewMemMapFs()
79
80 err := afero.WriteFile(memFs, etcdFilepath, tc.startingContent, 0600)
81 require.NoError(t, err)
82
83 m := manifest.New(memFs, etcdFilepath, &corev1.Pod{}, 0)
84
85 restarter := createMockRestarter(mockCtrl)
86 terminator := createMockTerminator(mockCtrl)
87 err = tc.fn(ctx, &m, restarter, terminator)
88 require.NoError(t, err)
89
90 content, err := afero.ReadFile(memFs, etcdFilepath)
91 require.NoError(t, err)
92 assert.Equal(t, string(tc.expectedContent), string(content))
93 })
94 }
95 }
96
97 func createMockRestarter(mockCtrl *gomock.Controller) systemd.Restarter {
98 restarter := systemdMocks.NewMockRestarter(mockCtrl)
99 restarter.EXPECT().Restart(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
100 return restarter
101 }
102
103 func createMockTerminator(mockCtrl *gomock.Controller) containerd.Terminator {
104 terminator := containerdMocks.NewMockTerminator(mockCtrl)
105 terminator.EXPECT().WithTerminate(gomock.Any(), gomock.Any(), gomock.Any()).
106 DoAndReturn(func(_ context.Context, _ containerd.LabelFilters, fn func() error) error {
107 return fn()
108 }).AnyTimes()
109 return terminator
110 }
111
View as plain text