Skip to content

Commit e712b70

Browse files
aperonamnolash
authored andcommitted
pss: Port tests to network/simulation (ethersphere#1682)
* pss/pss_test.go Tests use swarm's network/simulation instead of go-ethereum's p2p/simulations. protocol_test and handshake_test modified to work with change in setupNetwork function
1 parent 8dfc16e commit e712b70

File tree

3 files changed

+87
-99
lines changed

3 files changed

+87
-99
lines changed

pss/handshake_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,11 @@ func testHandshake(t *testing.T) {
4545

4646
// set up two nodes directly connected
4747
// (we are not testing pss routing here)
48-
clients, err := setupNetwork(2, true)
48+
clients, closeSimFunc, err := setupNetwork(2, true)
4949
if err != nil {
5050
t.Fatal(err)
5151
}
52+
defer closeSimFunc()
5253

5354
var topic string
5455
err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42")

pss/protocol_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,12 @@ func testProtocol(t *testing.T) {
5454

5555
topic := PingTopic.String()
5656

57-
clients, err := setupNetwork(2, false)
57+
clients, closeSimFunc, err := setupNetwork(2, false)
5858
if err != nil {
5959
t.Fatal(err)
6060
}
61+
defer closeSimFunc()
62+
6163
var loaddrhex string
6264
err = clients[0].Call(&loaddrhex, "pss_baseAddr")
6365
if err != nil {

pss/pss_test.go

Lines changed: 82 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,8 @@ import (
2222
"crypto/ecdsa"
2323
"encoding/binary"
2424
"encoding/hex"
25-
"encoding/json"
2625
"flag"
2726
"fmt"
28-
"io/ioutil"
2927
"math/rand"
3028
"os"
3129
"strconv"
@@ -41,11 +39,12 @@ import (
4139
"github.com/ethereum/go-ethereum/node"
4240
"github.com/ethereum/go-ethereum/p2p"
4341
"github.com/ethereum/go-ethereum/p2p/enode"
44-
"github.com/ethereum/go-ethereum/p2p/simulations"
4542
"github.com/ethereum/go-ethereum/p2p/simulations/adapters"
4643
"github.com/ethereum/go-ethereum/rpc"
4744
whisper "github.com/ethereum/go-ethereum/whisper/whisperv6"
45+
4846
"github.com/ethersphere/swarm/network"
47+
"github.com/ethersphere/swarm/network/simulation"
4948
"github.com/ethersphere/swarm/p2p/protocols"
5049
"github.com/ethersphere/swarm/pot"
5150
"github.com/ethersphere/swarm/state"
@@ -68,8 +67,6 @@ var (
6867
func init() {
6968
flag.Parse()
7069
rand.Seed(time.Now().Unix())
71-
72-
adapters.RegisterServices(newServices(false))
7370
initTest()
7471
}
7572

@@ -879,10 +876,11 @@ func TestRawAllow(t *testing.T) {
879876

880877
// tests that the API layer can handle edge case values
881878
func TestApi(t *testing.T) {
882-
clients, err := setupNetwork(2, true)
879+
clients, closeSimFunc, err := setupNetwork(2, true)
883880
if err != nil {
884881
t.Fatal(err)
885882
}
883+
defer closeSimFunc()
886884

887885
topic := "0xdeadbeef"
888886

@@ -920,10 +918,11 @@ func testSendRaw(t *testing.T) {
920918
addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0)
921919
log.Info("raw send test", "addrsize", addrsize)
922920

923-
clients, err := setupNetwork(2, true)
921+
clients, closeSimFunc, err := setupNetwork(2, true)
924922
if err != nil {
925923
t.Fatal(err)
926924
}
925+
defer closeSimFunc()
927926

928927
topic := "0xdeadbeef"
929928

@@ -1002,10 +1001,11 @@ func testSendSym(t *testing.T) {
10021001
addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0)
10031002
log.Info("sym send test", "addrsize", addrsize)
10041003

1005-
clients, err := setupNetwork(2, false)
1004+
clients, closeSimFunc, err := setupNetwork(2, false)
10061005
if err != nil {
10071006
t.Fatal(err)
10081007
}
1008+
defer closeSimFunc()
10091009

10101010
var topic string
10111011
err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42")
@@ -1117,10 +1117,11 @@ func testSendAsym(t *testing.T) {
11171117
addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0)
11181118
log.Info("asym send test", "addrsize", addrsize)
11191119

1120-
clients, err := setupNetwork(2, false)
1120+
clients, closeSimFunc, err := setupNetwork(2, false)
11211121
if err != nil {
11221122
t.Fatal(err)
11231123
}
1124+
defer closeSimFunc()
11241125

11251126
var topic string
11261127
err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42")
@@ -1278,37 +1279,20 @@ func testNetwork(t *testing.T) {
12781279

12791280
trigger := make(chan enode.ID)
12801281

1281-
var a adapters.NodeAdapter
1282+
var sim = &simulation.Simulation{}
12821283
if adapter == "exec" {
1283-
dirname, err := ioutil.TempDir(".", "")
1284-
if err != nil {
1285-
t.Fatal(err)
1286-
}
1287-
a = adapters.NewExecAdapter(dirname)
1288-
} else if adapter == "tcp" {
1289-
a = adapters.NewTCPAdapter(newServices(false))
1290-
} else if adapter == "sim" {
1291-
a = adapters.NewSimAdapter(newServices(false))
1292-
}
1293-
net := simulations.NewNetwork(a, &simulations.NetworkConfig{
1294-
ID: "0",
1295-
})
1296-
defer net.Shutdown()
1297-
1298-
f, err := os.Open(fmt.Sprintf("testdata/snapshot_%d.json", nodecount))
1299-
if err != nil {
1300-
t.Fatal(err)
1301-
}
1302-
jsonbyte, err := ioutil.ReadAll(f)
1303-
if err != nil {
1304-
t.Fatal(err)
1284+
sim, _ = simulation.NewExec(newServices(false))
1285+
} else if adapter == "tcp" || adapter == "sim" {
1286+
sim = simulation.NewInProc(newServices(false))
13051287
}
1306-
var snap simulations.Snapshot
1307-
err = json.Unmarshal(jsonbyte, &snap)
1308-
if err != nil {
1309-
t.Fatal(err)
1310-
}
1311-
err = net.Load(&snap)
1288+
defer sim.Close()
1289+
1290+
net := sim.Net
1291+
1292+
ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second)
1293+
defer cancel()
1294+
1295+
err := sim.UploadSnapshot(ctx, fmt.Sprintf("testdata/snapshot_%d.json", nodecount))
13121296
if err != nil {
13131297
//TODO: Fix p2p simulation framework to not crash when loading 32-nodes
13141298
//t.Fatal(err)
@@ -1412,8 +1396,6 @@ func testNetwork(t *testing.T) {
14121396
}
14131397

14141398
finalmsgcount := 0
1415-
ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second)
1416-
defer cancel()
14171399
outer:
14181400
for i := 0; i < int(msgcount); i++ {
14191401
select {
@@ -1444,10 +1426,11 @@ outer:
14441426
func TestDeduplication(t *testing.T) {
14451427
var err error
14461428

1447-
clients, err := setupNetwork(3, false)
1429+
clients, closeSimFunc, err := setupNetwork(3, false)
14481430
if err != nil {
14491431
t.Fatal(err)
14501432
}
1433+
defer closeSimFunc()
14511434

14521435
var addrsize = 32
14531436
var loaddrhex string
@@ -1780,52 +1763,37 @@ func benchmarkSymkeyBruteforceSameaddr(b *testing.B) {
17801763
// setup simulated network with bzz/discovery and pss services.
17811764
// connects nodes in a circle
17821765
// if allowRaw is set, omission of builtin pss encryption is enabled (see PssParams)
1783-
func setupNetwork(numnodes int, allowRaw bool) (clients []*rpc.Client, err error) {
1784-
nodes := make([]*simulations.Node, numnodes)
1766+
func setupNetwork(numnodes int, allowRaw bool) (clients []*rpc.Client, closeSimFunc func(), err error) {
17851767
clients = make([]*rpc.Client, numnodes)
17861768
if numnodes < 2 {
1787-
return nil, fmt.Errorf("Minimum two nodes in network")
1769+
return nil, nil, fmt.Errorf("minimum two nodes in network")
17881770
}
1789-
adapter := adapters.NewSimAdapter(newServices(allowRaw))
1790-
net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{
1791-
ID: "0",
1792-
DefaultService: "bzz",
1793-
})
1794-
for i := 0; i < numnodes; i++ {
1795-
nodeconf := adapters.RandomNodeConfig()
1796-
nodeconf.Services = []string{"bzz", protocolName}
1797-
nodes[i], err = net.NewNodeWithConfig(nodeconf)
1798-
if err != nil {
1799-
return nil, fmt.Errorf("error creating node 1: %v", err)
1800-
}
1801-
err = net.Start(nodes[i].ID())
1802-
if err != nil {
1803-
return nil, fmt.Errorf("error starting node 1: %v", err)
1804-
}
1805-
if i > 0 {
1806-
err = net.Connect(nodes[i].ID(), nodes[i-1].ID())
1807-
if err != nil {
1808-
return nil, fmt.Errorf("error connecting nodes: %v", err)
1809-
}
1810-
}
1811-
clients[i], err = nodes[i].Client()
1812-
if err != nil {
1813-
return nil, fmt.Errorf("create node 1 rpc client fail: %v", err)
1814-
}
1771+
sim := simulation.NewInProc(newServices(allowRaw))
1772+
closeSimFunc = sim.Close
1773+
if numnodes == 2 {
1774+
_, err = sim.AddNodesAndConnectChain(numnodes)
1775+
1776+
} else {
1777+
_, err = sim.AddNodesAndConnectRing(numnodes)
1778+
}
1779+
if err != nil {
1780+
return nil, nil, err
18151781
}
1816-
if numnodes > 2 {
1817-
err = net.Connect(nodes[0].ID(), nodes[len(nodes)-1].ID())
1782+
nodes := sim.Net.GetNodes()
1783+
for id, node := range nodes {
1784+
client, err := node.Client()
18181785
if err != nil {
1819-
return nil, fmt.Errorf("error connecting first and last nodes")
1786+
return nil, nil, fmt.Errorf("error getting the nodes clients")
18201787
}
1788+
clients[id] = client
18211789
}
1822-
return clients, nil
1790+
return clients, closeSimFunc, nil
18231791
}
18241792

1825-
func newServices(allowRaw bool) adapters.Services {
1793+
func newServices(allowRaw bool) map[string]simulation.ServiceFunc {
18261794
stateStore := state.NewInmemoryStore()
18271795
kademlias := make(map[enode.ID]*network.Kademlia)
1828-
kademlia := func(id enode.ID) *network.Kademlia {
1796+
kademlia := func(id enode.ID, bzzKey []byte) *network.Kademlia {
18291797
if k, ok := kademlias[id]; ok {
18301798
return k
18311799
}
@@ -1836,11 +1804,30 @@ func newServices(allowRaw bool) adapters.Services {
18361804
params.MaxRetries = 1000
18371805
params.RetryExponent = 2
18381806
params.RetryInterval = 1000000
1839-
kademlias[id] = network.NewKademlia(id[:], params)
1807+
kademlias[id] = network.NewKademlia(bzzKey, params)
18401808
return kademlias[id]
18411809
}
1842-
return adapters.Services{
1843-
protocolName: func(ctx *adapters.ServiceContext) (node.Service, error) {
1810+
return map[string]simulation.ServiceFunc{
1811+
"bzz": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) {
1812+
addr := network.NewAddr(ctx.Config.Node())
1813+
bzzPrivateKey, err := simulation.BzzPrivateKeyFromConfig(ctx.Config)
1814+
if err != nil {
1815+
return nil, nil, err
1816+
}
1817+
addr.OAddr = network.PrivateKeyToBzzKey(bzzPrivateKey)
1818+
bucket.Store(simulation.BucketKeyBzzPrivateKey, bzzPrivateKey)
1819+
hp := network.NewHiveParams()
1820+
hp.Discovery = false
1821+
config := &network.BzzConfig{
1822+
OverlayAddr: addr.Over(),
1823+
UnderlayAddr: addr.Under(),
1824+
HiveParams: hp,
1825+
}
1826+
pskad := kademlia(ctx.Config.ID, addr.OAddr)
1827+
bucket.Store(simulation.BucketKeyKademlia, pskad)
1828+
return network.NewBzz(config, pskad, stateStore, nil, nil), nil, nil
1829+
},
1830+
protocolName: func(ctx *adapters.ServiceContext, bucket *sync.Map) (node.Service, func(), error) {
18441831
// execadapter does not exec init()
18451832
initTest()
18461833

@@ -1850,25 +1837,30 @@ func newServices(allowRaw bool) adapters.Services {
18501837
privkey, err := w.GetPrivateKey(keys)
18511838
pssp := NewParams().WithPrivateKey(privkey)
18521839
pssp.AllowRaw = allowRaw
1853-
pskad := kademlia(ctx.Config.ID)
1840+
bzzPrivateKey, err := simulation.BzzPrivateKeyFromConfig(ctx.Config)
1841+
if err != nil {
1842+
return nil, nil, err
1843+
}
1844+
bzzKey := network.PrivateKeyToBzzKey(bzzPrivateKey)
1845+
pskad := kademlia(ctx.Config.ID, bzzKey)
1846+
bucket.Store(simulation.BucketKeyKademlia, pskad)
18541847
ps, err := New(pskad, pssp)
18551848
if err != nil {
1856-
return nil, err
1849+
return nil, nil, err
18571850
}
1858-
18591851
ping := &Ping{
18601852
OutC: make(chan bool),
18611853
Pong: true,
18621854
}
18631855
p2pp := NewPingProtocol(ping)
18641856
pp, err := RegisterProtocol(ps, &PingTopic, PingProtocol, p2pp, &ProtocolParams{Asymmetric: true})
18651857
if err != nil {
1866-
return nil, err
1858+
return nil, nil, err
18671859
}
18681860
if useHandshake {
18691861
SetHandshakeController(ps, NewHandshakeParams())
18701862
}
1871-
ps.Register(&PingTopic, &handler{
1863+
cleanupFunc := ps.Register(&PingTopic, &handler{
18721864
f: pp.Handle,
18731865
caps: &handlerCaps{
18741866
raw: true,
@@ -1885,18 +1877,8 @@ func newServices(allowRaw bool) adapters.Services {
18851877
protocol: pp,
18861878
run: p2pp.Run,
18871879
}
1888-
return ps, nil
1889-
},
1890-
"bzz": func(ctx *adapters.ServiceContext) (node.Service, error) {
1891-
addr := network.NewAddr(ctx.Config.Node())
1892-
hp := network.NewHiveParams()
1893-
hp.Discovery = false
1894-
config := &network.BzzConfig{
1895-
OverlayAddr: addr.Over(),
1896-
UnderlayAddr: addr.Under(),
1897-
HiveParams: hp,
1898-
}
1899-
return network.NewBzz(config, kademlia(ctx.Config.ID), stateStore, nil, nil), nil
1880+
return ps, cleanupFunc, nil
1881+
19001882
},
19011883
}
19021884
}
@@ -1919,7 +1901,10 @@ func newTestPss(privkey *ecdsa.PrivateKey, kad *network.Kademlia, ppextra *Param
19191901
if err != nil {
19201902
return nil
19211903
}
1922-
ps.Start(nil)
1904+
err = ps.Start(nil)
1905+
if err != nil {
1906+
return nil
1907+
}
19231908

19241909
return ps
19251910
}

0 commit comments

Comments
 (0)