whisper: start adding integration tests

This commit is contained in:
Péter Szilágyi 2015-04-13 13:15:01 +03:00
parent 9a53390f49
commit 89358d25a4

View File

@ -4,35 +4,135 @@ import (
"fmt" "fmt"
"testing" "testing"
"time" "time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/p2p/nat"
) )
func TestEvent(t *testing.T) { type testNode struct {
res := make(chan *Message, 1) server *p2p.Server
whisper := New() client *Whisper
id := whisper.NewIdentity() }
whisper.Watch(Filter{
To: &id.PublicKey,
Fn: func(msg *Message) {
res <- msg
},
})
msg := NewMessage([]byte(fmt.Sprintf("Hello world. This is whisper-go. Incase you're wondering; the time is %v", time.Now()))) func startNodes(n int) ([]*testNode, error) {
envelope, err := msg.Wrap(DefaultProofOfWork, Options{ cluster := make([]*testNode, 0, n)
TTL: DefaultTimeToLive, for i := 0; i < n; i++ {
From: id, shh := New()
To: &id.PublicKey,
}) // Generate the node identity
if err != nil { key, err := crypto.GenerateKey()
fmt.Println(err) if err != nil {
t.FailNow() return nil, err
}
name := common.MakeName(fmt.Sprintf("whisper-go-test-%d", i), "1.0")
// Create an Ethereum server to communicate through
server := &p2p.Server{
PrivateKey: key,
MaxPeers: 10,
Name: name,
Protocols: []p2p.Protocol{shh.Protocol()},
ListenAddr: fmt.Sprintf(":%d", 30300+i),
NAT: nat.Any(),
}
if err := server.Start(); err != nil {
return nil, err
}
// Peer online, store and iterate
cluster = append(cluster, &testNode{
server: server,
client: shh,
})
} }
return cluster, nil
}
tick := time.NewTicker(time.Second) func stopNodes(cluster []*testNode) {
whisper.postEvent(envelope) for _, node := range cluster {
select { node.server.Stop()
case <-res: }
case <-tick.C: }
t.Error("did not receive message")
func TestSelfMessage(t *testing.T) {
cluster, err := startNodes(1)
if err != nil {
t.Fatalf("failed to boot test cluster: %v", err)
}
defer stopNodes(cluster)
client := cluster[0].client
// Start watching for self messages, signal any arrivals
self := client.NewIdentity()
done := make(chan struct{})
client.Watch(Filter{
To: &self.PublicKey,
Fn: func(msg *Message) {
close(done)
},
})
// Send a dummy message to oneself
msg := NewMessage([]byte("hello whisper"))
envelope, err := msg.Wrap(DefaultProofOfWork, Options{
From: self,
To: &self.PublicKey,
TTL: DefaultTimeToLive,
})
if err != nil {
t.Fatalf("failed to wrap message: %v", err)
}
// Dump the message into the system and wait for it to pop back out
if err := client.Send(envelope); err != nil {
t.Fatalf("failed to send self-message: %v", err)
}
select {
case <-done:
case <-time.After(time.Second):
t.Fatalf("self-message receive timeout")
}
}
func TestDirectMessage(t *testing.T) {
cluster, err := startNodes(2)
if err != nil {
t.Fatalf("failed to boot test cluster: %v", err)
}
defer stopNodes(cluster)
sender := cluster[0].client
senderId := sender.NewIdentity()
recipient := cluster[1].client
recipientId := recipient.NewIdentity()
// Watch for arriving messages on the recipient
done := make(chan struct{})
recipient.Watch(Filter{
To: &recipientId.PublicKey,
Fn: func(msg *Message) {
close(done)
},
})
// Send a dummy message from the sender
msg := NewMessage([]byte("hello whisper"))
envelope, err := msg.Wrap(DefaultProofOfWork, Options{
From: senderId,
To: &recipientId.PublicKey,
TTL: DefaultTimeToLive,
})
if err != nil {
t.Fatalf("failed to wrap message: %v", err)
}
if err := sender.Send(envelope); err != nil {
t.Fatalf("failed to send direct message: %v", err)
}
// Wait for an arrival or a timeout
select {
case <-done:
case <-time.After(time.Second):
t.Fatalf("direct message receive timeout")
} }
} }