...

Source file src/edge-infra.dev/pkg/sds/lib/etcd/server/reset_test.go

Documentation: edge-infra.dev/pkg/sds/lib/etcd/server

     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  	//go:embed testdata/etcd-with-fnc.yaml
    27  	withFNC []byte
    28  	//go:embed testdata/etcd-without-fnc.yaml
    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