Skip to content

Commit e3bb872

Browse files
committed
peer tests
1 parent e67d70a commit e3bb872

File tree

2 files changed

+128
-22
lines changed

2 files changed

+128
-22
lines changed

les/helper_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func testRCL() RequestCostList {
136136
// newTestProtocolManager creates a new protocol manager for testing purposes,
137137
// with the given number of blocks already known, and potential notification
138138
// channels for different events.
139-
func newTestProtocolManager(lightSync bool, blocks int, generator func(int, *core.BlockGen), peers *peerSet, odr *LesOdr, db ethdb.Database) (*ProtocolManager, error) {
139+
func newTestProtocolManager(lightSync bool, blocks int, generator func(int, *core.BlockGen), peers *peerSet, odr *LesOdr, db ethdb.Database, ulcConfig *eth.ULCConfig) (*ProtocolManager, error) {
140140
var (
141141
evmux = new(event.TypeMux)
142142
engine = ethash.NewFaker()
@@ -178,7 +178,7 @@ func newTestProtocolManager(lightSync bool, blocks int, generator func(int, *cor
178178
} else {
179179
protocolVersions = ServerProtocolVersions
180180
}
181-
pm, err := NewProtocolManager(gspec.Config, lightSync, protocolVersions, NetworkId, evmux, engine, peers, chain, nil, db, odr, nil, make(chan struct{}), new(sync.WaitGroup), nil)
181+
pm, err := NewProtocolManager(gspec.Config, lightSync, protocolVersions, NetworkId, evmux, engine, peers, chain, nil, db, odr, nil, make(chan struct{}), new(sync.WaitGroup), ulcConfig)
182182
if err != nil {
183183
return nil, err
184184
}
@@ -202,8 +202,8 @@ func newTestProtocolManager(lightSync bool, blocks int, generator func(int, *cor
202202
// with the given number of blocks already known, and potential notification
203203
// channels for different events. In case of an error, the constructor force-
204204
// fails the test.
205-
func newTestProtocolManagerMust(t *testing.T, lightSync bool, blocks int, generator func(int, *core.BlockGen), peers *peerSet, odr *LesOdr, db ethdb.Database, ulc *ulc) *ProtocolManager {
206-
pm, err := newTestProtocolManager(lightSync, blocks, generator, peers, odr, db)
205+
func newTestProtocolManagerMust(t *testing.T, lightSync bool, blocks int, generator func(int, *core.BlockGen), peers *peerSet, odr *LesOdr, db ethdb.Database, ulcConfig *eth.ULCConfig) *ProtocolManager {
206+
pm, err := newTestProtocolManager(lightSync, blocks, generator, peers, odr, db, ulcConfig)
207207
if err != nil {
208208
t.Fatalf("Failed to create protocol manager: %v", err)
209209
}

les/ulc_test.go

Lines changed: 124 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,145 @@
11
package les
22

33
import (
4+
"crypto/rand"
5+
"fmt"
6+
"github.com/ethereum/go-ethereum/core"
47
"github.com/ethereum/go-ethereum/eth"
58
"github.com/ethereum/go-ethereum/ethdb"
69
"github.com/ethereum/go-ethereum/light"
10+
"github.com/ethereum/go-ethereum/p2p"
11+
"github.com/ethereum/go-ethereum/p2p/discover"
12+
"reflect"
713
"testing"
814
"time"
915
)
1016

11-
func TestUlc(t *testing.T) {
12-
testULC(t, 2)
17+
func TestULCSyncWithOnePeer(t *testing.T) {
18+
f := newFullPeerPair(t, 1, 4, testChainGen)
19+
ulcConfig := &eth.ULCConfig{
20+
MinTrustedFraction: 100,
21+
TrustedNodes: []string{f.ID.String()},
22+
}
23+
24+
l := newLightPeer(t, ulcConfig)
25+
26+
if reflect.DeepEqual(f.PM.blockchain.CurrentHeader().Hash(), l.PM.blockchain.CurrentHeader().Hash()) {
27+
t.Fatal("blocks are equal")
28+
}
29+
30+
fPeer, _, err := connectPeers(f, l, 2)
31+
if err != nil {
32+
t.Fatal(err)
33+
}
34+
35+
l.PM.synchronise(fPeer)
36+
37+
if !reflect.DeepEqual(f.PM.blockchain.CurrentHeader().Hash(), l.PM.blockchain.CurrentHeader().Hash()) {
38+
t.Fatal("sync don't work")
39+
}
1340
}
1441

15-
func testULC(t *testing.T, protocol int) {
16-
// Assemble the test environment
17-
peers := newPeerSet()
18-
dist := newRequestDistributor(peers, make(chan struct{}))
19-
rm := newRetrieveManager(peers, dist, nil)
42+
func TestULCShouldNotSyncWithTwoPeersOneHaveEmptyChain(t *testing.T) {
43+
f1 := newFullPeerPair(t, 1, 4, testChainGen)
44+
f2 := newFullPeerPair(t, 3, 0, nil)
45+
ulcConf := &ulc{minTrustedFraction: 100, trustedKeys: make(map[string]struct{})}
46+
ulcConf.trustedKeys[f1.ID.String()] = struct{}{}
47+
ulcConf.trustedKeys[f2.ID.String()] = struct{}{}
48+
ulcConfig := &eth.ULCConfig{
49+
MinTrustedFraction: 100,
50+
TrustedNodes: []string{f1.ID.String(), f2.ID.String()},
51+
}
52+
l := newLightPeer(t, ulcConfig)
53+
l.PM.ulc.minTrustedFraction = 100
2054

21-
db, _ := ethdb.NewMemDatabase()
22-
ldb, _ := ethdb.NewMemDatabase()
55+
fPeer1, lPeer1, err := connectPeers(f1, l, 2)
56+
fPeer2, lPeer2, err := connectPeers(f2, l, 2)
57+
if err != nil {
58+
t.Fatal(err)
59+
}
60+
61+
_, _ = lPeer1, lPeer2
62+
63+
l.PM.synchronise(fPeer1)
64+
l.PM.synchronise(fPeer2)
65+
66+
time.Sleep(time.Second)
67+
if l.PM.blockchain.CurrentHeader() != nil {
68+
t.Fatal("Should be empty")
69+
}
70+
}
71+
72+
type pairPeer struct {
73+
Name string
74+
ID discover.NodeID
75+
PM *ProtocolManager
76+
}
2377

24-
odr := NewLesOdr(ldb, light.NewChtIndexer(db, true), light.NewBloomTrieIndexer(db, true), eth.NewBloomIndexer(db, light.BloomTrieFrequency), rm)
78+
func connectPeers(full, light pairPeer, version int) (*peer, *peer, error) {
79+
// Create a message pipe to communicate through
80+
app, net := p2p.MsgPipe()
2581

26-
pm := newTestProtocolManagerMust(t, false, 4, testChainGen, nil, nil, db, nil)
27-
lpm := newTestProtocolManagerMust(t, true, 0, nil, peers, odr, ldb, nil)
82+
peerLight := full.PM.newPeer(version, NetworkId, p2p.NewPeer(light.ID, light.Name, nil), net)
83+
peerFull := light.PM.newPeer(version, NetworkId, p2p.NewPeer(full.ID, full.Name, nil), app)
84+
85+
// Start the peerLight on a new thread
86+
errc1 := make(chan error, 1)
87+
errc2 := make(chan error, 1)
88+
go func() {
89+
select {
90+
case light.PM.newPeerCh <- peerFull:
91+
errc1 <- light.PM.handle(peerFull)
92+
case <-light.PM.quitSync:
93+
errc1 <- p2p.DiscQuitting
94+
}
95+
}()
96+
go func() {
97+
select {
98+
case full.PM.newPeerCh <- peerLight:
99+
errc2 <- full.PM.handle(peerLight)
100+
case <-full.PM.quitSync:
101+
errc2 <- p2p.DiscQuitting
102+
}
103+
}()
28104

29-
_, err1, lpeer, err2 := newTestPeerPair("peer", protocol, pm, lpm)
30105
select {
31106
case <-time.After(time.Millisecond * 100):
32-
case err := <-err1:
33-
t.Fatalf("peer 1 handshake error: %v", err)
34-
case err := <-err2:
35-
t.Fatalf("peer 1 handshake error: %v", err)
107+
case err := <-errc1:
108+
return nil, nil, fmt.Errorf("peerLight handshake error: %v", err)
109+
case err := <-errc2:
110+
return nil, nil, fmt.Errorf("peerFull handshake error: %v", err)
111+
}
112+
113+
return peerFull, peerLight, nil
114+
}
115+
116+
func newFullPeerPair(t *testing.T, index int, numberOfblocks int, chainGen func(int, *core.BlockGen)) pairPeer {
117+
db, _ := ethdb.NewMemDatabase()
118+
119+
pmFull := newTestProtocolManagerMust(t, false, numberOfblocks, chainGen, nil, nil, db, nil)
120+
121+
peerPairFull := pairPeer{
122+
Name: "full node",
123+
PM: pmFull,
124+
}
125+
rand.Read(peerPairFull.ID[:])
126+
return peerPairFull
127+
}
128+
129+
func newLightPeer(t *testing.T, ulcConfig *eth.ULCConfig) pairPeer {
130+
peers := newPeerSet()
131+
dist := newRequestDistributor(peers, make(chan struct{}))
132+
rm := newRetrieveManager(peers, dist, nil)
133+
ldb, _ := ethdb.NewMemDatabase()
134+
135+
odr := NewLesOdr(ldb, light.NewChtIndexer(ldb, true), light.NewBloomTrieIndexer(ldb, true), eth.NewBloomIndexer(ldb, light.BloomTrieFrequency), rm)
136+
137+
pmLight := newTestProtocolManagerMust(t, true, 0, nil, peers, odr, ldb, ulcConfig)
138+
peerPairLight := pairPeer{
139+
Name: "ulc node",
140+
PM: pmLight,
36141
}
142+
rand.Read(peerPairLight.ID[:])
37143

38-
lpm.synchronise(lpeer)
144+
return peerPairLight
39145
}

0 commit comments

Comments
 (0)