go-ethereum/swarm/network/pss_test.go
2017-05-06 14:23:38 +01:00

207 lines
4.5 KiB
Go

package network
import (
"bytes"
"testing"
"time"
//"github.com/ethereum/go-ethereum/logger"
//"github.com/ethereum/go-ethereum/logger/glog"
"github.com/ethereum/go-ethereum/p2p/adapters"
"github.com/ethereum/go-ethereum/p2p/protocols"
"github.com/ethereum/go-ethereum/p2p/simulations"
p2ptest "github.com/ethereum/go-ethereum/p2p/testing"
)
type pssTester struct {
*p2ptest.ProtocolTester
ct *protocols.CodeMap
*Pss
}
func TestPssTwoToSelf(t *testing.T) {
addr := RandomAddr()
pt := newPssTester(t, addr, 2)
defer pt.Stop()
payload := []byte("foo42")
subpeermsgcode, found := pt.ct.GetCode(&subPeersMsg{})
if !found {
t.Fatalf("peerMsg not defined")
}
pssmsgcode, found := pt.ct.GetCode(&PssMsg{})
if !found {
t.Fatalf("PssMsg not defined")
}
hs_pivot := correctBzzHandshake(addr)
for _, id := range pt.Ids {
hs_sim := correctBzzHandshake(NewPeerAddrFromNodeId(id))
<-pt.GetPeer(id).Connc
err := pt.TestExchanges(bzzHandshakeExchange(hs_pivot, hs_sim, id)...)
if err != nil {
t.Fatalf("Handshake fail: %v", err)
}
err = pt.TestExchanges(
p2ptest.Exchange{
Expects: []p2ptest.Expect{
p2ptest.Expect{
Code: subpeermsgcode,
Msg: &subPeersMsg{},
Peer: id,
},
},
},
)
if err != nil {
t.Fatalf("Subpeersmsg to peer %v fail: %v", id, err)
}
}
err := pt.TestExchanges(
p2ptest.Exchange{
Triggers: []p2ptest.Trigger{
p2ptest.Trigger{
Code: pssmsgcode,
Msg: &PssMsg{
To: addr.OverlayAddr(),
Data: payload,
},
Peer: pt.Ids[0],
},
},
},
)
if err != nil {
t.Fatalf("PssMsg sending %v to %v (pivot) fail: %v", pt.Ids[0], addr.OverlayAddr(), err)
}
alarm := time.NewTimer(1000 * time.Millisecond)
select {
case data := <-pt.C:
if !bytes.Equal(data, payload) {
t.Fatalf("Data transfer failed, expected: %v, got: %v", payload, data)
}
case <-alarm.C:
t.Fatalf("Pivot receive of PssMsg from %v timeout", pt.Ids[0])
}
}
func TestPssTwoRelaySelf(t *testing.T) {
// <-(chan bool)(nil)
addr := RandomAddr()
pt := newPssTester(t, addr, 2)
defer pt.Stop()
subpeermsgcode, found := pt.ct.GetCode(&subPeersMsg{})
if !found {
t.Fatalf("peerMsg not defined")
}
pssmsgcode, found := pt.ct.GetCode(&PssMsg{})
if !found {
t.Fatalf("PssMsg not defined")
}
hs_pivot := correctBzzHandshake(addr)
for _, id := range pt.Ids {
hs_sim := correctBzzHandshake(NewPeerAddrFromNodeId(id))
<-pt.GetPeer(id).Connc
err := pt.TestExchanges(bzzHandshakeExchange(hs_pivot, hs_sim, id)...)
if err != nil {
t.Fatalf("Handshake fail: %v", err)
}
err = pt.TestExchanges(
p2ptest.Exchange{
Expects: []p2ptest.Expect{
p2ptest.Expect{
Code: subpeermsgcode,
Msg: &subPeersMsg{},
Peer: id,
},
},
},
)
if err != nil {
t.Fatalf("Subpeersmsg to peer %v fail: %v", id, err)
}
}
err := pt.TestExchanges(
p2ptest.Exchange{
Expects: []p2ptest.Expect{
p2ptest.Expect{
Code: pssmsgcode,
Msg: &PssMsg{
To: pt.Ids[0].Bytes(),
Data: []byte("foo42"),
},
Peer: pt.Ids[0],
},
},
Triggers: []p2ptest.Trigger{
p2ptest.Trigger{
Code: pssmsgcode,
Msg: &PssMsg{
To: pt.Ids[0].Bytes(),
Data: []byte("foo42"),
},
Peer: pt.Ids[1],
},
},
},
)
if err != nil {
t.Fatalf("PssMsg routing from %v to %v fail: %v", pt.Ids[0], pt.Ids[1], err)
}
}
func newPssTester(t *testing.T, addr *peerAddr, n int) *pssTester {
return newPssBaseTester(t, addr, n)
}
func newPssBaseTester(t *testing.T, addr *peerAddr, n int) *pssTester {
ct := BzzCodeMap()
ct.Register(&PssMsg{})
ct.Register(&peersMsg{})
ct.Register(&getPeersMsg{})
ct.Register(&subPeersMsg{}) // why is this public?
simPipe := adapters.NewSimPipe
kp := NewKadParams()
kp.MinProxBinSize = 3
to := NewKademlia(addr.OverlayAddr(), kp)
pp := NewHive(NewHiveParams(), to)
ps := NewPss(to, addr.OverlayAddr())
net := simulations.NewNetwork(&simulations.NetworkConfig{})
naf := func(conf *simulations.NodeConfig) adapters.NodeAdapter {
na := adapters.NewSimNode(conf.Id, net, simPipe)
return na
}
net.SetNaf(naf)
srv := func(p Peer) error {
p.Register(&PssMsg{}, ps.HandlePssMsg)
pp.Add(p)
p.DisconnectHook(func(err error) {
pp.Remove(p)
})
return nil
}
protocall := func(na adapters.NodeAdapter) adapters.ProtoCall {
protocol := Bzz(addr.OverlayAddr(), na, ct, srv, nil, nil)
return protocol.Run
}
s := p2ptest.NewProtocolTester(t, NodeId(addr), n, protocall)
return &pssTester{
ProtocolTester: s,
ct: ct,
Pss: ps,
}
}