This commit is contained in:
programmer10110 2020-09-08 15:30:55 +03:00
parent 05eb207b96
commit 151bab5121
1 changed files with 35 additions and 41 deletions

View File

@ -1,4 +1,4 @@
package main package client
import ( import (
"bytes" "bytes"
@ -6,24 +6,21 @@ import (
"crypto/md5" "crypto/md5"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/depools/dc4bc/client/types"
_ "image/jpeg"
"io/ioutil"
"log"
"net/http"
"sync"
"time"
"github.com/depools/dc4bc/airgapped" "github.com/depools/dc4bc/airgapped"
"github.com/depools/dc4bc/client" "github.com/depools/dc4bc/client/types"
"github.com/depools/dc4bc/fsm/types/requests" "github.com/depools/dc4bc/fsm/types/requests"
"github.com/depools/dc4bc/qr" "github.com/depools/dc4bc/qr"
"github.com/depools/dc4bc/storage" "github.com/depools/dc4bc/storage"
"io/ioutil"
"log"
"net/http"
"testing"
"time"
) )
type node struct { type node struct {
client client.Poller client Poller
keyPair *client.KeyPair keyPair *KeyPair
air *airgapped.AirgappedMachine air *airgapped.AirgappedMachine
listenAddr string listenAddr string
} }
@ -40,7 +37,7 @@ func getOperations(url string) (*OperationsResponse, error) {
defer resp.Body.Close() defer resp.Body.Close()
responseBody, err := ioutil.ReadAll(resp.Body) responseBody, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
log.Fatalf("failed to read body %v", err) return nil, fmt.Errorf("failed to read body %v", err)
} }
var response OperationsResponse var response OperationsResponse
@ -62,10 +59,10 @@ func handleProcessedOperation(url string, operation types.Operation) error {
defer resp.Body.Close() defer resp.Body.Close()
responseBody, err := ioutil.ReadAll(resp.Body) responseBody, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
log.Fatalf("failed to read body %v", err) return fmt.Errorf("failed to read body %v", err)
} }
var response client.Response var response Response
if err = json.Unmarshal(responseBody, &response); err != nil { if err = json.Unmarshal(responseBody, &response); err != nil {
return fmt.Errorf("failed to unmarshal response: %w", err) return fmt.Errorf("failed to unmarshal response: %w", err)
} }
@ -75,11 +72,11 @@ func handleProcessedOperation(url string, operation types.Operation) error {
return nil return nil
} }
func (n *node) run() { func (n *node) run(t *testing.T) {
for { for {
operationsResponse, err := getOperations(fmt.Sprintf("http://%s/getOperations", n.listenAddr)) operationsResponse, err := getOperations(fmt.Sprintf("http://%s/getOperations", n.listenAddr))
if err != nil { if err != nil {
log.Fatalf("failed to get operations: %v", err) t.Fatalf("failed to get operations: %v", err)
} }
operations := operationsResponse.Result operations := operationsResponse.Result
@ -111,7 +108,7 @@ func (n *node) run() {
} }
} }
func main() { func TestFullFlow(t *testing.T) {
var numNodes = 4 var numNodes = 4
var threshold = 3 var threshold = 3
var storagePath = "/tmp/dc4bc_storage" var storagePath = "/tmp/dc4bc_storage"
@ -120,32 +117,32 @@ func main() {
for nodeID := 0; nodeID < numNodes; nodeID++ { for nodeID := 0; nodeID < numNodes; nodeID++ {
var ctx = context.Background() var ctx = context.Background()
var userName = fmt.Sprintf("node_%d", nodeID) var userName = fmt.Sprintf("node_%d", nodeID)
var state, err = client.NewLevelDBState(fmt.Sprintf("/tmp/dc4bc_node_%d_state", nodeID)) var state, err = NewLevelDBState(fmt.Sprintf("/tmp/dc4bc_node_%d_state", nodeID))
if err != nil { if err != nil {
log.Fatalf("node %d failed to init state: %v\n", nodeID, err) t.Fatalf("node %d failed to init state: %v\n", nodeID, err)
} }
stg, err := storage.NewFileStorage(storagePath) stg, err := storage.NewFileStorage(storagePath)
if err != nil { if err != nil {
log.Fatalf("node %d failed to init storage: %v\n", nodeID, err) t.Fatalf("node %d failed to init storage: %v\n", nodeID, err)
} }
keyStore, err := client.NewLevelDBKeyStore(userName, fmt.Sprintf("/tmp/dc4bc_node_%d_key_store", nodeID)) keyStore, err := NewLevelDBKeyStore(userName, fmt.Sprintf("/tmp/dc4bc_node_%d_key_store", nodeID))
if err != nil { if err != nil {
log.Fatalf("Failed to init key store: %v", err) t.Fatalf("Failed to init key store: %v", err)
} }
keyPair := client.NewKeyPair() keyPair := NewKeyPair()
if err := keyStore.PutKeys(userName, keyPair); err != nil { if err := keyStore.PutKeys(userName, keyPair); err != nil {
log.Fatalf("Failed to PutKeys: %v\n", err) t.Fatalf("Failed to PutKeys: %v\n", err)
} }
airgappedMachine, err := airgapped.NewAirgappedMachine(fmt.Sprintf("/tmp/dc4bc_node_%d_airgapped_db", nodeID)) airgappedMachine, err := airgapped.NewAirgappedMachine(fmt.Sprintf("/tmp/dc4bc_node_%d_airgapped_db", nodeID))
if err != nil { if err != nil {
log.Fatalf("Failed to create airgapped machine: %v", err) t.Fatalf("Failed to create airgapped machine: %v", err)
} }
clt, err := client.NewClient( clt, err := NewClient(
ctx, ctx,
userName, userName,
state, state,
@ -154,7 +151,7 @@ func main() {
qr.NewCameraProcessor(), qr.NewCameraProcessor(),
) )
if err != nil { if err != nil {
log.Fatalf("node %d failed to init client: %v\n", nodeID, err) t.Fatalf("node %d failed to init client: %v\n", nodeID, err)
} }
airgappedMachine.SetAddress(clt.GetAddr()) airgappedMachine.SetAddress(clt.GetAddr())
@ -171,15 +168,15 @@ func main() {
for nodeID, n := range nodes { for nodeID, n := range nodes {
go func(nodeID int, node *node) { go func(nodeID int, node *node) {
if err := node.client.StartHTTPServer(node.listenAddr); err != nil { if err := node.client.StartHTTPServer(node.listenAddr); err != nil {
log.Fatalf("failed to start HTTP server for nodeID #%d: %v\n", nodeID, err) t.Fatalf("failed to start HTTP server for nodeID #%d: %v\n", nodeID, err)
} }
}(nodeID, n) }(nodeID, n)
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
go nodes[nodeID].run() go nodes[nodeID].run(t)
go func(nodeID int, node client.Poller) { go func(nodeID int, node Poller) {
if err := node.Poll(); err != nil { if err := node.Poll(); err != nil {
log.Fatalf("client %d poller failed: %v\n", nodeID, err) t.Fatalf("client %d poller failed: %v\n", nodeID, err)
} }
}(nodeID, n.client) }(nodeID, n.client)
@ -206,12 +203,12 @@ func main() {
} }
messageDataBz, err := json.Marshal(messageData) messageDataBz, err := json.Marshal(messageData)
if err != nil { if err != nil {
log.Fatalf("failed to marshal SignatureProposalParticipantsListRequest: %v\n", err) t.Fatalf("failed to marshal SignatureProposalParticipantsListRequest: %v\n", err)
} }
if _, err := http.Post(fmt.Sprintf("http://localhost:%d/startDKG", startingPort-1), if _, err := http.Post(fmt.Sprintf("http://localhost:%d/startDKG", startingPort-1),
"application/json", bytes.NewReader(messageDataBz)); err != nil { "application/json", bytes.NewReader(messageDataBz)); err != nil {
log.Fatalf("failed to send HTTP request to start DKG: %v\n", err) t.Fatalf("failed to send HTTP request to start DKG: %v\n", err)
} }
// i haven't a better idea to test signing without big changes in the client code // i haven't a better idea to test signing without big changes in the client code
@ -226,21 +223,18 @@ func main() {
} }
messageDataSignBz, err := json.Marshal(messageDataSign) messageDataSignBz, err := json.Marshal(messageDataSign)
if err != nil { if err != nil {
log.Fatalf("failed to marshal SigningProposalStartRequest: %v\n", err) t.Fatalf("failed to marshal SigningProposalStartRequest: %v\n", err)
} }
messageDataBz, err = json.Marshal(map[string][]byte{"data": messageDataSignBz, messageDataBz, err = json.Marshal(map[string][]byte{"data": messageDataSignBz,
"dkgID": dkgRoundID[:]}) "dkgID": dkgRoundID[:]})
if err != nil { if err != nil {
log.Fatalf("failed to marshal SignatureProposalParticipantsListRequest: %v\n", err) t.Fatalf("failed to marshal SignatureProposalParticipantsListRequest: %v\n", err)
} }
if _, err := http.Post(fmt.Sprintf("http://localhost:%d/proposeSignMessage", startingPort-1), if _, err := http.Post(fmt.Sprintf("http://localhost:%d/proposeSignMessage", startingPort-1),
"application/json", bytes.NewReader(messageDataBz)); err != nil { "application/json", bytes.NewReader(messageDataBz)); err != nil {
log.Fatalf("failed to send HTTP request to sign message: %v\n", err) t.Fatalf("failed to send HTTP request to sign message: %v\n", err)
} }
time.Sleep(5 * time.Second)
var wg = sync.WaitGroup{}
wg.Add(1)
wg.Wait()
} }