...

Source file src/edge-infra.dev/pkg/edge/edgecli/config_test.go

Documentation: edge-infra.dev/pkg/edge/edgecli

     1  package edgecli
     2  
     3  import (
     4  	"errors"
     5  	"os"
     6  	"strconv"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  )
    11  
    12  var (
    13  	testBanners = []*BannerContext{
    14  		{
    15  			BannerEdgeID: "BID0",
    16  			BannerName:   "Banner0",
    17  			TenantOrg:    "Org0",
    18  			Username:     "User0",
    19  			Endpoint:     "Endpoint0",
    20  			Token:        "Token0",
    21  		},
    22  		{
    23  			BannerEdgeID: "BID1",
    24  			BannerName:   "Banner1",
    25  			TenantOrg:    "Org1",
    26  			Username:     "User1",
    27  			Endpoint:     "Endpoint1",
    28  			Token:        "Token1",
    29  		},
    30  		{
    31  			BannerEdgeID: "BID2",
    32  			BannerName:   "Banner2",
    33  			TenantOrg:    "Org2",
    34  			Username:     "User2",
    35  			Endpoint:     "Endpoint2",
    36  			Token:        "Token2",
    37  		},
    38  		{
    39  			BannerEdgeID: "BID3",
    40  			BannerName:   "Banner3",
    41  			TenantOrg:    "Org3",
    42  			Username:     "User3",
    43  			Endpoint:     "Endpoint3",
    44  			Token:        "Token3",
    45  		},
    46  		{
    47  			BannerEdgeID: "BID4",
    48  			BannerName:   "Banner4",
    49  			TenantOrg:    "Org4",
    50  			Username:     "User4",
    51  			Endpoint:     "Endpoint4",
    52  			Token:        "Token4",
    53  		},
    54  	}
    55  
    56  	testClusters = []*ClusterContext{
    57  		{
    58  			ClusterEdgeID: "CID0",
    59  		},
    60  		{
    61  			ClusterEdgeID: "CID1",
    62  		},
    63  		{
    64  			ClusterEdgeID: "CID2",
    65  		},
    66  		{
    67  			ClusterEdgeID: "CID3",
    68  		},
    69  		{
    70  			ClusterEdgeID: "CID4",
    71  		},
    72  	}
    73  
    74  	testCfgs = []*Config{
    75  		{
    76  			// empty config
    77  			BannerContexts:  make(map[string]*BannerContext),
    78  			ClusterContexts: make(map[string]*ClusterContext),
    79  		},
    80  		{
    81  			BannerContexts: map[string]*BannerContext{
    82  				"0": testBanners[0],
    83  				"1": testBanners[1],
    84  				"2": testBanners[2],
    85  			},
    86  			ClusterContexts: map[string]*ClusterContext{
    87  				"0": testClusters[0],
    88  				"1": testClusters[1],
    89  			},
    90  		},
    91  		{
    92  			BannerContexts: map[string]*BannerContext{
    93  				"1": testBanners[1],
    94  				"3": testBanners[3],
    95  			},
    96  			ClusterContexts: map[string]*ClusterContext{
    97  				"0": testClusters[0],
    98  				"2": testClusters[2],
    99  				"4": testClusters[4],
   100  			},
   101  		},
   102  		{
   103  			BannerContexts: map[string]*BannerContext{
   104  				"0": testBanners[0],
   105  				"1": testBanners[1],
   106  				"2": testBanners[2],
   107  				"3": testBanners[3],
   108  				"4": testBanners[4],
   109  			},
   110  			ClusterContexts: map[string]*ClusterContext{
   111  				"0": testClusters[0],
   112  				"1": testClusters[1],
   113  				"2": testClusters[2],
   114  				"3": testClusters[3],
   115  				"4": testClusters[4],
   116  			},
   117  		},
   118  	}
   119  )
   120  
   121  func Test_File(t *testing.T) {
   122  	dir := t.TempDir()
   123  	defer os.RemoveAll(dir)
   124  	t.Setenv("HOME", dir)
   125  	path := dir + "/.edge"
   126  
   127  	t.Run("Creating .edge", func(t *testing.T) {
   128  		// removing test .edge file if one is found
   129  		if _, err := os.Stat(path); !errors.Is(err, os.ErrNotExist) {
   130  			err = os.Remove(path)
   131  			assert.NoError(t, err)
   132  		}
   133  
   134  		// ReadConfig() should generate a test .edge file
   135  		_, err := ReadConfig()
   136  		assert.NoError(t, err)
   137  		_, err = os.Stat(path)
   138  		assert.True(t, !errors.Is(err, os.ErrNotExist))
   139  
   140  		// removing test .edge file again
   141  		if _, err := os.Stat(path); !errors.Is(err, os.ErrNotExist) {
   142  			err = os.Remove(path)
   143  			assert.NoError(t, err)
   144  		}
   145  
   146  		// WriteConfig() should also generate a test .edge file
   147  		err = WriteConfig(&Config{})
   148  		assert.NoError(t, err)
   149  		_, err = os.Stat(path)
   150  		assert.True(t, !errors.Is(err, os.ErrNotExist))
   151  	})
   152  
   153  	t.Run("Read and write to .edge", func(t *testing.T) {
   154  		for _, cfg := range testCfgs {
   155  			err := WriteConfig(cfg)
   156  			assert.NoError(t, err)
   157  
   158  			readCfg, err := ReadConfig()
   159  			assert.NoError(t, err)
   160  
   161  			assert.Equal(t, cfg, readCfg)
   162  		}
   163  	})
   164  }
   165  
   166  func Test_Config(t *testing.T) {
   167  	dir := t.TempDir()
   168  	defer os.RemoveAll(dir)
   169  	t.Setenv("HOME", dir)
   170  
   171  	t.Run("Add Banner", func(t *testing.T) {
   172  		cfg := Config{}
   173  		for name, banner := range testBanners {
   174  			// good case
   175  			bc, err := cfg.AddBanner(strconv.Itoa(name),
   176  				banner.BannerEdgeID,
   177  				banner.BannerName,
   178  				banner.Username,
   179  				banner.TenantOrg,
   180  				banner.Endpoint,
   181  				banner.Token,
   182  				banner.TokenTime,
   183  			)
   184  			assert.NoError(t, err)
   185  			assert.Equal(t, banner, bc)
   186  			assert.Equal(t, banner, cfg.BannerContexts[strconv.Itoa(name)])
   187  
   188  			// adding a banner that already exists
   189  			_, err = cfg.AddBanner(strconv.Itoa(name),
   190  				banner.BannerEdgeID,
   191  				banner.BannerName,
   192  				banner.Username,
   193  				banner.TenantOrg,
   194  				banner.Endpoint,
   195  				banner.Token,
   196  				banner.TokenTime,
   197  			)
   198  			assert.Error(t, err)
   199  		}
   200  		// adding a banner w/o edgeID
   201  		_, err := cfg.AddBanner("no edge ID", "", "", "", "", "", "", "")
   202  		assert.Error(t, err)
   203  	})
   204  
   205  	t.Run("Add Cluster", func(t *testing.T) {
   206  		cfg := Config{}
   207  		for name, cluster := range testClusters {
   208  			// good case
   209  			cc, err := cfg.AddCluster(strconv.Itoa(name), cluster.ClusterEdgeID)
   210  			assert.NoError(t, err)
   211  			assert.Equal(t, cluster, cc)
   212  			assert.Equal(t, cluster, cfg.ClusterContexts[strconv.Itoa(name)])
   213  
   214  			// adding a cluster that already exists
   215  			_, err = cfg.AddCluster(strconv.Itoa(name), cluster.ClusterEdgeID)
   216  			assert.Error(t, err)
   217  		}
   218  		// adding a cluster w/o edgeID
   219  		_, err := cfg.AddCluster("no edge ID", "")
   220  		assert.Error(t, err)
   221  	})
   222  
   223  	t.Run("Set Banner", func(t *testing.T) {
   224  		for _, cfg := range testCfgs {
   225  			for name := range cfg.BannerContexts {
   226  				err := cfg.SetBanner(name)
   227  				assert.NoError(t, err)
   228  			}
   229  			// invalid name
   230  			err := cfg.SetBanner("not a name")
   231  			assert.Error(t, err)
   232  		}
   233  	})
   234  
   235  	t.Run("Set Cluster", func(t *testing.T) {
   236  		for _, cfg := range testCfgs {
   237  			for name := range cfg.ClusterContexts {
   238  				err := cfg.SetCluster(name)
   239  				assert.NoError(t, err)
   240  			}
   241  			// invalid name
   242  			err := cfg.SetCluster("not a name")
   243  			assert.Error(t, err)
   244  		}
   245  	})
   246  
   247  	t.Run("Delete Banner", func(t *testing.T) {
   248  		for _, cfg := range testCfgs {
   249  			for name := range cfg.BannerContexts {
   250  				err := cfg.DeleteBanner(name)
   251  				assert.NoError(t, err)
   252  				_, ok := cfg.BannerContexts[name]
   253  				assert.False(t, ok)
   254  			}
   255  			// invalid name
   256  			err := cfg.DeleteBanner("not a name")
   257  			assert.Error(t, err)
   258  		}
   259  	})
   260  
   261  	t.Run("Delete Cluster", func(t *testing.T) {
   262  		for _, cfg := range testCfgs {
   263  			for name := range cfg.ClusterContexts {
   264  				err := cfg.DeleteCluster(name)
   265  				assert.NoError(t, err)
   266  				_, ok := cfg.ClusterContexts[name]
   267  				assert.False(t, ok)
   268  			}
   269  			// invalid name
   270  			err := cfg.DeleteCluster("not a name")
   271  			assert.Error(t, err)
   272  		}
   273  	})
   274  
   275  	t.Run("Update Banner", func(t *testing.T) {
   276  		for _, cfg := range testCfgs {
   277  			for name, bc := range cfg.BannerContexts {
   278  				err := cfg.UpdateBanner(name, "1", "2", "3", "4", "5", "6")
   279  				assert.NoError(t, err)
   280  				testBanner := BannerContext{
   281  					BannerEdgeID: "1",
   282  					BannerName:   "2",
   283  					Username:     "3",
   284  					TenantOrg:    "4",
   285  					Endpoint:     "5",
   286  					Token:        "6",
   287  					TokenTime:    bc.TokenTime,
   288  				}
   289  				assert.Equal(t, testBanner, cfg.BannerContexts[name])
   290  			}
   291  			// invalid name
   292  			err := cfg.UpdateBanner("not a name", "1", "2", "3", "4", "5", "6")
   293  			assert.Error(t, err)
   294  		}
   295  	})
   296  
   297  	t.Run("Update Cluster", func(t *testing.T) {
   298  		for _, cfg := range testCfgs {
   299  			for name := range cfg.ClusterContexts {
   300  				err := cfg.UpdateCluster(name, "1")
   301  				assert.NoError(t, err)
   302  				testBanner := ClusterContext{
   303  					ClusterEdgeID: "1",
   304  				}
   305  				assert.Equal(t, testBanner, cfg.ClusterContexts[name])
   306  			}
   307  			// invalid name
   308  			err := cfg.UpdateCluster("not a name", "1")
   309  			assert.Error(t, err)
   310  		}
   311  	})
   312  }
   313  

View as plain text