From a8ce2400497cfe3b9af20bdae130feed09334aa0 Mon Sep 17 00:00:00 2001 From: sophia Date: Mon, 8 Nov 2021 11:49:34 -0600 Subject: [PATCH] Add tests for box --- internal/server/singleprocess/state/box.go | 13 +- .../server/singleprocess/state/box_test.go | 120 ++++++++++++++++++ 2 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 internal/server/singleprocess/state/box_test.go diff --git a/internal/server/singleprocess/state/box.go b/internal/server/singleprocess/state/box.go index 6d8f5a58f..a810d93bb 100644 --- a/internal/server/singleprocess/state/box.go +++ b/internal/server/singleprocess/state/box.go @@ -6,6 +6,8 @@ import ( "github.com/hashicorp/vagrant-plugin-sdk/proto/vagrant_plugin_sdk" "github.com/hashicorp/vagrant/internal/server/proto/vagrant_server" bolt "go.etcd.io/bbolt" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) var boxBucket = []byte("box") @@ -94,12 +96,19 @@ func (s *State) boxDelete( memTxn *memdb.Txn, ref *vagrant_plugin_sdk.Ref_Box, ) (err error) { + b, err := s.boxGet(dbTxn, memTxn, ref) + if err != nil { + if status.Code(err) == codes.NotFound { + return nil + } + return err + } // TODO: should references to the box, say in the machine also be deleted? // Delete the box - if err = dbTxn.Bucket(boxBucket).Delete(s.boxIdByRef(ref)); err != nil { + if err = dbTxn.Bucket(boxBucket).Delete(s.boxId(b)); err != nil { return } - if err = memTxn.Delete(boxIndexTableName, s.newBoxIndexRecordByRef(ref)); err != nil { + if err = memTxn.Delete(boxIndexTableName, s.newBoxIndexRecord(b)); err != nil { return } return diff --git a/internal/server/singleprocess/state/box_test.go b/internal/server/singleprocess/state/box_test.go new file mode 100644 index 000000000..572ee25b9 --- /dev/null +++ b/internal/server/singleprocess/state/box_test.go @@ -0,0 +1,120 @@ +package state + +import ( + "testing" + + "github.com/hashicorp/vagrant-plugin-sdk/proto/vagrant_plugin_sdk" + "github.com/hashicorp/vagrant/internal/server/proto/vagrant_server" + "github.com/stretchr/testify/require" +) + +func TestBox(t *testing.T) { + t.Run("Get returns error if not exist", func(t *testing.T) { + require := require.New(t) + + s := TestState(t) + defer s.Close() + + _, err := s.BoxGet(&vagrant_plugin_sdk.Ref_Box{ResourceId: "nothing"}) + require.Error(err) + }) + + t.Run("Put and Get", func(t *testing.T) { + require := require.New(t) + + s := TestState(t) + defer s.Close() + + testBox := &vagrant_server.Box{ + Id: "qwerwasdf", + Name: "hashicorp/bionic", + Version: "1.2.3", + Provider: "virtualbox", + } + + testBoxRef := &vagrant_plugin_sdk.Ref_Box{ + ResourceId: "qwerwasdf", + Name: "hashicorp/bionic", + Version: "1.2.3", + Provider: "virtualbox", + } + + // Set + err := s.BoxPut(testBox) + require.NoError(err) + + // Get full ref + { + resp, err := s.BoxGet(testBoxRef) + require.NoError(err) + require.NotNil(resp) + require.Equal(resp.Name, testBox.Name) + } + + // Get by id + { + resp, err := s.BoxGet(&vagrant_plugin_sdk.Ref_Box{ + ResourceId: "qwerwasdf", + }) + require.NoError(err) + require.NotNil(resp) + require.Equal(resp.Name, testBox.Name) + } + }) + + t.Run("Delete", func(t *testing.T) { + require := require.New(t) + + s := TestState(t) + defer s.Close() + + testBox := &vagrant_server.Box{ + Id: "qwerwasdf", + Name: "hashicorp/bionic", + Version: "1.2.3", + Provider: "virtualbox", + } + + testBoxRef := &vagrant_plugin_sdk.Ref_Box{ + ResourceId: "qwerwasdf", + } + err := s.BoxDelete(testBoxRef) + require.NoError(err) + + err = s.BoxPut(testBox) + require.NoError(err) + + err = s.BoxDelete(testBoxRef) + require.NoError(err) + + _, err = s.BoxGet(testBoxRef) + require.Error(err) + }) + + t.Run("List", func(t *testing.T) { + require := require.New(t) + + s := TestState(t) + defer s.Close() + + err := s.BoxPut(&vagrant_server.Box{ + Id: "qwerwasdf", + Name: "hashicorp/bionic", + Version: "1.2.3", + Provider: "virtualbox", + }) + require.NoError(err) + + err = s.BoxPut(&vagrant_server.Box{ + Id: "rrbrwasdf", + Name: "hashicorp/bionic", + Version: "1.2.4", + Provider: "virtualbox", + }) + require.NoError(err) + + b, err := s.BoxList() + require.NoError(err) + require.Len(b, 2) + }) +}