From 140a7e91778447e058c1811103037437b2091c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 31 Jul 2019 11:35:57 +0300 Subject: [PATCH] accounts/abi/bind: support closing a simulated backend --- accounts/abi/bind/backends/simulated.go | 6 +++ accounts/abi/bind/backends/simulated_test.go | 1 + accounts/abi/bind/bind_test.go | 40 ++++++++++++++++---- accounts/abi/bind/util_test.go | 1 + contracts/checkpointoracle/oracle_test.go | 5 ++- les/helper_test.go | 3 ++ 6 files changed, 48 insertions(+), 8 deletions(-) diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index 6c59092b79..e30572e0a1 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -88,6 +88,12 @@ func NewSimulatedBackend(alloc core.GenesisAlloc, gasLimit uint64) *SimulatedBac return NewSimulatedBackendWithDatabase(rawdb.NewMemoryDatabase(), alloc, gasLimit) } +// Close terminates the underlying blockchain's update loop. +func (b *SimulatedBackend) Close() error { + b.blockchain.Stop() + return nil +} + // Commit imports all the pending transactions as a single block and starts a // fresh new state. func (b *SimulatedBackend) Commit() { diff --git a/accounts/abi/bind/backends/simulated_test.go b/accounts/abi/bind/backends/simulated_test.go index bd75807d75..7e0a68c083 100644 --- a/accounts/abi/bind/backends/simulated_test.go +++ b/accounts/abi/bind/backends/simulated_test.go @@ -38,6 +38,7 @@ func TestSimulatedBackend(t *testing.T) { genAlloc[auth.From] = core.GenesisAccount{Balance: big.NewInt(9223372036854775807)} sim := backends.NewSimulatedBackend(genAlloc, gasLimit) + defer sim.Close() // should return an error if the tx is not found txHash := common.HexToHash("2") diff --git a/accounts/abi/bind/bind_test.go b/accounts/abi/bind/bind_test.go index f11966c812..5588b2431a 100644 --- a/accounts/abi/bind/bind_test.go +++ b/accounts/abi/bind/bind_test.go @@ -282,7 +282,9 @@ var bindTests = []struct { // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy an interaction tester contract and call a transaction on it _, _, interactor, err := DeployInteractor(auth, sim, "Deploy string") @@ -334,7 +336,9 @@ var bindTests = []struct { // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a tuple tester contract and execute a structured call on it _, _, getter, err := DeployGetter(auth, sim) @@ -377,7 +381,9 @@ var bindTests = []struct { // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a tuple tester contract and execute a structured call on it _, _, tupler, err := DeployTupler(auth, sim) @@ -432,7 +438,9 @@ var bindTests = []struct { // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a slice tester contract and execute a n array call on it _, _, slicer, err := DeploySlicer(auth, sim) @@ -477,7 +485,9 @@ var bindTests = []struct { // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a default method invoker contract and execute its default method _, _, defaulter, err := DeployDefaulter(auth, sim) @@ -519,7 +529,9 @@ var bindTests = []struct { `, ` // Create a simulator and wrap a non-deployed contract + sim := backends.NewSimulatedBackend(core.GenesisAlloc{}, uint64(10000000000)) + defer sim.Close() nonexistent, err := NewNonExistent(common.Address{}, sim) if err != nil { @@ -566,7 +578,9 @@ var bindTests = []struct { // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a funky gas pattern contract _, _, limiter, err := DeployFunkyGasPattern(auth, sim) @@ -613,7 +627,9 @@ var bindTests = []struct { // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a sender tester contract and execute a structured call on it _, _, callfrom, err := DeployCallFrom(auth, sim) @@ -685,7 +701,9 @@ var bindTests = []struct { // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a underscorer tester contract and execute a structured call on it _, _, underscorer, err := DeployUnderscorer(auth, sim) @@ -776,7 +794,9 @@ var bindTests = []struct { // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy an eventer contract _, _, eventer, err := DeployEventer(auth, sim) @@ -963,7 +983,9 @@ var bindTests = []struct { // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() //deploy the test contract _, _, testContract, err := DeployDeeplyNestedArray(auth, sim) @@ -1059,12 +1081,12 @@ var bindTests = []struct { ` pragma solidity >=0.4.19 <0.6.0; pragma experimental ABIEncoderV2; - + contract Tuple { struct S { uint a; uint[] b; T[] c; } struct T { uint x; uint y; } event TupleEvent(S a, T[2][] b, T[][2] c, S[] d, uint[] e); - + function func1(S memory a, T[2][] memory b, T[][2] memory c, S[] memory d, uint[] memory e) public pure returns (S memory, T[2][] memory, T[][2] memory, S[] memory, uint[] memory) { return (a, b, c, d, e); } @@ -1081,7 +1103,7 @@ var bindTests = []struct { ` "math/big" "reflect" - + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/core" @@ -1091,13 +1113,15 @@ var bindTests = []struct { ` key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) - backend := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) - _, _, contract, err := DeployTuple(auth, backend) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() + + _, _, contract, err := DeployTuple(auth, sim) if err != nil { t.Fatalf("deploy contract failed %v", err) } - backend.Commit() + sim.Commit() check := func(a, b interface{}, errMsg string) { if !reflect.DeepEqual(a, b) { @@ -1169,7 +1193,7 @@ var bindTests = []struct { if err != nil { t.Fatalf("invoke contract failed, err %v", err) } - backend.Commit() + sim.Commit() iter, err := contract.FilterTupleEvent(nil) if err != nil { @@ -1225,7 +1249,9 @@ var bindTests = []struct { // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() //deploy the test contract _, _, testContract, err := DeployUseLibrary(auth, sim) diff --git a/accounts/abi/bind/util_test.go b/accounts/abi/bind/util_test.go index 87bc29822b..e0141f46e0 100644 --- a/accounts/abi/bind/util_test.go +++ b/accounts/abi/bind/util_test.go @@ -59,6 +59,7 @@ func TestWaitDeployed(t *testing.T) { }, 10000000, ) + defer backend.Close() // Create the transaction. tx := types.NewContractCreation(0, big.NewInt(0), test.gas, big.NewInt(1), common.FromHex(test.code)) diff --git a/contracts/checkpointoracle/oracle_test.go b/contracts/checkpointoracle/oracle_test.go index 5986ea0d86..817954d11a 100644 --- a/contracts/checkpointoracle/oracle_test.go +++ b/contracts/checkpointoracle/oracle_test.go @@ -175,8 +175,11 @@ func TestCheckpointRegister(t *testing.T) { sort.Sort(accounts) // Deploy registrar contract - transactOpts := bind.NewKeyedTransactor(accounts[0].key) contractBackend := backends.NewSimulatedBackend(core.GenesisAlloc{accounts[0].addr: {Balance: big.NewInt(1000000000)}, accounts[1].addr: {Balance: big.NewInt(1000000000)}, accounts[2].addr: {Balance: big.NewInt(1000000000)}}, 10000000) + defer contractBackend.Close() + + transactOpts := bind.NewKeyedTransactor(accounts[0].key) + // 3 trusted signers, threshold 2 contractAddr, _, c, err := contract.DeployCheckpointOracle(transactOpts, contractBackend, []common.Address{accounts[0].addr, accounts[1].addr, accounts[2].addr}, sectionSize, processConfirms, big.NewInt(2)) if err != nil { diff --git a/les/helper_test.go b/les/helper_test.go index fb9117ad1e..d66cfa1a5b 100644 --- a/les/helper_test.go +++ b/les/helper_test.go @@ -422,6 +422,7 @@ func newServerEnv(t *testing.T, blocks int, protocol int, waitIndexers func(*cor // Note bloom trie indexer will be closed by it parent recursively. cIndexer.Close() bIndexer.Close() + b.Close() } } @@ -503,5 +504,7 @@ func newClientServerEnv(t *testing.T, blocks int, protocol int, waitIndexers fun bIndexer.Close() lcIndexer.Close() lbIndexer.Close() + b.Close() + lb.Close() } }