Skip to content

Commit 1bc4bfe

Browse files
nonsensedshulyak
authored andcommitted
swarm/network: refactor simulation tests bootstrap (ethereum#18975)
(cherry picked from commit 597597e)
1 parent 7ef934e commit 1bc4bfe

9 files changed

+156
-247
lines changed

swarm/network/stream/common_test.go

+77
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,19 @@ import (
2626
"math/rand"
2727
"os"
2828
"strings"
29+
"sync"
2930
"sync/atomic"
3031
"time"
3132

3233
"github.com/ethereum/go-ethereum/log"
3334
"github.com/ethereum/go-ethereum/p2p/enode"
35+
"github.com/ethereum/go-ethereum/p2p/simulations/adapters"
3436
p2ptest "github.com/ethereum/go-ethereum/p2p/testing"
3537
"github.com/ethereum/go-ethereum/swarm/network"
3638
"github.com/ethereum/go-ethereum/swarm/network/simulation"
3739
"github.com/ethereum/go-ethereum/swarm/state"
3840
"github.com/ethereum/go-ethereum/swarm/storage"
41+
mockmem "github.com/ethereum/go-ethereum/swarm/storage/mock/mem"
3942
"github.com/ethereum/go-ethereum/swarm/testutil"
4043
colorable "github.com/mattn/go-colorable"
4144
)
@@ -66,6 +69,80 @@ func init() {
6669
log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true))))
6770
}
6871

72+
// newNetStoreAndDelivery is a default constructor for BzzAddr, NetStore and Delivery, used in Simulations
73+
func newNetStoreAndDelivery(ctx *adapters.ServiceContext, bucket *sync.Map) (*network.BzzAddr, *storage.NetStore, *Delivery, func(), error) {
74+
addr := network.NewAddr(ctx.Config.Node())
75+
76+
netStore, delivery, cleanup, err := netStoreAndDeliveryWithAddr(ctx, bucket, addr)
77+
if err != nil {
78+
return nil, nil, nil, nil, err
79+
}
80+
81+
netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New
82+
83+
return addr, netStore, delivery, cleanup, nil
84+
}
85+
86+
// newNetStoreAndDeliveryWithBzzAddr is a constructor for NetStore and Delivery, used in Simulations, accepting any BzzAddr
87+
func newNetStoreAndDeliveryWithBzzAddr(ctx *adapters.ServiceContext, bucket *sync.Map, addr *network.BzzAddr) (*storage.NetStore, *Delivery, func(), error) {
88+
netStore, delivery, cleanup, err := netStoreAndDeliveryWithAddr(ctx, bucket, addr)
89+
if err != nil {
90+
return nil, nil, nil, err
91+
}
92+
93+
netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New
94+
95+
return netStore, delivery, cleanup, nil
96+
}
97+
98+
// newNetStoreAndDeliveryWithRequestFunc is a constructor for NetStore and Delivery, used in Simulations, accepting any NetStore.RequestFunc
99+
func newNetStoreAndDeliveryWithRequestFunc(ctx *adapters.ServiceContext, bucket *sync.Map, rf network.RequestFunc) (*network.BzzAddr, *storage.NetStore, *Delivery, func(), error) {
100+
addr := network.NewAddr(ctx.Config.Node())
101+
102+
netStore, delivery, cleanup, err := netStoreAndDeliveryWithAddr(ctx, bucket, addr)
103+
if err != nil {
104+
return nil, nil, nil, nil, err
105+
}
106+
107+
netStore.NewNetFetcherFunc = network.NewFetcherFactory(rf, true).New
108+
109+
return addr, netStore, delivery, cleanup, nil
110+
}
111+
112+
func netStoreAndDeliveryWithAddr(ctx *adapters.ServiceContext, bucket *sync.Map, addr *network.BzzAddr) (*storage.NetStore, *Delivery, func(), error) {
113+
n := ctx.Config.Node()
114+
115+
store, datadir, err := createTestLocalStorageForID(n.ID(), addr)
116+
if *useMockStore {
117+
store, datadir, err = createMockStore(mockmem.NewGlobalStore(), n.ID(), addr)
118+
}
119+
if err != nil {
120+
return nil, nil, nil, err
121+
}
122+
localStore := store.(*storage.LocalStore)
123+
netStore, err := storage.NewNetStore(localStore, nil)
124+
if err != nil {
125+
return nil, nil, nil, err
126+
}
127+
128+
fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams())
129+
130+
kad := network.NewKademlia(addr.Over(), network.NewKadParams())
131+
delivery := NewDelivery(kad, netStore)
132+
133+
bucket.Store(bucketKeyStore, store)
134+
bucket.Store(bucketKeyDB, netStore)
135+
bucket.Store(bucketKeyDelivery, delivery)
136+
bucket.Store(bucketKeyFileStore, fileStore)
137+
138+
cleanup := func() {
139+
netStore.Close()
140+
os.RemoveAll(datadir)
141+
}
142+
143+
return netStore, delivery, cleanup, nil
144+
}
145+
69146
func newStreamerTester(registryOptions *RegistryOptions) (*p2ptest.ProtocolTester, *Registry, *storage.LocalStore, func(), error) {
70147
// setup
71148
addr := network.RandomAddr() // tested peers peer address

swarm/network/stream/delivery_test.go

+11-40
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"context"
2222
"errors"
2323
"fmt"
24-
"os"
2524
"sync"
2625
"sync/atomic"
2726
"testing"
@@ -457,39 +456,24 @@ func TestDeliveryFromNodes(t *testing.T) {
457456
func testDeliveryFromNodes(t *testing.T, nodes, chunkCount int, skipCheck bool) {
458457
sim := simulation.New(map[string]simulation.ServiceFunc{
459458
"streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) {
460-
node := ctx.Config.Node()
461-
addr := network.NewAddr(node)
462-
store, datadir, err := createTestLocalStorageForID(node.ID(), addr)
463-
if err != nil {
464-
return nil, nil, err
465-
}
466-
bucket.Store(bucketKeyStore, store)
467-
cleanup = func() {
468-
os.RemoveAll(datadir)
469-
store.Close()
470-
}
471-
localStore := store.(*storage.LocalStore)
472-
netStore, err := storage.NewNetStore(localStore, nil)
459+
addr, netStore, delivery, clean, err := newNetStoreAndDelivery(ctx, bucket)
473460
if err != nil {
474461
return nil, nil, err
475462
}
476463

477-
kad := network.NewKademlia(addr.Over(), network.NewKadParams())
478-
delivery := NewDelivery(kad, netStore)
479-
netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New
480-
481464
r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{
482465
SkipCheck: skipCheck,
483466
Syncing: SyncingDisabled,
484467
Retrieval: RetrievalEnabled,
485468
}, nil)
486469
bucket.Store(bucketKeyRegistry, r)
487470

488-
fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams())
489-
bucket.Store(bucketKeyFileStore, fileStore)
471+
cleanup = func() {
472+
r.Close()
473+
clean()
474+
}
490475

491476
return r, cleanup, nil
492-
493477
},
494478
})
495479
defer sim.Close()
@@ -644,38 +628,25 @@ func BenchmarkDeliveryFromNodesWithCheck(b *testing.B) {
644628
func benchmarkDeliveryFromNodes(b *testing.B, nodes, chunkCount int, skipCheck bool) {
645629
sim := simulation.New(map[string]simulation.ServiceFunc{
646630
"streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) {
647-
node := ctx.Config.Node()
648-
addr := network.NewAddr(node)
649-
store, datadir, err := createTestLocalStorageForID(node.ID(), addr)
631+
addr, netStore, delivery, clean, err := newNetStoreAndDelivery(ctx, bucket)
650632
if err != nil {
651633
return nil, nil, err
652634
}
653-
bucket.Store(bucketKeyStore, store)
654-
cleanup = func() {
655-
os.RemoveAll(datadir)
656-
store.Close()
657-
}
658-
localStore := store.(*storage.LocalStore)
659-
netStore, err := storage.NewNetStore(localStore, nil)
660-
if err != nil {
661-
return nil, nil, err
662-
}
663-
kad := network.NewKademlia(addr.Over(), network.NewKadParams())
664-
delivery := NewDelivery(kad, netStore)
665-
netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New
666635

667636
r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{
668637
SkipCheck: skipCheck,
669638
Syncing: SyncingDisabled,
670639
Retrieval: RetrievalDisabled,
671640
SyncUpdateDelay: 0,
672641
}, nil)
642+
bucket.Store(bucketKeyRegistry, r)
673643

674-
fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams())
675-
bucket.Store(bucketKeyFileStore, fileStore)
644+
cleanup = func() {
645+
r.Close()
646+
clean()
647+
}
676648

677649
return r, cleanup, nil
678-
679650
},
680651
})
681652
defer sim.Close()

swarm/network/stream/intervals_test.go

+6-22
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"encoding/binary"
2222
"errors"
2323
"fmt"
24-
"os"
2524
"sync"
2625
"sync/atomic"
2726
"testing"
@@ -31,7 +30,6 @@ import (
3130
"github.com/ethereum/go-ethereum/node"
3231
"github.com/ethereum/go-ethereum/p2p/enode"
3332
"github.com/ethereum/go-ethereum/p2p/simulations/adapters"
34-
"github.com/ethereum/go-ethereum/swarm/network"
3533
"github.com/ethereum/go-ethereum/swarm/network/simulation"
3634
"github.com/ethereum/go-ethereum/swarm/state"
3735
"github.com/ethereum/go-ethereum/swarm/storage"
@@ -62,26 +60,11 @@ func testIntervals(t *testing.T, live bool, history *Range, skipCheck bool) {
6260
externalStreamMaxKeys := uint64(100)
6361

6462
sim := simulation.New(map[string]simulation.ServiceFunc{
65-
"intervalsStreamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) {
66-
n := ctx.Config.Node()
67-
addr := network.NewAddr(n)
68-
store, datadir, err := createTestLocalStorageForID(n.ID(), addr)
63+
"intervalsStreamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (node.Service, func(), error) {
64+
addr, netStore, delivery, clean, err := newNetStoreAndDelivery(ctx, bucket)
6965
if err != nil {
7066
return nil, nil, err
7167
}
72-
bucket.Store(bucketKeyStore, store)
73-
cleanup = func() {
74-
store.Close()
75-
os.RemoveAll(datadir)
76-
}
77-
localStore := store.(*storage.LocalStore)
78-
netStore, err := storage.NewNetStore(localStore, nil)
79-
if err != nil {
80-
return nil, nil, err
81-
}
82-
kad := network.NewKademlia(addr.Over(), network.NewKadParams())
83-
delivery := NewDelivery(kad, netStore)
84-
netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New
8568

8669
r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{
8770
Retrieval: RetrievalDisabled,
@@ -97,11 +80,12 @@ func testIntervals(t *testing.T, live bool, history *Range, skipCheck bool) {
9780
return newTestExternalServer(t, externalStreamSessionAt, externalStreamMaxKeys, nil), nil
9881
})
9982

100-
fileStore := storage.NewFileStore(localStore, storage.NewFileStoreParams())
101-
bucket.Store(bucketKeyFileStore, fileStore)
83+
cleanup := func() {
84+
r.Close()
85+
clean()
86+
}
10287

10388
return r, cleanup, nil
104-
10589
},
10690
})
10791
defer sim.Close()

swarm/network/stream/snapshot_retrieval_test.go

+16-36
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package stream
1818
import (
1919
"context"
2020
"fmt"
21-
"os"
2221
"sync"
2322
"testing"
2423
"time"
@@ -27,7 +26,6 @@ import (
2726
"github.com/ethereum/go-ethereum/p2p/enode"
2827
"github.com/ethereum/go-ethereum/p2p/simulations/adapters"
2928
"github.com/ethereum/go-ethereum/swarm/log"
30-
"github.com/ethereum/go-ethereum/swarm/network"
3129
"github.com/ethereum/go-ethereum/swarm/network/simulation"
3230
"github.com/ethereum/go-ethereum/swarm/state"
3331
"github.com/ethereum/go-ethereum/swarm/storage"
@@ -105,43 +103,25 @@ func TestRetrieval(t *testing.T) {
105103
}
106104

107105
var retrievalSimServiceMap = map[string]simulation.ServiceFunc{
108-
"streamer": retrievalStreamerFunc,
109-
}
110-
111-
func retrievalStreamerFunc(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) {
112-
n := ctx.Config.Node()
113-
addr := network.NewAddr(n)
114-
store, datadir, err := createTestLocalStorageForID(n.ID(), addr)
115-
if err != nil {
116-
return nil, nil, err
117-
}
118-
bucket.Store(bucketKeyStore, store)
119-
120-
localStore := store.(*storage.LocalStore)
121-
netStore, err := storage.NewNetStore(localStore, nil)
122-
if err != nil {
123-
return nil, nil, err
124-
}
125-
kad := network.NewKademlia(addr.Over(), network.NewKadParams())
126-
delivery := NewDelivery(kad, netStore)
127-
netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New
128-
129-
r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{
130-
Retrieval: RetrievalEnabled,
131-
Syncing: SyncingAutoSubscribe,
132-
SyncUpdateDelay: 3 * time.Second,
133-
}, nil)
106+
"streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) {
107+
addr, netStore, delivery, clean, err := newNetStoreAndDelivery(ctx, bucket)
108+
if err != nil {
109+
return nil, nil, err
110+
}
134111

135-
fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams())
136-
bucket.Store(bucketKeyFileStore, fileStore)
112+
r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{
113+
Retrieval: RetrievalEnabled,
114+
Syncing: SyncingAutoSubscribe,
115+
SyncUpdateDelay: 3 * time.Second,
116+
}, nil)
137117

138-
cleanup = func() {
139-
os.RemoveAll(datadir)
140-
netStore.Close()
141-
r.Close()
142-
}
118+
cleanup = func() {
119+
r.Close()
120+
clean()
121+
}
143122

144-
return r, cleanup, nil
123+
return r, cleanup, nil
124+
},
145125
}
146126

147127
/*

swarm/network/stream/snapshot_sync_test.go

+18-33
Original file line numberDiff line numberDiff line change
@@ -107,42 +107,27 @@ func TestSyncingViaGlobalSync(t *testing.T) {
107107
}
108108

109109
var simServiceMap = map[string]simulation.ServiceFunc{
110-
"streamer": streamerFunc,
111-
}
110+
"streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) {
111+
addr, netStore, delivery, clean, err := newNetStoreAndDeliveryWithRequestFunc(ctx, bucket, dummyRequestFromPeers)
112+
if err != nil {
113+
return nil, nil, err
114+
}
112115

113-
func streamerFunc(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) {
114-
n := ctx.Config.Node()
115-
addr := network.NewAddr(n)
116-
store, datadir, err := createTestLocalStorageForID(n.ID(), addr)
117-
if err != nil {
118-
return nil, nil, err
119-
}
120-
bucket.Store(bucketKeyStore, store)
121-
localStore := store.(*storage.LocalStore)
122-
netStore, err := storage.NewNetStore(localStore, nil)
123-
if err != nil {
124-
return nil, nil, err
125-
}
126-
kad := network.NewKademlia(addr.Over(), network.NewKadParams())
127-
delivery := NewDelivery(kad, netStore)
128-
netStore.NewNetFetcherFunc = network.NewFetcherFactory(dummyRequestFromPeers, true).New
129-
130-
r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{
131-
Retrieval: RetrievalDisabled,
132-
Syncing: SyncingAutoSubscribe,
133-
SyncUpdateDelay: 3 * time.Second,
134-
}, nil)
135-
136-
bucket.Store(bucketKeyRegistry, r)
137-
138-
cleanup = func() {
139-
os.RemoveAll(datadir)
140-
netStore.Close()
141-
r.Close()
142-
}
116+
r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{
117+
Retrieval: RetrievalDisabled,
118+
Syncing: SyncingAutoSubscribe,
119+
SyncUpdateDelay: 3 * time.Second,
120+
}, nil)
143121

144-
return r, cleanup, nil
122+
bucket.Store(bucketKeyRegistry, r)
123+
124+
cleanup = func() {
125+
r.Close()
126+
clean()
127+
}
145128

129+
return r, cleanup, nil
130+
},
146131
}
147132

148133
func testSyncingViaGlobalSync(t *testing.T, chunkCount int, nodeCount int) {

0 commit comments

Comments
 (0)