diff --git a/internal/server/ptypes/target.go b/internal/server/ptypes/target.go new file mode 100644 index 000000000..24f1c5be6 --- /dev/null +++ b/internal/server/ptypes/target.go @@ -0,0 +1,34 @@ +package ptypes + +import ( + validation "github.com/go-ozzo/ozzo-validation/v4" + "github.com/imdario/mergo" + "github.com/mitchellh/go-testing-interface" + "github.com/stretchr/testify/require" + + "github.com/hashicorp/vagrant-plugin-sdk/proto/vagrant_plugin_sdk" + "github.com/hashicorp/vagrant/internal/server/proto/vagrant_server" +) + +// TestTarget returns a valid target for tests. +func TestTarget(t testing.T, src *vagrant_server.Target) *vagrant_server.Target { + t.Helper() + + if src == nil { + src = &vagrant_server.Target{} + } + + require.NoError(t, mergo.Merge(src, &vagrant_server.Target{ + Name: "test", + Project: &vagrant_plugin_sdk.Ref_Project{}, + })) + + return src +} + +// ValidateTarget validates the target structure. +func ValidateTarget(t *vagrant_server.Target) error { + return validation.ValidateStruct(t, + validation.Field(&t.Name, validation.By(isEmpty)), + ) +} diff --git a/internal/server/singleprocess/service_target.go b/internal/server/singleprocess/service_target.go index 4f42ea372..8cb54b0b3 100644 --- a/internal/server/singleprocess/service_target.go +++ b/internal/server/singleprocess/service_target.go @@ -13,12 +13,12 @@ func (s *service) UpsertTarget( ctx context.Context, req *vagrant_server.UpsertTargetRequest, ) (*vagrant_server.UpsertTargetResponse, error) { - m, err := s.state.TargetPut(req.Target) + err := s.state.TargetPut(req.Target) if err != nil { return nil, err } - return &vagrant_server.UpsertTargetResponse{Target: m}, nil + return &vagrant_server.UpsertTargetResponse{Target: req.Target}, nil } func (s *service) DeleteTarget( diff --git a/internal/server/singleprocess/state/project_test.go b/internal/server/singleprocess/state/project_test.go index d5111142d..df952c29c 100644 --- a/internal/server/singleprocess/state/project_test.go +++ b/internal/server/singleprocess/state/project_test.go @@ -34,9 +34,10 @@ func TestProject(t *testing.T) { defer s.Close() basisRef := testBasis(t, s) + resourceId := "AbCdE" // Set err := s.ProjectPut(serverptypes.TestProject(t, &vagrant_server.Project{ - ResourceId: "AbCdE", + ResourceId: resourceId, Basis: basisRef, Path: "idontexist", })) @@ -45,21 +46,13 @@ func TestProject(t *testing.T) { // Get exact { resp, err := s.ProjectGet(&vagrant_plugin_sdk.Ref_Project{ - ResourceId: "AbCdE", + ResourceId: resourceId, }) require.NoError(err) require.NotNil(resp) - } + require.Equal(resp.ResourceId, resourceId) - // TODO: - // Get case insensitive - // { - // resp, err := s.ProjectGet(&vagrant_plugin_sdk.Ref_Project{ - // ResourceId: "abcDe", - // }) - // require.NoError(err) - // require.NotNil(resp) - // } + } // List { diff --git a/internal/server/singleprocess/state/target.go b/internal/server/singleprocess/state/target.go index 0d45c3062..6a9c7927d 100644 --- a/internal/server/singleprocess/state/target.go +++ b/internal/server/singleprocess/state/target.go @@ -35,7 +35,7 @@ func (s *State) TargetFind(m *vagrant_server.Target) (*vagrant_server.Target, er return result, err } -func (s *State) TargetPut(target *vagrant_server.Target) (*vagrant_server.Target, error) { +func (s *State) TargetPut(target *vagrant_server.Target) error { memTxn := s.inmem.Txn(true) defer memTxn.Abort() @@ -45,7 +45,7 @@ func (s *State) TargetPut(target *vagrant_server.Target) (*vagrant_server.Target if err == nil { memTxn.Commit() } - return target, err + return err } func (s *State) TargetDelete(ref *vagrant_plugin_sdk.Ref_Target) error { diff --git a/internal/server/singleprocess/state/target_test.go b/internal/server/singleprocess/state/target_test.go new file mode 100644 index 000000000..a3f8df9f5 --- /dev/null +++ b/internal/server/singleprocess/state/target_test.go @@ -0,0 +1,113 @@ +package state + +import ( + "testing" + + "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/hashicorp/vagrant-plugin-sdk/proto/vagrant_plugin_sdk" + "github.com/hashicorp/vagrant/internal/server/proto/vagrant_server" + serverptypes "github.com/hashicorp/vagrant/internal/server/ptypes" +) + +func TestTarget(t *testing.T) { + t.Run("Get returns not found error if not exist", func(t *testing.T) { + require := require.New(t) + + s := TestState(t) + defer s.Close() + + // Set + _, err := s.TargetGet(&vagrant_plugin_sdk.Ref_Target{ + ResourceId: "foo", + }) + require.Error(err) + require.Equal(codes.NotFound, status.Code(err)) + }) + + t.Run("Put and Get", func(t *testing.T) { + require := require.New(t) + + s := TestState(t) + defer s.Close() + projectRef := testProject(t, s) + + resourceId := "AbCdE" + // Set + err := s.TargetPut(serverptypes.TestTarget(t, &vagrant_server.Target{ + ResourceId: resourceId, + Project: projectRef, + Name: "test", + })) + require.NoError(err) + + // Get exact + { + resp, err := s.TargetGet(&vagrant_plugin_sdk.Ref_Target{ + ResourceId: resourceId, + }) + require.NoError(err) + require.NotNil(resp) + require.Equal(resp.ResourceId, resourceId) + + } + + // List + { + resp, err := s.TargetList() + require.NoError(err) + require.Len(resp, 1) + } + }) + + t.Run("Delete", func(t *testing.T) { + require := require.New(t) + + s := TestState(t) + defer s.Close() + projectRef := testProject(t, s) + + resourceId := "AbCdE" + // Set + err := s.TargetPut(serverptypes.TestTarget(t, &vagrant_server.Target{ + ResourceId: resourceId, + Project: projectRef, + Name: "test", + })) + require.NoError(err) + + // Read + resp, err := s.TargetGet(&vagrant_plugin_sdk.Ref_Target{ + ResourceId: resourceId, + }) + require.NoError(err) + require.NotNil(resp) + + // Delete + { + err := s.TargetDelete(&vagrant_plugin_sdk.Ref_Target{ + ResourceId: resourceId, + Project: projectRef, + }) + require.NoError(err) + } + + // Read + { + _, err := s.TargetGet(&vagrant_plugin_sdk.Ref_Target{ + ResourceId: resourceId, + }) + require.Error(err) + require.Equal(codes.NotFound, status.Code(err)) + } + + // List + { + resp, err := s.TargetList() + require.NoError(err) + require.Len(resp, 0) + } + }) +} diff --git a/internal/server/singleprocess/state/testing.go b/internal/server/singleprocess/state/testing.go index 4c494de4e..b7cf667d1 100644 --- a/internal/server/singleprocess/state/testing.go +++ b/internal/server/singleprocess/state/testing.go @@ -97,6 +97,22 @@ func testBasis(t testing.T, s *State) *vagrant_plugin_sdk.Ref_Basis { } } +func testProject(t testing.T, s *State) *vagrant_plugin_sdk.Ref_Project { + basisRef := testBasis(t, s) + s.ProjectPut(serverptypes.TestProject(t, &vagrant_server.Project{ + ResourceId: "test-project", + Basis: basisRef, + Path: "idontexist", + Name: "test-project", + })) + return &vagrant_plugin_sdk.Ref_Project{ + ResourceId: "test-project", + Path: "idontexist", + Name: "test-project", + Basis: basisRef, + } +} + func testTempDir(t testing.T) string { dir, err := ioutil.TempDir("", "vagrant-test") require.NoError(t, err)