From 9faa63453cf8e2c55c4cc73c94c1ca4cd80e239d Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Wed, 25 Nov 2020 18:10:14 +0300 Subject: [PATCH] core: refactore some tests They have a lot of common code. --- pkg/core/native_contract_test.go | 63 ++++++------------------------- pkg/core/native_designate_test.go | 27 +++---------- pkg/core/native_neo_test.go | 9 +---- pkg/core/native_oracle_test.go | 15 ++------ 4 files changed, 20 insertions(+), 94 deletions(-) diff --git a/pkg/core/native_contract_test.go b/pkg/core/native_contract_test.go index a2b2ab497..221dd35a7 100644 --- a/pkg/core/native_contract_test.go +++ b/pkg/core/native_contract_test.go @@ -4,7 +4,6 @@ import ( "math/big" "testing" - "github.com/nspcc-dev/neo-go/internal/testchain" "github.com/nspcc-dev/neo-go/pkg/config/netmode" "github.com/nspcc-dev/neo-go/pkg/core/dao" "github.com/nspcc-dev/neo-go/pkg/core/interop" @@ -12,14 +11,11 @@ import ( "github.com/nspcc-dev/neo-go/pkg/core/native" "github.com/nspcc-dev/neo-go/pkg/core/state" "github.com/nspcc-dev/neo-go/pkg/core/storage" - "github.com/nspcc-dev/neo-go/pkg/core/transaction" - "github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/smartcontract" "github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest" "github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger" "github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/vm" - "github.com/nspcc-dev/neo-go/pkg/vm/emit" "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" "github.com/stretchr/testify/require" ) @@ -157,44 +153,24 @@ func TestNativeContract_Invoke(t *testing.T) { }) require.NoError(t, err) - w := io.NewBufBinWriter() - emit.AppCallWithOperationAndArgs(w.BinWriter, tn.Metadata().Hash, "sum", int64(14), int64(28)) - script := w.Bytes() // System.Contract.Call + "sum" itself + opcodes for pushing arguments (PACK is 15000) - tx := transaction.New(chain.GetConfig().Magic, script, testSumPrice*2+18000) - validUntil := chain.blockHeight + 1 - tx.ValidUntilBlock = validUntil - addSigners(tx) - require.NoError(t, testchain.SignTx(chain, tx)) - - // Enough for Call and other opcodes, but not enough for "sum" call. - tx2 := transaction.New(chain.GetConfig().Magic, script, testSumPrice*2+8000) - tx2.ValidUntilBlock = chain.blockHeight + 1 - addSigners(tx2) - require.NoError(t, testchain.SignTx(chain, tx2)) - - b := chain.newBlock(tx, tx2) - require.NoError(t, chain.AddBlock(b)) - - res, err := chain.GetAppExecResults(tx.Hash(), trigger.Application) + res, err := invokeContractMethod(chain, testSumPrice*2+18000, tn.Metadata().Hash, "sum", int64(14), int64(28)) require.NoError(t, err) - require.Equal(t, 1, len(res)) - require.Equal(t, vm.HaltState, res[0].VMState) - require.Equal(t, 1, len(res[0].Stack)) - require.Equal(t, big.NewInt(42), res[0].Stack[0].Value()) - - res, err = chain.GetAppExecResults(tx2.Hash(), trigger.Application) - require.NoError(t, err) - require.Equal(t, 1, len(res)) - require.Equal(t, vm.FaultState, res[0].VMState) - + checkResult(t, res, stackitem.Make(42)) require.NoError(t, chain.persist()) + select { case index := <-tn.blocks: require.Equal(t, chain.blockHeight, index) default: require.Fail(t, "onPersist wasn't called") } + + // Enough for Call and other opcodes, but not enough for "sum" call. + res, err = invokeContractMethod(chain, testSumPrice*2+8000, tn.Metadata().Hash, "sum", int64(14), int64(28)) + require.NoError(t, err) + checkFAULTState(t, res) + } func TestNativeContract_InvokeInternal(t *testing.T) { @@ -254,25 +230,8 @@ func TestNativeContract_InvokeOtherContract(t *testing.T) { require.NoError(t, chain.dao.PutContractState(cs)) t.Run("non-native, no return", func(t *testing.T) { - w := io.NewBufBinWriter() - emit.AppCallWithOperationAndArgs(w.BinWriter, tn.Metadata().Hash, "callOtherContractNoReturn", - cs.ScriptHash(), "justReturn", []interface{}{}) - require.NoError(t, w.Err) - script := w.Bytes() - tx := transaction.New(chain.GetConfig().Magic, script, testSumPrice*4+10000) - validUntil := chain.blockHeight + 1 - tx.ValidUntilBlock = validUntil - addSigners(tx) - require.NoError(t, testchain.SignTx(chain, tx)) - - b := chain.newBlock(tx) - require.NoError(t, chain.AddBlock(b)) - - res, err := chain.GetAppExecResults(tx.Hash(), trigger.Application) + res, err := invokeContractMethod(chain, testSumPrice*4+10000, tn.Metadata().Hash, "callOtherContractNoReturn", cs.ScriptHash(), "justReturn", []interface{}{}) require.NoError(t, err) - require.Equal(t, 1, len(res)) - require.Equal(t, vm.HaltState, res[0].VMState) - require.Equal(t, 1, len(res[0].Stack)) - require.Equal(t, stackitem.Null{}, res[0].Stack[0]) // simple call is done with EnsureNotEmpty + checkResult(t, res, stackitem.Null{}) // simple call is done with EnsureNotEmpty }) } diff --git a/pkg/core/native_designate_test.go b/pkg/core/native_designate_test.go index 697821f00..d318c8772 100644 --- a/pkg/core/native_designate_test.go +++ b/pkg/core/native_designate_test.go @@ -64,34 +64,17 @@ func (bc *Blockchain) setNodesByRole(t *testing.T, ok bool, r native.Role, nodes } func (bc *Blockchain) getNodesByRole(t *testing.T, ok bool, r native.Role, index uint32, resLen int) { - w := io.NewBufBinWriter() - emit.AppCallWithOperationAndArgs(w.BinWriter, bc.contracts.Designate.Hash, "getDesignatedByRole", int64(r), int64(index)) - require.NoError(t, w.Err) - tx := transaction.New(netmode.UnitTestNet, w.Bytes(), 0) - tx.NetworkFee = 10_000_000 - tx.SystemFee = 10_000_000 - tx.ValidUntilBlock = 100 - tx.Signers = []transaction.Signer{ - { - Account: testchain.MultisigScriptHash(), - Scopes: transaction.None, - }, - } - require.NoError(t, testchain.SignTx(bc, tx)) - require.NoError(t, bc.AddBlock(bc.newBlock(tx))) - - aer, err := bc.GetAppExecResults(tx.Hash(), trigger.Application) + res, err := invokeContractMethod(bc, 10_000_000, bc.contracts.Designate.Hash, "getDesignatedByRole", int64(r), int64(index)) require.NoError(t, err) - require.Equal(t, 1, len(aer)) if ok { - require.Equal(t, vm.HaltState, aer[0].VMState) - require.Equal(t, 1, len(aer[0].Stack)) - arrItem := aer[0].Stack[0] + require.Equal(t, vm.HaltState, res.VMState) + require.Equal(t, 1, len(res.Stack)) + arrItem := res.Stack[0] require.Equal(t, stackitem.ArrayT, arrItem.Type()) arr := arrItem.(*stackitem.Array) require.Equal(t, resLen, arr.Len()) } else { - require.Equal(t, vm.FaultState, aer[0].VMState) + checkFAULTState(t, res) } } diff --git a/pkg/core/native_neo_test.go b/pkg/core/native_neo_test.go index de83f2fc5..6dae37cd4 100644 --- a/pkg/core/native_neo_test.go +++ b/pkg/core/native_neo_test.go @@ -313,14 +313,7 @@ func TestNEO_TransferOnPayment(t *testing.T) { require.NoError(t, bc.dao.PutContractState(cs)) const amount = 2 - tx := newNEP17Transfer(bc.contracts.NEO.Hash, neoOwner, cs.ScriptHash(), amount) - tx.SystemFee += 1_000_000 - tx.NetworkFee = 10_000_000 - tx.ValidUntilBlock = bc.BlockHeight() + 1 - addSigners(tx) - require.NoError(t, testchain.SignTx(bc, tx)) - require.NoError(t, bc.AddBlock(bc.newBlock(tx))) - + tx := transferTokenFromMultisigAccount(t, bc, cs.ScriptHash(), bc.contracts.NEO.Hash, amount) aer, err := bc.GetAppExecResults(tx.Hash(), trigger.Application) require.NoError(t, err) require.Equal(t, vm.HaltState, aer[0].VMState) diff --git a/pkg/core/native_oracle_test.go b/pkg/core/native_oracle_test.go index 7f0612044..9d9a310f7 100644 --- a/pkg/core/native_oracle_test.go +++ b/pkg/core/native_oracle_test.go @@ -90,23 +90,14 @@ func getOracleContractState(h util.Uint160) *state.Contract { func putOracleRequest(t *testing.T, h util.Uint160, bc *Blockchain, url string, filter *string, userData []byte, gas int64) util.Uint256 { - w := io.NewBufBinWriter() var filtItem interface{} if filter != nil { filtItem = *filter } - emit.AppCallWithOperationAndArgs(w.BinWriter, h, "requestURL", + res, err := invokeContractMethod(bc, gas+50_000_000+5_000_000, h, "requestURL", url, filtItem, "handle", userData, gas) - require.NoError(t, w.Err) - - gas += 50_000_000 + 5_000_000 // request + contract call with args - tx := transaction.New(netmode.UnitTestNet, w.Bytes(), gas) - tx.ValidUntilBlock = bc.BlockHeight() + 1 - tx.NetworkFee = 1_000_000 - setSigner(tx, testchain.MultisigScriptHash()) - require.NoError(t, testchain.SignTx(bc, tx)) - require.NoError(t, bc.AddBlock(bc.newBlock(tx))) - return tx.Hash() + require.NoError(t, err) + return res.Container } func TestOracle_Request(t *testing.T) {