Files
dasy/client/client_test.go
Dean Eigenmann ae2fb13f53 feature/payloads (#7)
* started working on payload concept

* added crypto

* moved into new package, added feed

* added nicer feed stuff

* minor readme for now

* subscribe implemented badly

* doc

* doc block

* cleaned up a little

* making a mutex

* mock, empty test

* test wrapper

* started playing around

* updated mock

* formatted

* updated

* updated interface

* updated

* updated

* updated mock, rewrote test stuff

* todos

* added tests

* reuse

* dont need var
2019-08-07 14:31:32 +02:00

108 lines
2.2 KiB
Go

package client
import (
"crypto/ecdsa"
"crypto/rand"
"io/ioutil"
"log"
"reflect"
"testing"
"github.com/ethereum/go-ethereum/crypto/secp256k1"
"github.com/golang/mock/gomock"
"github.com/golang/protobuf/proto"
"github.com/vacp2p/dasy/client/internal"
"github.com/vacp2p/dasy/crypto"
"github.com/vacp2p/dasy/event"
"github.com/vacp2p/dasy/protobuf"
mvdsproto "github.com/vacp2p/mvds/protobuf"
)
func TestMain(m *testing.M) {
log.SetOutput(ioutil.Discard)
m.Run()
}
// @todo think about turning feed into an interface so we can mock it and ensure its never called when sigs fail
func TestClient_Listen_MessageSentToFeed(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
node := internal.NewMockDataSyncNode(ctrl)
client := Client{
node: node,
feeds: make(map[protobuf.Message_MessageType]*event.Feed),
}
sub := make(chan mvdsproto.Message)
node.EXPECT().Subscribe().Return(sub)
go client.Listen()
msg := createMessage()
ok := make(chan event.Payload)
client.Feed(msg.MessageType).Subscribe(ok)
val, _ := proto.Marshal(msg)
sub<-mvdsproto.Message{
Body: val,
}
received := <-ok
if !reflect.DeepEqual(received.Body, msg.Body) {
t.Error("expected message did not equal received")
}
}
func TestClient_Listen_RequestsMissingParent(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
node := internal.NewMockDataSyncNode(ctrl)
store := internal.NewMockMessageStore(ctrl)
client := Client{
node: node,
store: store,
feeds: make(map[protobuf.Message_MessageType]*event.Feed),
}
sub := make(chan mvdsproto.Message)
node.EXPECT().Subscribe().Return(sub)
store.EXPECT().Has(gomock.Any()).Return(false, nil)
node.EXPECT().RequestMessage(gomock.Any(), gomock.Any()).Return(nil)
go client.Listen()
msg := createMessage()
msg.PreviousMessage = []byte("parent")
ok := make(chan event.Payload)
client.Feed(msg.MessageType).Subscribe(ok)
val, _ := proto.Marshal(msg)
sub<-mvdsproto.Message{
Body: val,
}
<-ok
}
func createMessage() *protobuf.Message {
msg := &protobuf.Message{
MessageType: protobuf.Message_POST,
Body: []byte("hi"),
}
identity, _ := ecdsa.GenerateKey(secp256k1.S256(), rand.Reader)
_ = crypto.Sign(identity, msg)
return msg
}