mirror of https://github.com/certusone/dc4bc.git
feat: added mocks and client tests
This commit is contained in:
parent
60f2194e29
commit
6644ba0a59
|
@ -0,0 +1,9 @@
|
|||
test:
|
||||
@echo "Testing Go packages..."
|
||||
@go test ./... -cover
|
||||
|
||||
mocks:
|
||||
@echo "Regenerate mocks..."
|
||||
@go generate ./...
|
||||
|
||||
.PHONY: mocks
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
18
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
|
||||
)
|
||||
|
|
5
main.go
5
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"
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue