forked from TrueCloudLab/neoneo-go
core: refactore some tests
They have a lot of common code.
This commit is contained in:
parent
17842dabd6
commit
9faa63453c
4 changed files with 20 additions and 94 deletions
|
@ -4,7 +4,6 @@ import (
|
||||||
"math/big"
|
"math/big"
|
||||||
"testing"
|
"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/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/dao"
|
"github.com/nspcc-dev/neo-go/pkg/core/dao"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
"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/native"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
"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/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"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
"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/smartcontract/trigger"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm"
|
"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/nspcc-dev/neo-go/pkg/vm/stackitem"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
@ -157,44 +153,24 @@ func TestNativeContract_Invoke(t *testing.T) {
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
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)
|
// System.Contract.Call + "sum" itself + opcodes for pushing arguments (PACK is 15000)
|
||||||
tx := transaction.New(chain.GetConfig().Magic, script, testSumPrice*2+18000)
|
res, err := invokeContractMethod(chain, testSumPrice*2+18000, tn.Metadata().Hash, "sum", int64(14), int64(28))
|
||||||
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)
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, 1, len(res))
|
checkResult(t, res, stackitem.Make(42))
|
||||||
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)
|
|
||||||
|
|
||||||
require.NoError(t, chain.persist())
|
require.NoError(t, chain.persist())
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case index := <-tn.blocks:
|
case index := <-tn.blocks:
|
||||||
require.Equal(t, chain.blockHeight, index)
|
require.Equal(t, chain.blockHeight, index)
|
||||||
default:
|
default:
|
||||||
require.Fail(t, "onPersist wasn't called")
|
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) {
|
func TestNativeContract_InvokeInternal(t *testing.T) {
|
||||||
|
@ -254,25 +230,8 @@ func TestNativeContract_InvokeOtherContract(t *testing.T) {
|
||||||
require.NoError(t, chain.dao.PutContractState(cs))
|
require.NoError(t, chain.dao.PutContractState(cs))
|
||||||
|
|
||||||
t.Run("non-native, no return", func(t *testing.T) {
|
t.Run("non-native, no return", func(t *testing.T) {
|
||||||
w := io.NewBufBinWriter()
|
res, err := invokeContractMethod(chain, testSumPrice*4+10000, tn.Metadata().Hash, "callOtherContractNoReturn", cs.ScriptHash(), "justReturn", []interface{}{})
|
||||||
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)
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, 1, len(res))
|
checkResult(t, res, stackitem.Null{}) // simple call is done with EnsureNotEmpty
|
||||||
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
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
func (bc *Blockchain) getNodesByRole(t *testing.T, ok bool, r native.Role, index uint32, resLen int) {
|
||||||
w := io.NewBufBinWriter()
|
res, err := invokeContractMethod(bc, 10_000_000, bc.contracts.Designate.Hash, "getDesignatedByRole", int64(r), int64(index))
|
||||||
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)
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, 1, len(aer))
|
|
||||||
if ok {
|
if ok {
|
||||||
require.Equal(t, vm.HaltState, aer[0].VMState)
|
require.Equal(t, vm.HaltState, res.VMState)
|
||||||
require.Equal(t, 1, len(aer[0].Stack))
|
require.Equal(t, 1, len(res.Stack))
|
||||||
arrItem := aer[0].Stack[0]
|
arrItem := res.Stack[0]
|
||||||
require.Equal(t, stackitem.ArrayT, arrItem.Type())
|
require.Equal(t, stackitem.ArrayT, arrItem.Type())
|
||||||
arr := arrItem.(*stackitem.Array)
|
arr := arrItem.(*stackitem.Array)
|
||||||
require.Equal(t, resLen, arr.Len())
|
require.Equal(t, resLen, arr.Len())
|
||||||
} else {
|
} else {
|
||||||
require.Equal(t, vm.FaultState, aer[0].VMState)
|
checkFAULTState(t, res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -313,14 +313,7 @@ func TestNEO_TransferOnPayment(t *testing.T) {
|
||||||
require.NoError(t, bc.dao.PutContractState(cs))
|
require.NoError(t, bc.dao.PutContractState(cs))
|
||||||
|
|
||||||
const amount = 2
|
const amount = 2
|
||||||
tx := newNEP17Transfer(bc.contracts.NEO.Hash, neoOwner, cs.ScriptHash(), amount)
|
tx := transferTokenFromMultisigAccount(t, bc, cs.ScriptHash(), bc.contracts.NEO.Hash, 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)))
|
|
||||||
|
|
||||||
aer, err := bc.GetAppExecResults(tx.Hash(), trigger.Application)
|
aer, err := bc.GetAppExecResults(tx.Hash(), trigger.Application)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, vm.HaltState, aer[0].VMState)
|
require.Equal(t, vm.HaltState, aer[0].VMState)
|
||||||
|
|
|
@ -90,23 +90,14 @@ func getOracleContractState(h util.Uint160) *state.Contract {
|
||||||
|
|
||||||
func putOracleRequest(t *testing.T, h util.Uint160, bc *Blockchain,
|
func putOracleRequest(t *testing.T, h util.Uint160, bc *Blockchain,
|
||||||
url string, filter *string, userData []byte, gas int64) util.Uint256 {
|
url string, filter *string, userData []byte, gas int64) util.Uint256 {
|
||||||
w := io.NewBufBinWriter()
|
|
||||||
var filtItem interface{}
|
var filtItem interface{}
|
||||||
if filter != nil {
|
if filter != nil {
|
||||||
filtItem = *filter
|
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)
|
url, filtItem, "handle", userData, gas)
|
||||||
require.NoError(t, w.Err)
|
require.NoError(t, err)
|
||||||
|
return res.Container
|
||||||
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()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestOracle_Request(t *testing.T) {
|
func TestOracle_Request(t *testing.T) {
|
||||||
|
|
Loading…
Reference in a new issue