github.com/khulnasoft/cli@v0.0.0-20240402070845-01bcad7beefa/cli/command/defaultcontextstore_test.go (about)

     1  // FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
     2  //go:build go1.19
     3  
     4  package command
     5  
     6  import (
     7  	"crypto/rand"
     8  	"testing"
     9  
    10  	"github.com/docker/docker/errdefs"
    11  	"github.com/khulnasoft-lab/go-connections/tlsconfig"
    12  	"github.com/khulnasoft/cli/cli/config/configfile"
    13  	"github.com/khulnasoft/cli/cli/context/docker"
    14  	"github.com/khulnasoft/cli/cli/context/store"
    15  	cliflags "github.com/khulnasoft/cli/cli/flags"
    16  	"gotest.tools/v3/assert"
    17  	is "gotest.tools/v3/assert/cmp"
    18  	"gotest.tools/v3/golden"
    19  )
    20  
    21  type endpoint struct {
    22  	Foo string `json:"a_very_recognizable_field_name"`
    23  }
    24  
    25  type testContext struct {
    26  	Bar string `json:"another_very_recognizable_field_name"`
    27  }
    28  
    29  var testCfg = store.NewConfig(func() any { return &testContext{} },
    30  	store.EndpointTypeGetter("ep1", func() any { return &endpoint{} }),
    31  	store.EndpointTypeGetter("ep2", func() any { return &endpoint{} }),
    32  )
    33  
    34  func testDefaultMetadata() store.Metadata {
    35  	return store.Metadata{
    36  		Endpoints: map[string]any{
    37  			"ep1": endpoint{Foo: "bar"},
    38  		},
    39  		Metadata: testContext{Bar: "baz"},
    40  		Name:     DefaultContextName,
    41  	}
    42  }
    43  
    44  func testStore(t *testing.T, meta store.Metadata, tls store.ContextTLSData) store.Store {
    45  	t.Helper()
    46  	return &ContextStoreWithDefault{
    47  		Store: store.New(t.TempDir(), testCfg),
    48  		Resolver: func() (*DefaultContext, error) {
    49  			return &DefaultContext{
    50  				Meta: meta,
    51  				TLS:  tls,
    52  			}, nil
    53  		},
    54  	}
    55  }
    56  
    57  func TestDefaultContextInitializer(t *testing.T) {
    58  	cli, err := NewDockerCli()
    59  	assert.NilError(t, err)
    60  	t.Setenv("DOCKER_HOST", "ssh://someswarmserver")
    61  	cli.configFile = &configfile.ConfigFile{}
    62  	ctx, err := ResolveDefaultContext(&cliflags.ClientOptions{
    63  		TLS: true,
    64  		TLSOptions: &tlsconfig.Options{
    65  			CAFile: "./testdata/ca.pem",
    66  		},
    67  	}, DefaultContextStoreConfig())
    68  	assert.NilError(t, err)
    69  	assert.Equal(t, "default", ctx.Meta.Name)
    70  	assert.DeepEqual(t, "ssh://someswarmserver", ctx.Meta.Endpoints[docker.DockerEndpoint].(docker.EndpointMeta).Host)
    71  	golden.Assert(t, string(ctx.TLS.Endpoints[docker.DockerEndpoint].Files["ca.pem"]), "ca.pem")
    72  }
    73  
    74  func TestExportDefaultImport(t *testing.T) {
    75  	file1 := make([]byte, 1500)
    76  	rand.Read(file1)
    77  	file2 := make([]byte, 3700)
    78  	rand.Read(file2)
    79  	s := testStore(t, testDefaultMetadata(), store.ContextTLSData{
    80  		Endpoints: map[string]store.EndpointTLSData{
    81  			"ep2": {
    82  				Files: map[string][]byte{
    83  					"file1": file1,
    84  					"file2": file2,
    85  				},
    86  			},
    87  		},
    88  	})
    89  	r := store.Export("default", s)
    90  	defer r.Close()
    91  	err := store.Import("dest", s, r)
    92  	assert.NilError(t, err)
    93  
    94  	srcMeta, err := s.GetMetadata("default")
    95  	assert.NilError(t, err)
    96  	destMeta, err := s.GetMetadata("dest")
    97  	assert.NilError(t, err)
    98  	assert.DeepEqual(t, destMeta.Metadata, srcMeta.Metadata)
    99  	assert.DeepEqual(t, destMeta.Endpoints, srcMeta.Endpoints)
   100  
   101  	srcFileList, err := s.ListTLSFiles("default")
   102  	assert.NilError(t, err)
   103  	destFileList, err := s.ListTLSFiles("dest")
   104  	assert.NilError(t, err)
   105  	assert.Equal(t, 1, len(destFileList))
   106  	assert.Equal(t, 1, len(srcFileList))
   107  	assert.Equal(t, 2, len(destFileList["ep2"]))
   108  	assert.Equal(t, 2, len(srcFileList["ep2"]))
   109  
   110  	srcData1, err := s.GetTLSData("default", "ep2", "file1")
   111  	assert.NilError(t, err)
   112  	assert.DeepEqual(t, file1, srcData1)
   113  	srcData2, err := s.GetTLSData("default", "ep2", "file2")
   114  	assert.NilError(t, err)
   115  	assert.DeepEqual(t, file2, srcData2)
   116  
   117  	destData1, err := s.GetTLSData("dest", "ep2", "file1")
   118  	assert.NilError(t, err)
   119  	assert.DeepEqual(t, file1, destData1)
   120  	destData2, err := s.GetTLSData("dest", "ep2", "file2")
   121  	assert.NilError(t, err)
   122  	assert.DeepEqual(t, file2, destData2)
   123  }
   124  
   125  func TestListDefaultContext(t *testing.T) {
   126  	meta := testDefaultMetadata()
   127  	s := testStore(t, meta, store.ContextTLSData{})
   128  	result, err := s.List()
   129  	assert.NilError(t, err)
   130  	assert.Equal(t, 1, len(result))
   131  	assert.DeepEqual(t, meta, result[0])
   132  }
   133  
   134  func TestGetDefaultContextStorageInfo(t *testing.T) {
   135  	s := testStore(t, testDefaultMetadata(), store.ContextTLSData{})
   136  	result := s.GetStorageInfo(DefaultContextName)
   137  	assert.Equal(t, "<IN MEMORY>", result.MetadataPath)
   138  	assert.Equal(t, "<IN MEMORY>", result.TLSPath)
   139  }
   140  
   141  func TestGetDefaultContextMetadata(t *testing.T) {
   142  	meta := testDefaultMetadata()
   143  	s := testStore(t, meta, store.ContextTLSData{})
   144  	result, err := s.GetMetadata(DefaultContextName)
   145  	assert.NilError(t, err)
   146  	assert.Equal(t, DefaultContextName, result.Name)
   147  	assert.DeepEqual(t, meta.Metadata, result.Metadata)
   148  	assert.DeepEqual(t, meta.Endpoints, result.Endpoints)
   149  }
   150  
   151  func TestErrCreateDefault(t *testing.T) {
   152  	meta := testDefaultMetadata()
   153  	s := testStore(t, meta, store.ContextTLSData{})
   154  	err := s.CreateOrUpdate(store.Metadata{
   155  		Endpoints: map[string]any{
   156  			"ep1": endpoint{Foo: "bar"},
   157  		},
   158  		Metadata: testContext{Bar: "baz"},
   159  		Name:     "default",
   160  	})
   161  	assert.Check(t, is.ErrorType(err, errdefs.IsInvalidParameter))
   162  	assert.Error(t, err, "default context cannot be created nor updated")
   163  }
   164  
   165  func TestErrRemoveDefault(t *testing.T) {
   166  	meta := testDefaultMetadata()
   167  	s := testStore(t, meta, store.ContextTLSData{})
   168  	err := s.Remove("default")
   169  	assert.Check(t, is.ErrorType(err, errdefs.IsInvalidParameter))
   170  	assert.Error(t, err, "default context cannot be removed")
   171  }
   172  
   173  func TestErrTLSDataError(t *testing.T) {
   174  	meta := testDefaultMetadata()
   175  	s := testStore(t, meta, store.ContextTLSData{})
   176  	_, err := s.GetTLSData("default", "noop", "noop")
   177  	assert.Check(t, is.ErrorType(err, errdefs.IsNotFound))
   178  }