2020-07-30 03:29:47 -07:00
|
|
|
package client_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2020-08-14 05:34:15 -07:00
|
|
|
"crypto/ed25519"
|
2020-07-30 04:23:09 -07:00
|
|
|
"encoding/json"
|
2020-07-30 03:29:47 -07:00
|
|
|
"errors"
|
2020-07-30 04:23:09 -07:00
|
|
|
"os"
|
|
|
|
"path/filepath"
|
2020-07-30 03:29:47 -07:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2020-07-31 04:25:52 -07:00
|
|
|
"github.com/depools/dc4bc/client"
|
2020-08-14 05:34:15 -07:00
|
|
|
"github.com/depools/dc4bc/fsm/state_machines"
|
|
|
|
spf "github.com/depools/dc4bc/fsm/state_machines/signature_proposal_fsm"
|
|
|
|
"github.com/depools/dc4bc/fsm/types/requests"
|
2020-07-31 04:25:52 -07:00
|
|
|
"github.com/depools/dc4bc/mocks/clientMocks"
|
2020-08-14 05:34:15 -07:00
|
|
|
"github.com/depools/dc4bc/mocks/qrMocks"
|
2020-07-31 04:25:52 -07:00
|
|
|
"github.com/depools/dc4bc/mocks/storageMocks"
|
2020-08-14 05:34:15 -07:00
|
|
|
"github.com/depools/dc4bc/storage"
|
2020-07-30 03:29:47 -07:00
|
|
|
"github.com/golang/mock/gomock"
|
2020-08-14 05:34:15 -07:00
|
|
|
"github.com/google/uuid"
|
2020-07-30 03:29:47 -07:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
2020-08-14 05:34:15 -07:00
|
|
|
func TestClient_ProcessMessage(t *testing.T) {
|
|
|
|
var (
|
|
|
|
ctx = context.Background()
|
|
|
|
req = require.New(t)
|
|
|
|
ctrl = gomock.NewController(t)
|
|
|
|
)
|
|
|
|
defer ctrl.Finish()
|
|
|
|
|
|
|
|
state := clientMocks.NewMockState(ctrl)
|
|
|
|
keyStore := clientMocks.NewMockKeyStore(ctrl)
|
|
|
|
stg := storageMocks.NewMockStorage(ctrl)
|
|
|
|
qrProcessor := qrMocks.NewMockProcessor(ctrl)
|
|
|
|
|
|
|
|
fsm, err := state_machines.Create()
|
|
|
|
|
|
|
|
clt, err := client.NewClient(
|
|
|
|
ctx,
|
|
|
|
"test_client",
|
|
|
|
fsm,
|
|
|
|
state,
|
|
|
|
stg,
|
|
|
|
keyStore,
|
|
|
|
qrProcessor,
|
|
|
|
)
|
|
|
|
req.NoError(err)
|
|
|
|
|
|
|
|
t.Run("test_process_init_dkg", func(t *testing.T) {
|
|
|
|
senderUserName := "sender_username"
|
|
|
|
senderKeyPair := client.NewKeyPair()
|
|
|
|
messageData := requests.SignatureProposalParticipantsListRequest{
|
|
|
|
Participants: []*requests.SignatureProposalParticipantsEntry{
|
|
|
|
{
|
|
|
|
Title: senderUserName,
|
|
|
|
PubKey: senderKeyPair.Pub,
|
|
|
|
DkgPubKey: make([]byte, 128),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "111",
|
|
|
|
PubKey: client.NewKeyPair().Pub,
|
|
|
|
DkgPubKey: make([]byte, 128),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "222",
|
|
|
|
PubKey: client.NewKeyPair().Pub,
|
|
|
|
DkgPubKey: make([]byte, 128),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "333",
|
|
|
|
PubKey: client.NewKeyPair().Pub,
|
|
|
|
DkgPubKey: make([]byte, 128),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}
|
|
|
|
messageDataBz, err := json.Marshal(messageData)
|
|
|
|
req.NoError(err)
|
|
|
|
|
|
|
|
message := storage.Message{
|
|
|
|
ID: uuid.New().String(),
|
|
|
|
Offset: 1,
|
|
|
|
Event: string(spf.EventInitProposal),
|
|
|
|
Data: messageDataBz,
|
|
|
|
Sender: senderUserName,
|
|
|
|
}
|
|
|
|
message.Signature = ed25519.Sign(senderKeyPair.Priv, message.Bytes())
|
|
|
|
|
|
|
|
state.EXPECT().SaveOffset(uint64(1)).Times(1).Return(nil)
|
|
|
|
state.EXPECT().SaveFSM(gomock.Any()).Times(1).Return(nil)
|
|
|
|
|
|
|
|
err = clt.ProcessMessage(message)
|
|
|
|
req.NoError(err)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-07-30 04:23:09 -07:00
|
|
|
func TestClient_GetOperationsList(t *testing.T) {
|
|
|
|
var (
|
|
|
|
ctx = context.Background()
|
|
|
|
req = require.New(t)
|
|
|
|
ctrl = gomock.NewController(t)
|
|
|
|
)
|
|
|
|
defer ctrl.Finish()
|
|
|
|
|
|
|
|
state := clientMocks.NewMockState(ctrl)
|
2020-08-14 05:34:15 -07:00
|
|
|
keyStore := clientMocks.NewMockKeyStore(ctrl)
|
|
|
|
stg := storageMocks.NewMockStorage(ctrl)
|
2020-07-30 04:23:09 -07:00
|
|
|
qrProcessor := qrMocks.NewMockProcessor(ctrl)
|
|
|
|
|
2020-08-14 05:34:15 -07:00
|
|
|
clt, err := client.NewClient(
|
|
|
|
ctx,
|
|
|
|
"test_client",
|
|
|
|
nil,
|
|
|
|
state,
|
|
|
|
stg,
|
|
|
|
keyStore,
|
|
|
|
qrProcessor,
|
|
|
|
)
|
2020-07-30 04:23:09 -07:00
|
|
|
req.NoError(err)
|
|
|
|
|
|
|
|
state.EXPECT().GetOperations().Times(1).Return(map[string]*client.Operation{}, nil)
|
|
|
|
operations, err := clt.GetOperations()
|
|
|
|
req.NoError(err)
|
|
|
|
req.Len(operations, 0)
|
|
|
|
|
|
|
|
operation := &client.Operation{
|
|
|
|
ID: "operation_id",
|
|
|
|
Type: client.DKGCommits,
|
|
|
|
Payload: []byte("operation_payload"),
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}
|
|
|
|
state.EXPECT().GetOperations().Times(1).Return(
|
|
|
|
map[string]*client.Operation{operation.ID: operation}, nil)
|
|
|
|
operations, err = clt.GetOperations()
|
|
|
|
req.NoError(err)
|
|
|
|
req.Len(operations, 1)
|
|
|
|
req.Equal(operation, operations[operation.ID])
|
|
|
|
}
|
|
|
|
|
2020-07-30 03:29:47 -07:00
|
|
|
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)
|
2020-08-14 05:34:15 -07:00
|
|
|
keyStore := clientMocks.NewMockKeyStore(ctrl)
|
|
|
|
stg := storageMocks.NewMockStorage(ctrl)
|
2020-07-30 04:23:09 -07:00
|
|
|
qrProcessor := qrMocks.NewMockProcessor(ctrl)
|
2020-07-30 03:29:47 -07:00
|
|
|
|
2020-08-14 05:34:15 -07:00
|
|
|
clt, err := client.NewClient(
|
|
|
|
ctx,
|
|
|
|
"test_client",
|
|
|
|
nil,
|
|
|
|
state,
|
|
|
|
stg,
|
|
|
|
keyStore,
|
|
|
|
qrProcessor,
|
|
|
|
)
|
2020-07-30 03:29:47 -07:00
|
|
|
req.NoError(err)
|
|
|
|
|
|
|
|
operation := &client.Operation{
|
|
|
|
ID: "operation_id",
|
|
|
|
Type: client.DKGCommits,
|
|
|
|
Payload: []byte("operation_payload"),
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}
|
|
|
|
|
2020-07-30 04:23:09 -07:00
|
|
|
var expectedQrPath = filepath.Join(client.QrCodesDir, operation.ID)
|
|
|
|
defer os.Remove(expectedQrPath)
|
|
|
|
|
2020-07-30 03:29:47 -07:00
|
|
|
state.EXPECT().GetOperationByID(operation.ID).Times(1).Return(
|
|
|
|
nil, errors.New(""))
|
|
|
|
_, err = clt.GetOperationQRPath(operation.ID)
|
|
|
|
req.Error(err)
|
2020-07-30 04:23:09 -07:00
|
|
|
|
|
|
|
state.EXPECT().GetOperationByID(operation.ID).Times(1).Return(
|
|
|
|
operation, nil)
|
|
|
|
qrProcessor.EXPECT().WriteQR(expectedQrPath, gomock.Any()).Times(1).Return(nil)
|
|
|
|
qrPath, err := clt.GetOperationQRPath(operation.ID)
|
|
|
|
req.NoError(err)
|
|
|
|
req.Equal(expectedQrPath, qrPath)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestClient_ReadProcessedOperation(t *testing.T) {
|
|
|
|
var (
|
|
|
|
ctx = context.Background()
|
|
|
|
req = require.New(t)
|
|
|
|
ctrl = gomock.NewController(t)
|
|
|
|
)
|
|
|
|
defer ctrl.Finish()
|
|
|
|
|
|
|
|
state := clientMocks.NewMockState(ctrl)
|
2020-08-14 05:34:15 -07:00
|
|
|
keyStore := clientMocks.NewMockKeyStore(ctrl)
|
|
|
|
stg := storageMocks.NewMockStorage(ctrl)
|
2020-07-30 04:23:09 -07:00
|
|
|
qrProcessor := qrMocks.NewMockProcessor(ctrl)
|
|
|
|
|
2020-08-14 05:34:15 -07:00
|
|
|
clt, err := client.NewClient(
|
|
|
|
ctx,
|
|
|
|
"test_client",
|
|
|
|
nil,
|
|
|
|
state,
|
|
|
|
stg,
|
|
|
|
keyStore,
|
|
|
|
qrProcessor,
|
|
|
|
)
|
2020-07-30 04:23:09 -07:00
|
|
|
req.NoError(err)
|
|
|
|
|
|
|
|
operation := &client.Operation{
|
|
|
|
ID: "operation_id",
|
|
|
|
Type: client.DKGCommits,
|
|
|
|
Payload: []byte("operation_payload"),
|
|
|
|
Result: []byte("operation_result"),
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}
|
|
|
|
processedOperation := &client.Operation{
|
|
|
|
ID: "operation_id",
|
|
|
|
Type: client.DKGCommits,
|
|
|
|
Payload: []byte("operation_payload"),
|
|
|
|
Result: []byte("operation_result"),
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}
|
|
|
|
processedOperationBz, err := json.Marshal(processedOperation)
|
|
|
|
req.NoError(err)
|
|
|
|
|
2020-07-30 04:27:47 -07:00
|
|
|
qrProcessor.EXPECT().ReadQR().Return(processedOperationBz, nil).Times(1)
|
2020-07-30 04:23:09 -07:00
|
|
|
state.EXPECT().GetOperationByID(processedOperation.ID).Times(1).Return(operation, nil)
|
|
|
|
state.EXPECT().DeleteOperation(processedOperation.ID).Times(1)
|
2020-08-14 05:34:15 -07:00
|
|
|
stg.EXPECT().Send(gomock.Any()).Times(1)
|
|
|
|
|
|
|
|
keyPair := client.NewKeyPair()
|
|
|
|
keyStore.EXPECT().LoadKeys("test_client", "").Times(1).Return(keyPair, nil)
|
|
|
|
|
2020-07-30 04:23:09 -07:00
|
|
|
err = clt.ReadProcessedOperation()
|
|
|
|
req.NoError(err)
|
2020-07-30 03:29:47 -07:00
|
|
|
}
|