feat: added mocks and client tests

This commit is contained in:
Andrej Zavgorodnij 2020-07-30 13:29:47 +03:00
parent 60f2194e29
commit 6644ba0a59
11 changed files with 91 additions and 27 deletions

9
Makefile Normal file
View File

@ -0,0 +1,9 @@
test:
@echo "Testing Go packages..."
@go test ./... -cover
mocks:
@echo "Regenerate mocks..."
@go generate ./...
.PHONY: mocks

View File

@ -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)
}

42
client/client_test.go Normal file
View File

@ -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)
}

View File

@ -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

View File

@ -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},

18
go.mod
View File

@ -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
)

View File

@ -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"

4
mocks/gomock.go Normal file
View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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
}