mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 15:16:43 +00:00
207 lines
4.5 KiB
Go
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,
|
|
}
|
|
|
|
}
|