github.com/ali-iotechsys/cli@v20.10.0+incompatible/cli/context/store/store_test.go (about)

     1  package store
     2  
     3  import (
     4  	"archive/tar"
     5  	"archive/zip"
     6  	"bufio"
     7  	"bytes"
     8  	"crypto/rand"
     9  	"encoding/json"
    10  	"io"
    11  	"io/ioutil"
    12  	"os"
    13  	"path"
    14  	"testing"
    15  
    16  	"gotest.tools/v3/assert"
    17  )
    18  
    19  type endpoint struct {
    20  	Foo string `json:"a_very_recognizable_field_name"`
    21  }
    22  
    23  type context struct {
    24  	Bar string `json:"another_very_recognizable_field_name"`
    25  }
    26  
    27  var testCfg = NewConfig(func() interface{} { return &context{} },
    28  	EndpointTypeGetter("ep1", func() interface{} { return &endpoint{} }),
    29  	EndpointTypeGetter("ep2", func() interface{} { return &endpoint{} }),
    30  )
    31  
    32  func TestExportImport(t *testing.T) {
    33  	testDir, err := ioutil.TempDir("", t.Name())
    34  	assert.NilError(t, err)
    35  	defer os.RemoveAll(testDir)
    36  	s := New(testDir, testCfg)
    37  	err = s.CreateOrUpdate(
    38  		Metadata{
    39  			Endpoints: map[string]interface{}{
    40  				"ep1": endpoint{Foo: "bar"},
    41  			},
    42  			Metadata: context{Bar: "baz"},
    43  			Name:     "source",
    44  		})
    45  	assert.NilError(t, err)
    46  	file1 := make([]byte, 1500)
    47  	rand.Read(file1)
    48  	file2 := make([]byte, 3700)
    49  	rand.Read(file2)
    50  	err = s.ResetEndpointTLSMaterial("source", "ep1", &EndpointTLSData{
    51  		Files: map[string][]byte{
    52  			"file1": file1,
    53  			"file2": file2,
    54  		},
    55  	})
    56  	assert.NilError(t, err)
    57  	r := Export("source", s)
    58  	defer r.Close()
    59  	err = Import("dest", s, r)
    60  	assert.NilError(t, err)
    61  	srcMeta, err := s.GetMetadata("source")
    62  	assert.NilError(t, err)
    63  	destMeta, err := s.GetMetadata("dest")
    64  	assert.NilError(t, err)
    65  	assert.DeepEqual(t, destMeta.Metadata, srcMeta.Metadata)
    66  	assert.DeepEqual(t, destMeta.Endpoints, srcMeta.Endpoints)
    67  	srcFileList, err := s.ListTLSFiles("source")
    68  	assert.NilError(t, err)
    69  	destFileList, err := s.ListTLSFiles("dest")
    70  	assert.NilError(t, err)
    71  	assert.Equal(t, 1, len(destFileList))
    72  	assert.Equal(t, 1, len(srcFileList))
    73  	assert.Equal(t, 2, len(destFileList["ep1"]))
    74  	assert.Equal(t, 2, len(srcFileList["ep1"]))
    75  	srcData1, err := s.GetTLSData("source", "ep1", "file1")
    76  	assert.NilError(t, err)
    77  	assert.DeepEqual(t, file1, srcData1)
    78  	srcData2, err := s.GetTLSData("source", "ep1", "file2")
    79  	assert.NilError(t, err)
    80  	assert.DeepEqual(t, file2, srcData2)
    81  	destData1, err := s.GetTLSData("dest", "ep1", "file1")
    82  	assert.NilError(t, err)
    83  	assert.DeepEqual(t, file1, destData1)
    84  	destData2, err := s.GetTLSData("dest", "ep1", "file2")
    85  	assert.NilError(t, err)
    86  	assert.DeepEqual(t, file2, destData2)
    87  }
    88  
    89  func TestRemove(t *testing.T) {
    90  	testDir, err := ioutil.TempDir("", t.Name())
    91  	assert.NilError(t, err)
    92  	defer os.RemoveAll(testDir)
    93  	s := New(testDir, testCfg)
    94  	err = s.CreateOrUpdate(
    95  		Metadata{
    96  			Endpoints: map[string]interface{}{
    97  				"ep1": endpoint{Foo: "bar"},
    98  			},
    99  			Metadata: context{Bar: "baz"},
   100  			Name:     "source",
   101  		})
   102  	assert.NilError(t, err)
   103  	assert.NilError(t, s.ResetEndpointTLSMaterial("source", "ep1", &EndpointTLSData{
   104  		Files: map[string][]byte{
   105  			"file1": []byte("test-data"),
   106  		},
   107  	}))
   108  	assert.NilError(t, s.Remove("source"))
   109  	_, err = s.GetMetadata("source")
   110  	assert.Check(t, IsErrContextDoesNotExist(err))
   111  	f, err := s.ListTLSFiles("source")
   112  	assert.NilError(t, err)
   113  	assert.Equal(t, 0, len(f))
   114  }
   115  
   116  func TestListEmptyStore(t *testing.T) {
   117  	testDir, err := ioutil.TempDir("", t.Name())
   118  	assert.NilError(t, err)
   119  	defer os.RemoveAll(testDir)
   120  	store := New(testDir, testCfg)
   121  	result, err := store.List()
   122  	assert.NilError(t, err)
   123  	assert.Check(t, len(result) == 0)
   124  }
   125  
   126  func TestErrHasCorrectContext(t *testing.T) {
   127  	testDir, err := ioutil.TempDir("", t.Name())
   128  	assert.NilError(t, err)
   129  	defer os.RemoveAll(testDir)
   130  	store := New(testDir, testCfg)
   131  	_, err = store.GetMetadata("no-exists")
   132  	assert.ErrorContains(t, err, "no-exists")
   133  	assert.Check(t, IsErrContextDoesNotExist(err))
   134  }
   135  
   136  func TestDetectImportContentType(t *testing.T) {
   137  	testDir, err := ioutil.TempDir("", t.Name())
   138  	assert.NilError(t, err)
   139  	defer os.RemoveAll(testDir)
   140  
   141  	buf := new(bytes.Buffer)
   142  	r := bufio.NewReader(buf)
   143  	ct, err := getImportContentType(r)
   144  	assert.NilError(t, err)
   145  	assert.Assert(t, zipType != ct)
   146  }
   147  
   148  func TestImportTarInvalid(t *testing.T) {
   149  	testDir, err := ioutil.TempDir("", t.Name())
   150  	assert.NilError(t, err)
   151  	defer os.RemoveAll(testDir)
   152  
   153  	tf := path.Join(testDir, "test.context")
   154  
   155  	f, err := os.Create(tf)
   156  	assert.NilError(t, err)
   157  	defer f.Close()
   158  
   159  	tw := tar.NewWriter(f)
   160  	hdr := &tar.Header{
   161  		Name: "dummy-file",
   162  		Mode: 0600,
   163  		Size: int64(len("hello world")),
   164  	}
   165  	err = tw.WriteHeader(hdr)
   166  	assert.NilError(t, err)
   167  	_, err = tw.Write([]byte("hello world"))
   168  	assert.NilError(t, err)
   169  	err = tw.Close()
   170  	assert.NilError(t, err)
   171  
   172  	source, err := os.Open(tf)
   173  	assert.NilError(t, err)
   174  	defer source.Close()
   175  	var r io.Reader = source
   176  	s := New(testDir, testCfg)
   177  	err = Import("tarInvalid", s, r)
   178  	assert.ErrorContains(t, err, "invalid context: no metadata found")
   179  }
   180  
   181  func TestImportZip(t *testing.T) {
   182  	testDir, err := ioutil.TempDir("", t.Name())
   183  	assert.NilError(t, err)
   184  	defer os.RemoveAll(testDir)
   185  
   186  	zf := path.Join(testDir, "test.zip")
   187  
   188  	f, err := os.Create(zf)
   189  	assert.NilError(t, err)
   190  	defer f.Close()
   191  	w := zip.NewWriter(f)
   192  
   193  	meta, err := json.Marshal(Metadata{
   194  		Endpoints: map[string]interface{}{
   195  			"ep1": endpoint{Foo: "bar"},
   196  		},
   197  		Metadata: context{Bar: "baz"},
   198  		Name:     "source",
   199  	})
   200  	assert.NilError(t, err)
   201  	var files = []struct {
   202  		Name, Body string
   203  	}{
   204  		{"meta.json", string(meta)},
   205  		{path.Join("tls", "docker", "ca.pem"), string([]byte("ca.pem"))},
   206  	}
   207  
   208  	for _, file := range files {
   209  		f, err := w.Create(file.Name)
   210  		assert.NilError(t, err)
   211  		_, err = f.Write([]byte(file.Body))
   212  		assert.NilError(t, err)
   213  	}
   214  
   215  	err = w.Close()
   216  	assert.NilError(t, err)
   217  
   218  	source, err := os.Open(zf)
   219  	assert.NilError(t, err)
   220  	ct, err := getImportContentType(bufio.NewReader(source))
   221  	assert.NilError(t, err)
   222  	assert.Equal(t, zipType, ct)
   223  
   224  	source, _ = os.Open(zf)
   225  	defer source.Close()
   226  	var r io.Reader = source
   227  	s := New(testDir, testCfg)
   228  	err = Import("zipTest", s, r)
   229  	assert.NilError(t, err)
   230  }
   231  
   232  func TestImportZipInvalid(t *testing.T) {
   233  	testDir, err := ioutil.TempDir("", t.Name())
   234  	assert.NilError(t, err)
   235  	defer os.RemoveAll(testDir)
   236  
   237  	zf := path.Join(testDir, "test.zip")
   238  
   239  	f, err := os.Create(zf)
   240  	assert.NilError(t, err)
   241  	defer f.Close()
   242  	w := zip.NewWriter(f)
   243  
   244  	df, err := w.Create("dummy-file")
   245  	assert.NilError(t, err)
   246  	_, err = df.Write([]byte("hello world"))
   247  	assert.NilError(t, err)
   248  	err = w.Close()
   249  	assert.NilError(t, err)
   250  
   251  	source, err := os.Open(zf)
   252  	assert.NilError(t, err)
   253  	defer source.Close()
   254  	var r io.Reader = source
   255  	s := New(testDir, testCfg)
   256  	err = Import("zipInvalid", s, r)
   257  	assert.ErrorContains(t, err, "invalid context: no metadata found")
   258  }