@@ -20,12 +20,12 @@ import (
20
20
"context"
21
21
"crypto/ecdsa"
22
22
"errors"
23
- "math/rand"
24
23
"reflect"
25
24
"testing"
26
25
"time"
27
26
28
27
"github.com/davecgh/go-spew/spew"
28
+ "github.com/ethereum/go-ethereum/common/hexutil"
29
29
"github.com/ethereum/go-ethereum/common/mclock"
30
30
"github.com/ethereum/go-ethereum/crypto"
31
31
"github.com/ethereum/go-ethereum/internal/testlog"
@@ -34,23 +34,25 @@ import (
34
34
"github.com/ethereum/go-ethereum/p2p/enr"
35
35
)
36
36
37
- const (
38
- signingKeySeed = 0x111111
39
- nodesSeed1 = 0x2945237
40
- nodesSeed2 = 0x4567299
41
- )
37
+ var signingKeyForTesting , _ = crypto .ToECDSA (hexutil .MustDecode ("0xdc599867fc513f8f5e2c2c9c489cde5e71362d1d9ec6e693e0de063236ed1240" ))
42
38
43
39
func TestClientSyncTree (t * testing.T ) {
40
+ nodes := []string {
41
+ "enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA" ,
42
+ "enr:-HW4QAggRauloj2SDLtIHN1XBkvhFZ1vtf1raYQp9TBW2RD5EEawDzbtSmlXUfnaHcvwOizhVYLtr7e6vw7NAf6mTuoCgmlkgnY0iXNlY3AyNTZrMaECjrXI8TLNXU0f8cthpAMxEshUyQlK-AM0PW2wfrnacNI" ,
43
+ "enr:-HW4QLAYqmrwllBEnzWWs7I5Ev2IAs7x_dZlbYdRdMUx5EyKHDXp7AV5CkuPGUPdvbv1_Ms1CPfhcGCvSElSosZmyoqAgmlkgnY0iXNlY3AyNTZrMaECriawHKWdDRk2xeZkrOXBQ0dfMFLHY4eENZwdufn1S1o" ,
44
+ }
45
+
44
46
r := mapResolver {
45
47
"n" : "enrtree-root:v1 e=JWXYDBPXYWG6FX3GMDIBFA6CJ4 l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=1 sig=o908WmNp7LibOfPsr4btQwatZJ5URBr2ZAuxvK4UWHlsB9sUOTJQaGAlLPVAhM__XJesCHxLISo94z5Z2a463gA" ,
46
48
"C7HRFPF3BLGF3YR4DY5KX3SMBE.n" : "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org" ,
47
49
"JWXYDBPXYWG6FX3GMDIBFA6CJ4.n" : "enrtree-branch:2XS2367YHAXJFGLZHVAWLQD4ZY,H4FHT4B454P6UXFD7JCYQ5PWDY,MHTDO6TMUBRIA2XWG5LUDACK24" ,
48
- "2XS2367YHAXJFGLZHVAWLQD4ZY.n" : "enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA" ,
49
- "H4FHT4B454P6UXFD7JCYQ5PWDY.n" : "enr:-HW4QAggRauloj2SDLtIHN1XBkvhFZ1vtf1raYQp9TBW2RD5EEawDzbtSmlXUfnaHcvwOizhVYLtr7e6vw7NAf6mTuoCgmlkgnY0iXNlY3AyNTZrMaECjrXI8TLNXU0f8cthpAMxEshUyQlK-AM0PW2wfrnacNI" ,
50
- "MHTDO6TMUBRIA2XWG5LUDACK24.n" : "enr:-HW4QLAYqmrwllBEnzWWs7I5Ev2IAs7x_dZlbYdRdMUx5EyKHDXp7AV5CkuPGUPdvbv1_Ms1CPfhcGCvSElSosZmyoqAgmlkgnY0iXNlY3AyNTZrMaECriawHKWdDRk2xeZkrOXBQ0dfMFLHY4eENZwdufn1S1o" ,
50
+ "2XS2367YHAXJFGLZHVAWLQD4ZY.n" : nodes [ 0 ] ,
51
+ "H4FHT4B454P6UXFD7JCYQ5PWDY.n" : nodes [ 1 ] ,
52
+ "MHTDO6TMUBRIA2XWG5LUDACK24.n" : nodes [ 2 ] ,
51
53
}
52
54
var (
53
- wantNodes = testNodes ( 0x29452 , 3 )
55
+ wantNodes = sortByID ( parseNodes ( nodes ) )
54
56
wantLinks = []string {"enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org" }
55
57
wantSeq = uint (1 )
56
58
)
@@ -60,7 +62,7 @@ func TestClientSyncTree(t *testing.T) {
60
62
if err != nil {
61
63
t .Fatal ("sync error:" , err )
62
64
}
63
- if ! reflect .DeepEqual (sortByID (stree .Nodes ()), sortByID ( wantNodes ) ) {
65
+ if ! reflect .DeepEqual (sortByID (stree .Nodes ()), wantNodes ) {
64
66
t .Errorf ("wrong nodes in synced tree:\n have %v\n want %v" , spew .Sdump (stree .Nodes ()), spew .Sdump (wantNodes ))
65
67
}
66
68
if ! reflect .DeepEqual (stree .Links (), wantLinks ) {
@@ -80,7 +82,7 @@ func TestClientSyncTreeBadNode(t *testing.T) {
80
82
// tree, _ := MakeTree(3, nil, []string{"enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org"})
81
83
// tree.entries[badHash] = &b
82
84
// tree.root.eroot = badHash
83
- // url, _ := tree.Sign(testKey(signingKeySeed) , "n")
85
+ // url, _ := tree.Sign(signingKeyForTesting , "n")
84
86
// fmt.Println(url)
85
87
// fmt.Printf("%#v\n", tree.ToTXT("n"))
86
88
@@ -99,9 +101,13 @@ func TestClientSyncTreeBadNode(t *testing.T) {
99
101
100
102
// This test checks that randomIterator finds all entries.
101
103
func TestIterator (t * testing.T ) {
102
- nodes := testNodes (nodesSeed1 , 30 )
103
- tree , url := makeTestTree ("n" , nodes , nil )
104
- r := mapResolver (tree .ToTXT ("n" ))
104
+ var (
105
+ keys = testKeys (30 )
106
+ nodes = testNodes (keys )
107
+ tree , url = makeTestTree ("n" , nodes , nil )
108
+ r = mapResolver (tree .ToTXT ("n" ))
109
+ )
110
+
105
111
c := NewClient (Config {
106
112
Resolver : r ,
107
113
Logger : testlog .Logger (t , log .LvlTrace ),
@@ -132,8 +138,12 @@ func TestIteratorCloseWithoutNext(t *testing.T) {
132
138
133
139
// This test checks if closing randomIterator races.
134
140
func TestIteratorClose (t * testing.T ) {
135
- nodes := testNodes (nodesSeed1 , 500 )
136
- tree1 , url1 := makeTestTree ("t1" , nodes , nil )
141
+ var (
142
+ keys = testKeys (500 )
143
+ nodes = testNodes (keys )
144
+ tree1 , url1 = makeTestTree ("t1" , nodes , nil )
145
+ )
146
+
137
147
c := NewClient (Config {Resolver : newMapResolver (tree1 .ToTXT ("t1" ))})
138
148
it , err := c .NewIterator (url1 )
139
149
if err != nil {
@@ -155,9 +165,13 @@ func TestIteratorClose(t *testing.T) {
155
165
156
166
// This test checks that randomIterator traverses linked trees as well as explicitly added trees.
157
167
func TestIteratorLinks (t * testing.T ) {
158
- nodes := testNodes (nodesSeed1 , 40 )
159
- tree1 , url1 := makeTestTree ("t1" , nodes [:10 ], nil )
160
- tree2 , url2 := makeTestTree ("t2" , nodes [10 :], []string {url1 })
168
+ var (
169
+ keys = testKeys (40 )
170
+ nodes = testNodes (keys )
171
+ tree1 , url1 = makeTestTree ("t1" , nodes [:10 ], nil )
172
+ tree2 , url2 = makeTestTree ("t2" , nodes [10 :], []string {url1 })
173
+ )
174
+
161
175
c := NewClient (Config {
162
176
Resolver : newMapResolver (tree1 .ToTXT ("t1" ), tree2 .ToTXT ("t2" )),
163
177
Logger : testlog .Logger (t , log .LvlTrace ),
@@ -176,7 +190,8 @@ func TestIteratorLinks(t *testing.T) {
176
190
func TestIteratorNodeUpdates (t * testing.T ) {
177
191
var (
178
192
clock = new (mclock.Simulated )
179
- nodes = testNodes (nodesSeed1 , 30 )
193
+ keys = testKeys (30 )
194
+ nodes = testNodes (keys )
180
195
resolver = newMapResolver ()
181
196
c = NewClient (Config {
182
197
Resolver : resolver ,
@@ -197,7 +212,7 @@ func TestIteratorNodeUpdates(t *testing.T) {
197
212
checkIterator (t , it , nodes [:25 ])
198
213
199
214
// Ensure RandomNode returns the new nodes after the tree is updated.
200
- updateSomeNodes (nodesSeed1 , nodes )
215
+ updateSomeNodes (keys , nodes )
201
216
tree2 , _ := makeTestTree ("n" , nodes , nil )
202
217
resolver .clear ()
203
218
resolver .add (tree2 .ToTXT ("n" ))
@@ -213,7 +228,8 @@ func TestIteratorNodeUpdates(t *testing.T) {
213
228
func TestIteratorRootRecheckOnFail (t * testing.T ) {
214
229
var (
215
230
clock = new (mclock.Simulated )
216
- nodes = testNodes (nodesSeed1 , 30 )
231
+ keys = testKeys (30 )
232
+ nodes = testNodes (keys )
217
233
resolver = newMapResolver ()
218
234
c = NewClient (Config {
219
235
Resolver : resolver ,
@@ -237,7 +253,7 @@ func TestIteratorRootRecheckOnFail(t *testing.T) {
237
253
checkIterator (t , it , nodes [:25 ])
238
254
239
255
// Ensure RandomNode returns the new nodes after the tree is updated.
240
- updateSomeNodes (nodesSeed1 , nodes )
256
+ updateSomeNodes (keys , nodes )
241
257
tree2 , _ := makeTestTree ("n" , nodes , nil )
242
258
resolver .clear ()
243
259
resolver .add (tree2 .ToTXT ("n" ))
@@ -250,7 +266,8 @@ func TestIteratorRootRecheckOnFail(t *testing.T) {
250
266
func TestIteratorEmptyTree (t * testing.T ) {
251
267
var (
252
268
clock = new (mclock.Simulated )
253
- nodes = testNodes (nodesSeed1 , 1 )
269
+ keys = testKeys (1 )
270
+ nodes = testNodes (keys )
254
271
resolver = newMapResolver ()
255
272
c = NewClient (Config {
256
273
Resolver : resolver ,
@@ -294,8 +311,7 @@ func TestIteratorEmptyTree(t *testing.T) {
294
311
}
295
312
296
313
// updateSomeNodes applies ENR updates to some of the given nodes.
297
- func updateSomeNodes (keySeed int64 , nodes []* enode.Node ) {
298
- keys := testKeys (nodesSeed1 , len (nodes ))
314
+ func updateSomeNodes (keys []* ecdsa.PrivateKey , nodes []* enode.Node ) {
299
315
for i , n := range nodes [:len (nodes )/ 2 ] {
300
316
r := n .Record ()
301
317
r .Set (enr.IP {127 , 0 , 0 , 1 })
@@ -311,7 +327,8 @@ func updateSomeNodes(keySeed int64, nodes []*enode.Node) {
311
327
func TestIteratorLinkUpdates (t * testing.T ) {
312
328
var (
313
329
clock = new (mclock.Simulated )
314
- nodes = testNodes (nodesSeed1 , 30 )
330
+ keys = testKeys (30 )
331
+ nodes = testNodes (keys )
315
332
resolver = newMapResolver ()
316
333
c = NewClient (Config {
317
334
Resolver : resolver ,
@@ -384,19 +401,18 @@ func makeTestTree(domain string, nodes []*enode.Node, links []string) (*Tree, st
384
401
if err != nil {
385
402
panic (err )
386
403
}
387
- url , err := tree .Sign (testKey ( signingKeySeed ) , domain )
404
+ url , err := tree .Sign (signingKeyForTesting , domain )
388
405
if err != nil {
389
406
panic (err )
390
407
}
391
408
return tree , url
392
409
}
393
410
394
411
// testKeys creates deterministic private keys for testing.
395
- func testKeys (seed int64 , n int ) []* ecdsa.PrivateKey {
396
- rand := rand .New (rand .NewSource (seed ))
412
+ func testKeys (n int ) []* ecdsa.PrivateKey {
397
413
keys := make ([]* ecdsa.PrivateKey , n )
398
414
for i := 0 ; i < n ; i ++ {
399
- key , err := ecdsa .GenerateKey (crypto . S256 (), rand )
415
+ key , err := crypto .GenerateKey ()
400
416
if err != nil {
401
417
panic ("can't generate key: " + err .Error ())
402
418
}
@@ -405,13 +421,8 @@ func testKeys(seed int64, n int) []*ecdsa.PrivateKey {
405
421
return keys
406
422
}
407
423
408
- func testKey (seed int64 ) * ecdsa.PrivateKey {
409
- return testKeys (seed , 1 )[0 ]
410
- }
411
-
412
- func testNodes (seed int64 , n int ) []* enode.Node {
413
- keys := testKeys (seed , n )
414
- nodes := make ([]* enode.Node , n )
424
+ func testNodes (keys []* ecdsa.PrivateKey ) []* enode.Node {
425
+ nodes := make ([]* enode.Node , len (keys ))
415
426
for i , key := range keys {
416
427
record := new (enr.Record )
417
428
record .SetSeq (uint64 (i ))
@@ -425,10 +436,6 @@ func testNodes(seed int64, n int) []*enode.Node {
425
436
return nodes
426
437
}
427
438
428
- func testNode (seed int64 ) * enode.Node {
429
- return testNodes (seed , 1 )[0 ]
430
- }
431
-
432
439
type mapResolver map [string ]string
433
440
434
441
func newMapResolver (maps ... map [string ]string ) mapResolver {
@@ -457,3 +464,15 @@ func (mr mapResolver) LookupTXT(ctx context.Context, name string) ([]string, err
457
464
}
458
465
return nil , errors .New ("not found" )
459
466
}
467
+
468
+ func parseNodes (rec []string ) []* enode.Node {
469
+ var ns []* enode.Node
470
+ for _ , r := range rec {
471
+ var n enode.Node
472
+ if err := n .UnmarshalText ([]byte (r )); err != nil {
473
+ panic (err )
474
+ }
475
+ ns = append (ns , & n )
476
+ }
477
+ return ns
478
+ }
0 commit comments