core,rpc: close Blockchain in tests

If blockchain is not closed, logging in defer can occur
after test has finished, which will lead to a panic with
"Log in goroutine after Test* has completed".
This commit is contained in:
Evgenii Stratonikov 2020-01-10 11:47:55 +03:00
parent dc65684708
commit 9dc5571327
3 changed files with 97 additions and 52 deletions

View file

@ -35,7 +35,8 @@ import (
*/
func TestStorageFind(t *testing.T) {
v, contractState, context := createVMAndContractState(t)
v, contractState, context, chain := createVMAndContractState(t)
defer chain.Close()
skeys := [][]byte{{0x01, 0x02}, {0x02, 0x01}}
items := []*state.StorageItem{
@ -101,7 +102,8 @@ func TestStorageFind(t *testing.T) {
}
func TestHeaderGetVersion(t *testing.T) {
v, block, context := createVMAndPushBlock(t)
v, block, context, chain := createVMAndPushBlock(t)
defer chain.Close()
err := context.headerGetVersion(v)
require.NoError(t, err)
@ -112,7 +114,9 @@ func TestHeaderGetVersion(t *testing.T) {
func TestHeaderGetVersion_Negative(t *testing.T) {
v := vm.New()
block := newDumbBlock()
context := newTestChain(t).newInteropContext(trigger.Application, storage.NewMemoryStore(), block, nil)
chain := newTestChain(t)
defer chain.Close()
context := chain.newInteropContext(trigger.Application, storage.NewMemoryStore(), block, nil)
v.Estack().PushVal(vm.NewBoolItem(false))
err := context.headerGetVersion(v)
@ -120,7 +124,8 @@ func TestHeaderGetVersion_Negative(t *testing.T) {
}
func TestHeaderGetConsensusData(t *testing.T) {
v, block, context := createVMAndPushBlock(t)
v, block, context, chain := createVMAndPushBlock(t)
defer chain.Close()
err := context.headerGetConsensusData(v)
require.NoError(t, err)
@ -129,7 +134,8 @@ func TestHeaderGetConsensusData(t *testing.T) {
}
func TestHeaderGetMerkleRoot(t *testing.T) {
v, block, context := createVMAndPushBlock(t)
v, block, context, chain := createVMAndPushBlock(t)
defer chain.Close()
err := context.headerGetMerkleRoot(v)
require.NoError(t, err)
@ -138,7 +144,8 @@ func TestHeaderGetMerkleRoot(t *testing.T) {
}
func TestHeaderGetNextConsensus(t *testing.T) {
v, block, context := createVMAndPushBlock(t)
v, block, context, chain := createVMAndPushBlock(t)
defer chain.Close()
err := context.headerGetNextConsensus(v)
require.NoError(t, err)
@ -147,7 +154,8 @@ func TestHeaderGetNextConsensus(t *testing.T) {
}
func TestTxGetAttributes(t *testing.T) {
v, tx, context := createVMAndPushTX(t)
v, tx, context, chain := createVMAndPushTX(t)
defer chain.Close()
err := context.txGetAttributes(v)
require.NoError(t, err)
@ -156,7 +164,8 @@ func TestTxGetAttributes(t *testing.T) {
}
func TestTxGetInputs(t *testing.T) {
v, tx, context := createVMAndPushTX(t)
v, tx, context, chain := createVMAndPushTX(t)
defer chain.Close()
err := context.txGetInputs(v)
require.NoError(t, err)
@ -165,7 +174,8 @@ func TestTxGetInputs(t *testing.T) {
}
func TestTxGetOutputs(t *testing.T) {
v, tx, context := createVMAndPushTX(t)
v, tx, context, chain := createVMAndPushTX(t)
defer chain.Close()
err := context.txGetOutputs(v)
require.NoError(t, err)
@ -174,7 +184,8 @@ func TestTxGetOutputs(t *testing.T) {
}
func TestTxGetType(t *testing.T) {
v, tx, context := createVMAndPushTX(t)
v, tx, context, chain := createVMAndPushTX(t)
defer chain.Close()
err := context.txGetType(v)
require.NoError(t, err)
@ -183,7 +194,8 @@ func TestTxGetType(t *testing.T) {
}
func TestInvocationTxGetScript(t *testing.T) {
v, tx, context := createVMAndPushTX(t)
v, tx, context, chain := createVMAndPushTX(t)
defer chain.Close()
err := context.invocationTxGetScript(v)
require.NoError(t, err)
@ -197,7 +209,10 @@ func TestWitnessGetVerificationScript(t *testing.T) {
script := []byte{byte(opcode.PUSHM1), byte(opcode.RET)}
witness := transaction.Witness{InvocationScript: nil, VerificationScript: script}
context := newTestChain(t).newInteropContext(trigger.Application, storage.NewMemoryStore(), nil, nil)
chain := newTestChain(t)
defer chain.Close()
context := chain.newInteropContext(trigger.Application, storage.NewMemoryStore(), nil, nil)
v.Estack().PushVal(vm.NewInteropItem(&witness))
err := context.witnessGetVerificationScript(v)
require.NoError(t, err)
@ -206,7 +221,8 @@ func TestWitnessGetVerificationScript(t *testing.T) {
}
func TestPopInputFromVM(t *testing.T) {
v, tx, _ := createVMAndTX(t)
v, tx, _, chain := createVMAndTX(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(&tx.Inputs[0]))
input, err := popInputFromVM(v)
@ -215,7 +231,8 @@ func TestPopInputFromVM(t *testing.T) {
}
func TestInputGetHash(t *testing.T) {
v, tx, context := createVMAndTX(t)
v, tx, context, chain := createVMAndTX(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(&tx.Inputs[0]))
err := context.inputGetHash(v)
@ -225,7 +242,8 @@ func TestInputGetHash(t *testing.T) {
}
func TestInputGetIndex(t *testing.T) {
v, tx, context := createVMAndTX(t)
v, tx, context, chain := createVMAndTX(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(&tx.Inputs[0]))
err := context.inputGetIndex(v)
@ -235,7 +253,8 @@ func TestInputGetIndex(t *testing.T) {
}
func TestPopOutputFromVM(t *testing.T) {
v, tx, _ := createVMAndTX(t)
v, tx, _, chain := createVMAndTX(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(&tx.Outputs[0]))
output, err := popOutputFromVM(v)
@ -244,7 +263,8 @@ func TestPopOutputFromVM(t *testing.T) {
}
func TestOutputGetAssetID(t *testing.T) {
v, tx, context := createVMAndTX(t)
v, tx, context, chain := createVMAndTX(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(&tx.Outputs[0]))
err := context.outputGetAssetID(v)
@ -254,7 +274,8 @@ func TestOutputGetAssetID(t *testing.T) {
}
func TestOutputGetScriptHash(t *testing.T) {
v, tx, context := createVMAndTX(t)
v, tx, context, chain := createVMAndTX(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(&tx.Outputs[0]))
err := context.outputGetScriptHash(v)
@ -264,7 +285,8 @@ func TestOutputGetScriptHash(t *testing.T) {
}
func TestOutputGetValue(t *testing.T) {
v, tx, context := createVMAndTX(t)
v, tx, context, chain := createVMAndTX(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(&tx.Outputs[0]))
err := context.outputGetValue(v)
@ -274,7 +296,8 @@ func TestOutputGetValue(t *testing.T) {
}
func TestAttrGetData(t *testing.T) {
v, tx, context := createVMAndTX(t)
v, tx, context, chain := createVMAndTX(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(&tx.Attributes[0]))
err := context.attrGetData(v)
@ -284,7 +307,8 @@ func TestAttrGetData(t *testing.T) {
}
func TestAttrGetUsage(t *testing.T) {
v, tx, context := createVMAndTX(t)
v, tx, context, chain := createVMAndTX(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(&tx.Attributes[0]))
err := context.attrGetUsage(v)
@ -294,7 +318,8 @@ func TestAttrGetUsage(t *testing.T) {
}
func TestAccountGetScriptHash(t *testing.T) {
v, accState, context := createVMAndAccState(t)
v, accState, context, chain := createVMAndAccState(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(accState))
err := context.accountGetScriptHash(v)
@ -304,7 +329,8 @@ func TestAccountGetScriptHash(t *testing.T) {
}
func TestAccountGetVotes(t *testing.T) {
v, accState, context := createVMAndAccState(t)
v, accState, context, chain := createVMAndAccState(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(accState))
err := context.accountGetVotes(v)
@ -314,7 +340,8 @@ func TestAccountGetVotes(t *testing.T) {
}
func TestContractGetScript(t *testing.T) {
v, contractState, context := createVMAndContractState(t)
v, contractState, context, chain := createVMAndContractState(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(contractState))
err := context.contractGetScript(v)
@ -324,7 +351,8 @@ func TestContractGetScript(t *testing.T) {
}
func TestContractIsPayable(t *testing.T) {
v, contractState, context := createVMAndContractState(t)
v, contractState, context, chain := createVMAndContractState(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(contractState))
err := context.contractIsPayable(v)
@ -334,7 +362,8 @@ func TestContractIsPayable(t *testing.T) {
}
func TestAssetGetAdmin(t *testing.T) {
v, assetState, context := createVMAndAssetState(t)
v, assetState, context, chain := createVMAndAssetState(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(assetState))
err := context.assetGetAdmin(v)
@ -344,7 +373,8 @@ func TestAssetGetAdmin(t *testing.T) {
}
func TestAssetGetAmount(t *testing.T) {
v, assetState, context := createVMAndAssetState(t)
v, assetState, context, chain := createVMAndAssetState(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(assetState))
err := context.assetGetAmount(v)
@ -354,7 +384,8 @@ func TestAssetGetAmount(t *testing.T) {
}
func TestAssetGetAssetID(t *testing.T) {
v, assetState, context := createVMAndAssetState(t)
v, assetState, context, chain := createVMAndAssetState(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(assetState))
err := context.assetGetAssetID(v)
@ -364,7 +395,8 @@ func TestAssetGetAssetID(t *testing.T) {
}
func TestAssetGetAssetType(t *testing.T) {
v, assetState, context := createVMAndAssetState(t)
v, assetState, context, chain := createVMAndAssetState(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(assetState))
err := context.assetGetAssetType(v)
@ -374,7 +406,8 @@ func TestAssetGetAssetType(t *testing.T) {
}
func TestAssetGetAvailable(t *testing.T) {
v, assetState, context := createVMAndAssetState(t)
v, assetState, context, chain := createVMAndAssetState(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(assetState))
err := context.assetGetAvailable(v)
@ -384,7 +417,8 @@ func TestAssetGetAvailable(t *testing.T) {
}
func TestAssetGetIssuer(t *testing.T) {
v, assetState, context := createVMAndAssetState(t)
v, assetState, context, chain := createVMAndAssetState(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(assetState))
err := context.assetGetIssuer(v)
@ -394,7 +428,8 @@ func TestAssetGetIssuer(t *testing.T) {
}
func TestAssetGetOwner(t *testing.T) {
v, assetState, context := createVMAndAssetState(t)
v, assetState, context, chain := createVMAndAssetState(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(assetState))
err := context.assetGetOwner(v)
@ -404,7 +439,8 @@ func TestAssetGetOwner(t *testing.T) {
}
func TestAssetGetPrecision(t *testing.T) {
v, assetState, context := createVMAndAssetState(t)
v, assetState, context, chain := createVMAndAssetState(t)
defer chain.Close()
v.Estack().PushVal(vm.NewInteropItem(assetState))
err := context.assetGetPrecision(v)
@ -415,21 +451,22 @@ func TestAssetGetPrecision(t *testing.T) {
// Helper functions to create VM, InteropContext, TX, Account, Contract, Asset.
func createVMAndPushBlock(t *testing.T) (*vm.VM, *Block, *interopContext) {
func createVMAndPushBlock(t *testing.T) (*vm.VM, *Block, *interopContext, *Blockchain) {
v := vm.New()
block := newDumbBlock()
context := newTestChain(t).newInteropContext(trigger.Application, storage.NewMemoryStore(), block, nil)
chain := newTestChain(t)
context := chain.newInteropContext(trigger.Application, storage.NewMemoryStore(), block, nil)
v.Estack().PushVal(vm.NewInteropItem(block))
return v, block, context
return v, block, context, chain
}
func createVMAndPushTX(t *testing.T) (*vm.VM, *transaction.Transaction, *interopContext) {
v, tx, context := createVMAndTX(t)
func createVMAndPushTX(t *testing.T) (*vm.VM, *transaction.Transaction, *interopContext, *Blockchain) {
v, tx, context, chain := createVMAndTX(t)
v.Estack().PushVal(vm.NewInteropItem(tx))
return v, tx, context
return v, tx, context, chain
}
func createVMAndAssetState(t *testing.T) (*vm.VM, *state.Asset, *interopContext) {
func createVMAndAssetState(t *testing.T) (*vm.VM, *state.Asset, *interopContext, *Blockchain) {
v := vm.New()
assetState := &state.Asset{
ID: util.Uint256{},
@ -447,11 +484,12 @@ func createVMAndAssetState(t *testing.T) (*vm.VM, *state.Asset, *interopContext)
IsFrozen: false,
}
context := newTestChain(t).newInteropContext(trigger.Application, storage.NewMemoryStore(), nil, nil)
return v, assetState, context
chain := newTestChain(t)
context := chain.newInteropContext(trigger.Application, storage.NewMemoryStore(), nil, nil)
return v, assetState, context, chain
}
func createVMAndContractState(t *testing.T) (*vm.VM, *state.Contract, *interopContext) {
func createVMAndContractState(t *testing.T) (*vm.VM, *state.Contract, *interopContext, *Blockchain) {
v := vm.New()
contractState := &state.Contract{
Script: []byte("testscript"),
@ -465,11 +503,12 @@ func createVMAndContractState(t *testing.T) (*vm.VM, *state.Contract, *interopCo
Description: random.String(10),
}
context := newTestChain(t).newInteropContext(trigger.Application, storage.NewMemoryStore(), nil, nil)
return v, contractState, context
chain := newTestChain(t)
context := chain.newInteropContext(trigger.Application, storage.NewMemoryStore(), nil, nil)
return v, contractState, context, chain
}
func createVMAndAccState(t *testing.T) (*vm.VM, *state.Account, *interopContext) {
func createVMAndAccState(t *testing.T) (*vm.VM, *state.Account, *interopContext, *Blockchain) {
v := vm.New()
rawHash := "4d3b96ae1bcc5a585e075e3b81920210dec16302"
hash, err := util.Uint160DecodeStringBE(rawHash)
@ -479,11 +518,12 @@ func createVMAndAccState(t *testing.T) (*vm.VM, *state.Account, *interopContext)
accountState.Votes = []*keys.PublicKey{key}
require.NoError(t, err)
context := newTestChain(t).newInteropContext(trigger.Application, storage.NewMemoryStore(), nil, nil)
return v, accountState, context
chain := newTestChain(t)
context := chain.newInteropContext(trigger.Application, storage.NewMemoryStore(), nil, nil)
return v, accountState, context, chain
}
func createVMAndTX(t *testing.T) (*vm.VM, *transaction.Transaction, *interopContext) {
func createVMAndTX(t *testing.T) (*vm.VM, *transaction.Transaction, *interopContext, *Blockchain) {
v := vm.New()
script := []byte{byte(opcode.PUSH1), byte(opcode.RET)}
tx := transaction.NewInvocationTX(script, 0)
@ -509,6 +549,7 @@ func createVMAndTX(t *testing.T) (*vm.VM, *transaction.Transaction, *interopCont
tx.Attributes = attributes
tx.Inputs = inputs
tx.Outputs = outputs
context := newTestChain(t).newInteropContext(trigger.Application, storage.NewMemoryStore(), nil, tx)
return v, tx, context
chain := newTestChain(t)
context := chain.newInteropContext(trigger.Application, storage.NewMemoryStore(), nil, tx)
return v, tx, context, chain
}

View file

@ -14,7 +14,9 @@ import (
func testNonInterop(t *testing.T, value interface{}, f func(*interopContext, *vm.VM) error) {
v := vm.New()
v.Estack().PushVal(value)
context := newTestChain(t).newInteropContext(trigger.Application, storage.NewMemoryStore(), nil, nil)
chain := newTestChain(t)
defer chain.Close()
context := chain.newInteropContext(trigger.Application, storage.NewMemoryStore(), nil, nil)
require.Error(t, f(context, v))
}

View file

@ -417,6 +417,8 @@ var rpcTestCases = map[string][]rpcTestCase{
func TestRPC(t *testing.T) {
chain, handler := initServerWithInMemoryChain(t)
defer chain.Close()
e := &executor{chain: chain, handler: handler}
for method, cases := range rpcTestCases {
t.Run(method, func(t *testing.T) {