dasy/client/client_test.go

97 lines
2.1 KiB
Go

package client
import (
"crypto/ecdsa"
"crypto/rand"
"io/ioutil"
"log"
"os"
"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"
"github.com/vacp2p/mvds/state"
)
func TestMain(m *testing.M) {
log.SetOutput(ioutil.Discard)
os.Exit(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_Post(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
node := internal.NewMockDataSyncNode(ctrl)
identity, _ := ecdsa.GenerateKey(secp256k1.S256(), rand.Reader)
client := Client{
node: node,
identity: identity,
}
chat := Chat([32]byte{0x01, 0x2, 0x3, 0x4})
msgid := state.MessageID([32]byte{0x01, 0x2, 0x3})
node.EXPECT().AppendMessage(state.GroupID(chat), gomock.Any()).Return(msgid, nil)
ret, _ := client.Post(chat, []byte("string"))
if msgid != ret {
t.Error("returned message ID does not match expected")
}
}
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 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
}