From 6644ba0a59ee5b3fc1d8e1d3fe9719454b431da3 Mon Sep 17 00:00:00 2001 From: Andrej Zavgorodnij Date: Thu, 30 Jul 2020 13:29:47 +0300 Subject: [PATCH] feat: added mocks and client tests --- Makefile | 9 ++++ client/client.go | 13 +++--- client/client_test.go | 42 +++++++++++++++++++ fsm/fsm/fsm.go | 2 +- .../signature_proposal_fsm/init.go | 4 +- go.mod | 18 ++++---- main.go | 5 ++- mocks/gomock.go | 4 ++ storage/fileStorage.go | 9 ++-- storage/fileStorage_test.go | 10 ++++- storage/types.go | 2 +- 11 files changed, 91 insertions(+), 27 deletions(-) create mode 100644 Makefile create mode 100644 client/client_test.go create mode 100644 mocks/gomock.go diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7d7555a --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +test: + @echo "Testing Go packages..." + @go test ./... -cover + +mocks: + @echo "Regenerate mocks..." + @go generate ./... + +.PHONY: mocks \ No newline at end of file diff --git a/client/client.go b/client/client.go index 94aaf88..7a904a3 100644 --- a/client/client.go +++ b/client/client.go @@ -8,9 +8,8 @@ import ( "path/filepath" "time" - "p2p.org/dc4bc/storage" - - "p2p.org/dc4bc/qr" + "github.com/p2p-org/dc4bc/qr" + "github.com/p2p-org/dc4bc/storage" ) const ( @@ -39,8 +38,8 @@ func NewClient( }, nil } -func (c *Client) PostMessage(message storage.Message) error { - if err := c.storage.Post(message); err != nil { +func (c *Client) SendMessage(message storage.Message) error { + if _, err := c.storage.Send(message); err != nil { return fmt.Errorf("failed to post message: %w", err) } @@ -117,7 +116,7 @@ func (c *Client) GetOperationQRPath(operationID string) (string, error) { // ReadProcessedOperation reads the processed operation from camera, checks that // the processed operation has its unprocessed counterpart in our state, -// posts a Message to the storage and deletes the operation from our state. +// posts a Message to the storageMocks and deletes the operation from our state. func (c *Client) ReadProcessedOperation() error { bz, err := qr.ReadQRFromCamera() if err != nil { @@ -139,7 +138,7 @@ func (c *Client) ReadProcessedOperation() error { } var message storage.Message - if err := c.storage.Post(message); err != nil { + if _, err := c.storage.Send(message); err != nil { return fmt.Errorf("failed to post message: %w", err) } diff --git a/client/client_test.go b/client/client_test.go new file mode 100644 index 0000000..d0a509c --- /dev/null +++ b/client/client_test.go @@ -0,0 +1,42 @@ +package client_test + +import ( + "context" + "errors" + "testing" + "time" + + "github.com/p2p-org/dc4bc/client" + + "github.com/golang/mock/gomock" + "github.com/p2p-org/dc4bc/mocks/clientMocks" + "github.com/p2p-org/dc4bc/mocks/storageMocks" + "github.com/stretchr/testify/require" +) + +func TestClient_GetOperationQRPath(t *testing.T) { + var ( + ctx = context.Background() + req = require.New(t) + ctrl = gomock.NewController(t) + ) + defer ctrl.Finish() + + state := clientMocks.NewMockState(ctrl) + storage := storageMocks.NewMockStorage(ctrl) + + clt, err := client.NewClient(ctx, nil, state, storage) + req.NoError(err) + + operation := &client.Operation{ + ID: "operation_id", + Type: client.DKGCommits, + Payload: []byte("operation_payload"), + CreatedAt: time.Now(), + } + + state.EXPECT().GetOperationByID(operation.ID).Times(1).Return( + nil, errors.New("")) + _, err = clt.GetOperationQRPath(operation.ID) + req.Error(err) +} diff --git a/fsm/fsm/fsm.go b/fsm/fsm/fsm.go index 6b178d9..94dfb50 100644 --- a/fsm/fsm/fsm.go +++ b/fsm/fsm/fsm.go @@ -23,7 +23,7 @@ const ( StateGlobalDone = "__done" ) -// FSMResponse returns result for processing with client events +// FSMResponse returns result for processing with clientMocks events type FSMResponse struct { // Returns machine execution result state State string diff --git a/fsm/state_machines/signature_proposal_fsm/init.go b/fsm/state_machines/signature_proposal_fsm/init.go index 4ab0d18..3f3d141 100644 --- a/fsm/state_machines/signature_proposal_fsm/init.go +++ b/fsm/state_machines/signature_proposal_fsm/init.go @@ -44,13 +44,13 @@ func New() fsm_pool.IStateMachine { // Validate by participants {Name: eventConfirmProposal, SrcState: []string{stateAwaitProposalConfirmation}, DstState: stateAwaitProposalConfirmation}, - // Is decline event should auto change state to default, or it process will initiated by client (external emit)? + // Is decline event should auto change state to default, or it process will initiated by clientMocks (external emit)? // Now set for external emitting. {Name: eventDeclineProposal, SrcState: []string{stateAwaitProposalConfirmation}, DstState: stateValidationCanceledByParticipant}, {Name: eventValidateProposal, SrcState: []string{stateAwaitProposalConfirmation}, DstState: stateAwaitProposalConfirmation}, - // eventProposalValidate internal or from client? + // eventProposalValidate internal or from clientMocks? // yay // Exit point {Name: eventSetProposalValidated, SrcState: []string{stateAwaitProposalConfirmation}, DstState: "process_sig", IsInternal: true}, diff --git a/go.mod b/go.mod index f4e2139..8fb0edc 100644 --- a/go.mod +++ b/go.mod @@ -1,23 +1,25 @@ -module p2p.org/dc4bc +module github.com/p2p-org/dc4bc go 1.13 require ( + github.com/golang/mock v1.4.4 github.com/google/uuid v1.1.1 github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b github.com/looplab/fsm v0.1.0 github.com/makiuchi-d/gozxing v0.0.0-20190830103442-eaff64b1ceb7 - github.com/mattn/go-gtk v0.0.0-20191030024613-af2e013261f5 - github.com/p2p-org/dc4bc v0.0.0-00010101000000-000000000000 + github.com/mattn/go-pointer v0.0.0-20190911064623-a0a44394634f // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/stretchr/testify v1.6.1 + github.com/syndtr/goleveldb v1.0.0 go.dedis.ch/kyber/v3 v3.0.9 gocv.io/x/gocv v0.23.0 golang.org/x/image v0.0.0-20200618115811-c13761719519 + golang.org/x/text v0.3.3 // indirect + golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect ) -replace golang.org/x/crypto => github.com/tendermint/crypto v0.0.0-20180820045704-3764759f34a5 - -replace go.dedis.ch/kyber/v3 => github.com/corestario/kyber/v3 v3.0.0-20200218082721-8ed10c357c05 - -replace github.com/p2p-org/dc4bc => /home/tellme/PROJECTS/go/src/github.com/p2p-org/dc4bc +replace ( + go.dedis.ch/kyber/v3 => github.com/corestario/kyber/v3 v3.0.0-20200218082721-8ed10c357c05 + golang.org/x/crypto => github.com/tendermint/crypto v0.0.0-20180820045704-3764759f34a5 +) diff --git a/main.go b/main.go index a775989..74bb3b7 100644 --- a/main.go +++ b/main.go @@ -2,14 +2,15 @@ package main import ( "fmt" - dkg "go.dedis.ch/kyber/v3/share/dkg/pedersen" _ "image/jpeg" "log" "sync" + dkg "go.dedis.ch/kyber/v3/share/dkg/pedersen" + "go.dedis.ch/kyber/v3" - dkglib "p2p.org/dc4bc/dkg" + dkglib "github.com/p2p-org/dc4bc/dkg" _ "image/gif" _ "image/png" diff --git a/mocks/gomock.go b/mocks/gomock.go new file mode 100644 index 0000000..761d56c --- /dev/null +++ b/mocks/gomock.go @@ -0,0 +1,4 @@ +package mocks + +//go:generate mockgen -source=./../client/state.go -destination=./clientMocks/state_mock.go -package=clientMocks +//go:generate mockgen -source=./../storage/types.go -destination=./storageMocks/storage_mock.go -package=storageMocks diff --git a/storage/fileStorage.go b/storage/fileStorage.go index 293d7cb..36efaa8 100644 --- a/storage/fileStorage.go +++ b/storage/fileStorage.go @@ -4,10 +4,11 @@ import ( "bufio" "encoding/json" "fmt" - "github.com/google/uuid" - "github.com/juju/fslock" "io" "os" + + "github.com/google/uuid" + "github.com/juju/fslock" ) var _ Storage = (*FileStorage)(nil) @@ -33,7 +34,7 @@ func countLines(r io.Reader) uint64 { return count } -// InitFileStorage inits append-only file storage +// InitFileStorage inits append-only file storageMocks // It takes two arguments: filename - path to a data file, lockFilename (optional) - path to a lock file func InitFileStorage(filename string, lockFilename ...string) (Storage, error) { var ( @@ -81,7 +82,7 @@ func (fs *FileStorage) Send(m Message) (Message, error) { } // GetMessages returns a slice of messages from append-only data file with given offset -func (fs *FileStorage) GetMessages(offset int) ([]Message, error) { +func (fs *FileStorage) GetMessages(offset uint64) ([]Message, error) { var ( msgs []Message err error diff --git a/storage/fileStorage_test.go b/storage/fileStorage_test.go index 07dbf8d..bf164a2 100644 --- a/storage/fileStorage_test.go +++ b/storage/fileStorage_test.go @@ -2,6 +2,7 @@ package storage import ( "math/rand" + "os" "reflect" "testing" "time" @@ -18,12 +19,15 @@ func randomBytes(n int) []byte { func TestFileStorage_GetMessages(t *testing.T) { N := 10 - offset := 5 - fs, err := InitFileStorage("test") + var offset uint64 = 5 + var testFile = "/tmp/dc4bc_test_file_storage" + fs, err := InitFileStorage(testFile) if err != nil { t.Error(err) } defer fs.Close() + defer os.Remove(testFile) + msgs := make([]Message, 0, N) for i := 0; i < N; i++ { msg := Message{ @@ -36,10 +40,12 @@ func TestFileStorage_GetMessages(t *testing.T) { } msgs = append(msgs, msg) } + offsetMsgs, err := fs.GetMessages(offset) if err != nil { t.Error(err) } + expectedOffsetMsgs := msgs[offset:] if !reflect.DeepEqual(offsetMsgs, expectedOffsetMsgs) { t.Errorf("expected messages: %v, actual messages: %v", expectedOffsetMsgs, offsetMsgs) diff --git a/storage/types.go b/storage/types.go index 65dc2b7..583d614 100644 --- a/storage/types.go +++ b/storage/types.go @@ -9,6 +9,6 @@ type Message struct { type Storage interface { Send(message Message) (Message, error) - GetMessages(offset int) ([]Message, error) + GetMessages(offset uint64) ([]Message, error) Close() error }