17
17
package ethclient
18
18
19
19
import (
20
+ "bytes"
20
21
"context"
21
22
"errors"
22
23
"fmt"
@@ -35,6 +36,7 @@ import (
35
36
"github.com/ethereum/go-ethereum/eth"
36
37
"github.com/ethereum/go-ethereum/node"
37
38
"github.com/ethereum/go-ethereum/params"
39
+ "github.com/ethereum/go-ethereum/rpc"
38
40
)
39
41
40
42
// Verify that Client implements the ethereum interfaces.
@@ -229,12 +231,48 @@ func generateTestChain() (*core.Genesis, []*types.Block) {
229
231
return genesis , blocks
230
232
}
231
233
232
- func TestHeader (t * testing.T ) {
234
+ func TestEthClient (t * testing.T ) {
233
235
backend , chain := newTestBackend (t )
234
236
client , _ := backend .Attach ()
235
237
defer backend .Close ()
236
238
defer client .Close ()
237
239
240
+ tests := map [string ]struct {
241
+ test func (t * testing.T )
242
+ }{
243
+ "TestHeader" : {
244
+ func (t * testing.T ) { testHeader (t , chain , client ) },
245
+ },
246
+ "TestBalanceAt" : {
247
+ func (t * testing.T ) { testBalanceAt (t , client ) },
248
+ },
249
+ "TestTxInBlockInterrupted" : {
250
+ func (t * testing.T ) { testTransactionInBlockInterrupted (t , client ) },
251
+ },
252
+ "TestChainID" : {
253
+ func (t * testing.T ) { testChainID (t , client ) },
254
+ },
255
+ "TestGetBlock" : {
256
+ func (t * testing.T ) { testGetBlock (t , client ) },
257
+ },
258
+ "TestStatusFunctions" : {
259
+ func (t * testing.T ) { testStatusFunctions (t , client ) },
260
+ },
261
+ "TestCallContract" : {
262
+ func (t * testing.T ) { testCallContract (t , client ) },
263
+ },
264
+ "TestAtFunctions" : {
265
+ func (t * testing.T ) { testAtFunctions (t , client ) },
266
+ },
267
+ }
268
+
269
+ t .Parallel ()
270
+ for name , tt := range tests {
271
+ t .Run (name , tt .test )
272
+ }
273
+ }
274
+
275
+ func testHeader (t * testing.T , chain []* types.Block , client * rpc.Client ) {
238
276
tests := map [string ]struct {
239
277
block * big.Int
240
278
want * types.Header
@@ -273,12 +311,7 @@ func TestHeader(t *testing.T) {
273
311
}
274
312
}
275
313
276
- func TestBalanceAt (t * testing.T ) {
277
- backend , _ := newTestBackend (t )
278
- client , _ := backend .Attach ()
279
- defer backend .Close ()
280
- defer client .Close ()
281
-
314
+ func testBalanceAt (t * testing.T , client * rpc.Client ) {
282
315
tests := map [string ]struct {
283
316
account common.Address
284
317
block * big.Int
@@ -319,31 +352,32 @@ func TestBalanceAt(t *testing.T) {
319
352
}
320
353
}
321
354
322
- func TestTransactionInBlockInterrupted (t * testing.T ) {
323
- backend , _ := newTestBackend (t )
324
- client , _ := backend .Attach ()
325
- defer backend .Close ()
326
- defer client .Close ()
327
-
355
+ func testTransactionInBlockInterrupted (t * testing.T , client * rpc.Client ) {
328
356
ec := NewClient (client )
357
+
358
+ // Get current block by number
359
+ block , err := ec .BlockByNumber (context .Background (), nil )
360
+ if err != nil {
361
+ t .Fatalf ("unexpected error: %v" , err )
362
+ }
363
+ // Test tx in block interupted
329
364
ctx , cancel := context .WithCancel (context .Background ())
330
365
cancel ()
331
- tx , err := ec .TransactionInBlock (ctx , common .Hash { 1 } , 1 )
366
+ tx , err := ec .TransactionInBlock (ctx , block .Hash () , 1 )
332
367
if tx != nil {
333
368
t .Fatal ("transaction should be nil" )
334
369
}
335
- if err == nil {
336
- t .Fatal ("error should not be nil" )
370
+ if err == nil || err == ethereum .NotFound {
371
+ t .Fatal ("error should not be nil/notfound" )
372
+ }
373
+ // Test tx in block not found
374
+ if _ , err := ec .TransactionInBlock (context .Background (), block .Hash (), 1 ); err != ethereum .NotFound {
375
+ t .Fatal ("error should be ethereum.NotFound" )
337
376
}
338
377
}
339
378
340
- func TestChainID (t * testing.T ) {
341
- backend , _ := newTestBackend (t )
342
- client , _ := backend .Attach ()
343
- defer backend .Close ()
344
- defer client .Close ()
379
+ func testChainID (t * testing.T , client * rpc.Client ) {
345
380
ec := NewClient (client )
346
-
347
381
id , err := ec .ChainID (context .Background ())
348
382
if err != nil {
349
383
t .Fatalf ("unexpected error: %v" , err )
@@ -353,18 +387,187 @@ func TestChainID(t *testing.T) {
353
387
}
354
388
}
355
389
356
- func TestBlockNumber (t * testing.T ) {
357
- backend , _ := newTestBackend (t )
358
- client , _ := backend .Attach ()
359
- defer backend .Close ()
360
- defer client .Close ()
390
+ func testGetBlock (t * testing.T , client * rpc.Client ) {
361
391
ec := NewClient (client )
362
-
392
+ // Get current block number
363
393
blockNumber , err := ec .BlockNumber (context .Background ())
364
394
if err != nil {
365
395
t .Fatalf ("unexpected error: %v" , err )
366
396
}
367
397
if blockNumber != 1 {
368
398
t .Fatalf ("BlockNumber returned wrong number: %d" , blockNumber )
369
399
}
400
+ // Get current block by number
401
+ block , err := ec .BlockByNumber (context .Background (), new (big.Int ).SetUint64 (blockNumber ))
402
+ if err != nil {
403
+ t .Fatalf ("unexpected error: %v" , err )
404
+ }
405
+ if block .NumberU64 () != blockNumber {
406
+ t .Fatalf ("BlockByNumber returned wrong block: want %d got %d" , blockNumber , block .NumberU64 ())
407
+ }
408
+ // Get current block by hash
409
+ blockH , err := ec .BlockByHash (context .Background (), block .Hash ())
410
+ if err != nil {
411
+ t .Fatalf ("unexpected error: %v" , err )
412
+ }
413
+ if block .Hash () != blockH .Hash () {
414
+ t .Fatalf ("BlockByHash returned wrong block: want %v got %v" , block .Hash ().Hex (), blockH .Hash ().Hex ())
415
+ }
416
+ // Get header by number
417
+ header , err := ec .HeaderByNumber (context .Background (), new (big.Int ).SetUint64 (blockNumber ))
418
+ if err != nil {
419
+ t .Fatalf ("unexpected error: %v" , err )
420
+ }
421
+ if block .Header ().Hash () != header .Hash () {
422
+ t .Fatalf ("HeaderByNumber returned wrong header: want %v got %v" , block .Header ().Hash ().Hex (), header .Hash ().Hex ())
423
+ }
424
+ // Get header by hash
425
+ headerH , err := ec .HeaderByHash (context .Background (), block .Hash ())
426
+ if err != nil {
427
+ t .Fatalf ("unexpected error: %v" , err )
428
+ }
429
+ if block .Header ().Hash () != headerH .Hash () {
430
+ t .Fatalf ("HeaderByHash returned wrong header: want %v got %v" , block .Header ().Hash ().Hex (), headerH .Hash ().Hex ())
431
+ }
432
+ }
433
+
434
+ func testStatusFunctions (t * testing.T , client * rpc.Client ) {
435
+ ec := NewClient (client )
436
+
437
+ // Sync progress
438
+ progress , err := ec .SyncProgress (context .Background ())
439
+ if err != nil {
440
+ t .Fatalf ("unexpected error: %v" , err )
441
+ }
442
+ if progress != nil {
443
+ t .Fatalf ("unexpected progress: %v" , progress )
444
+ }
445
+ // NetworkID
446
+ networkID , err := ec .NetworkID (context .Background ())
447
+ if err != nil {
448
+ t .Fatalf ("unexpected error: %v" , err )
449
+ }
450
+ if networkID .Cmp (big .NewInt (0 )) != 0 {
451
+ t .Fatalf ("unexpected networkID: %v" , networkID )
452
+ }
453
+ // SuggestGasPrice (should suggest 1 Gwei)
454
+ gasPrice , err := ec .SuggestGasPrice (context .Background ())
455
+ if err != nil {
456
+ t .Fatalf ("unexpected error: %v" , err )
457
+ }
458
+ if gasPrice .Cmp (big .NewInt (1000000000 )) != 0 {
459
+ t .Fatalf ("unexpected gas price: %v" , gasPrice )
460
+ }
461
+ }
462
+
463
+ func testCallContract (t * testing.T , client * rpc.Client ) {
464
+ ec := NewClient (client )
465
+
466
+ // EstimateGas
467
+ msg := ethereum.CallMsg {
468
+ From : testAddr ,
469
+ To : & common.Address {},
470
+ Gas : 21000 ,
471
+ GasPrice : big .NewInt (1 ),
472
+ Value : big .NewInt (1 ),
473
+ }
474
+ gas , err := ec .EstimateGas (context .Background (), msg )
475
+ if err != nil {
476
+ t .Fatalf ("unexpected error: %v" , err )
477
+ }
478
+ if gas != 21000 {
479
+ t .Fatalf ("unexpected gas price: %v" , gas )
480
+ }
481
+ // CallContract
482
+ if _ , err := ec .CallContract (context .Background (), msg , big .NewInt (1 )); err != nil {
483
+ t .Fatalf ("unexpected error: %v" , err )
484
+ }
485
+ // PendingCallCOntract
486
+ if _ , err := ec .PendingCallContract (context .Background (), msg ); err != nil {
487
+ t .Fatalf ("unexpected error: %v" , err )
488
+ }
489
+ }
490
+
491
+ func testAtFunctions (t * testing.T , client * rpc.Client ) {
492
+ ec := NewClient (client )
493
+ // send a transaction for some interesting pending status
494
+ sendTransaction (ec )
495
+ time .Sleep (100 * time .Millisecond )
496
+ // Check pending transaction count
497
+ pending , err := ec .PendingTransactionCount (context .Background ())
498
+ if err != nil {
499
+ t .Fatalf ("unexpected error: %v" , err )
500
+ }
501
+ if pending != 1 {
502
+ t .Fatalf ("unexpected pending, wanted 1 got: %v" , pending )
503
+ }
504
+ // Query balance
505
+ balance , err := ec .BalanceAt (context .Background (), testAddr , nil )
506
+ if err != nil {
507
+ t .Fatalf ("unexpected error: %v" , err )
508
+ }
509
+ penBalance , err := ec .PendingBalanceAt (context .Background (), testAddr )
510
+ if err != nil {
511
+ t .Fatalf ("unexpected error: %v" , err )
512
+ }
513
+ if balance .Cmp (penBalance ) == 0 {
514
+ t .Fatalf ("unexpected balance: %v %v" , balance , penBalance )
515
+ }
516
+ // NonceAt
517
+ nonce , err := ec .NonceAt (context .Background (), testAddr , nil )
518
+ if err != nil {
519
+ t .Fatalf ("unexpected error: %v" , err )
520
+ }
521
+ penNonce , err := ec .PendingNonceAt (context .Background (), testAddr )
522
+ if err != nil {
523
+ t .Fatalf ("unexpected error: %v" , err )
524
+ }
525
+ if penNonce != nonce + 1 {
526
+ t .Fatalf ("unexpected nonce: %v %v" , nonce , penNonce )
527
+ }
528
+ // StorageAt
529
+ storage , err := ec .StorageAt (context .Background (), testAddr , common.Hash {}, nil )
530
+ if err != nil {
531
+ t .Fatalf ("unexpected error: %v" , err )
532
+ }
533
+ penStorage , err := ec .PendingStorageAt (context .Background (), testAddr , common.Hash {})
534
+ if err != nil {
535
+ t .Fatalf ("unexpected error: %v" , err )
536
+ }
537
+ if ! bytes .Equal (storage , penStorage ) {
538
+ t .Fatalf ("unexpected storage: %v %v" , storage , penStorage )
539
+ }
540
+ // CodeAt
541
+ code , err := ec .CodeAt (context .Background (), testAddr , nil )
542
+ if err != nil {
543
+ t .Fatalf ("unexpected error: %v" , err )
544
+ }
545
+ penCode , err := ec .PendingCodeAt (context .Background (), testAddr )
546
+ if err != nil {
547
+ t .Fatalf ("unexpected error: %v" , err )
548
+ }
549
+ if ! bytes .Equal (code , penCode ) {
550
+ t .Fatalf ("unexpected code: %v %v" , code , penCode )
551
+ }
552
+ }
553
+
554
+ func sendTransaction (ec * Client ) error {
555
+ // Retrieve chainID
556
+ chainID , err := ec .ChainID (context .Background ())
557
+ if err != nil {
558
+ return err
559
+ }
560
+ // Create transaction
561
+ tx := types .NewTransaction (0 , common.Address {1 }, big .NewInt (1 ), 22000 , big .NewInt (1 ), nil )
562
+ signer := types .NewEIP155Signer (chainID )
563
+ signature , err := crypto .Sign (signer .Hash (tx ).Bytes (), testKey )
564
+ if err != nil {
565
+ return err
566
+ }
567
+ signedTx , err := tx .WithSignature (signer , signature )
568
+ if err != nil {
569
+ return err
570
+ }
571
+ // Send transaction
572
+ return ec .SendTransaction (context .Background (), signedTx )
370
573
}
0 commit comments