...

Source file src/edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/plugins/edgeconfigsync/edgeconfigsync_test.go

Documentation: edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/plugins/edgeconfigsync

     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  //go:embed testdata/edge-registries.yaml
    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