[#135] tests: cache compiled contracts
Speedup tests a bit. Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
79ca1a4451
commit
b5d5963b38
2 changed files with 73 additions and 33 deletions
|
@ -3,26 +3,20 @@ package tests
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"path"
|
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/cli/smartcontract"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/compiler"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config"
|
"github.com/nspcc-dev/neo-go/pkg/config"
|
||||||
"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"
|
"github.com/nspcc-dev/neo-go/pkg/core"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
||||||
"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/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/core/transaction"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/nef"
|
|
||||||
"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"
|
||||||
|
@ -164,34 +158,13 @@ func CheckFault(t *testing.T, bc *core.Blockchain, h util.Uint256, s string) {
|
||||||
|
|
||||||
// newDeployTx returns new deployment tx for contract.
|
// newDeployTx returns new deployment tx for contract.
|
||||||
func newDeployTx(t *testing.T, bc *core.Blockchain, ctrPath string, data interface{}) (*transaction.Transaction, util.Uint160) {
|
func newDeployTx(t *testing.T, bc *core.Blockchain, ctrPath string, data interface{}) (*transaction.Transaction, util.Uint160) {
|
||||||
// nef.NewFile() cares about version a lot.
|
c, err := ContractInfo(CommitteeAcc.Contract.ScriptHash(), ctrPath)
|
||||||
config.Version = "0.90.0-test"
|
|
||||||
|
|
||||||
avm, di, err := compiler.CompileWithDebugInfo(ctrPath, nil)
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
ne, err := nef.NewFile(avm)
|
rawManifest, err := json.Marshal(c.Manifest)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
conf, err := smartcontract.ParseContractConfig(path.Join(ctrPath, "config.yml"))
|
neb, err := c.NEF.Bytes()
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
o := &compiler.Options{}
|
|
||||||
o.Name = conf.Name
|
|
||||||
o.ContractEvents = conf.Events
|
|
||||||
o.ContractSupportedStandards = conf.SupportedStandards
|
|
||||||
o.Permissions = make([]manifest.Permission, len(conf.Permissions))
|
|
||||||
for i := range conf.Permissions {
|
|
||||||
o.Permissions[i] = manifest.Permission(conf.Permissions[i])
|
|
||||||
}
|
|
||||||
o.SafeMethods = conf.SafeMethods
|
|
||||||
m, err := compiler.CreateManifest(di, o)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
rawManifest, err := json.Marshal(m)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
neb, err := ne.Bytes()
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
buf := io.NewBufBinWriter()
|
buf := io.NewBufBinWriter()
|
||||||
|
@ -204,9 +177,7 @@ func newDeployTx(t *testing.T, bc *core.Blockchain, ctrPath string, data interfa
|
||||||
tx.Signers = []transaction.Signer{{Account: CommitteeAcc.Contract.ScriptHash()}}
|
tx.Signers = []transaction.Signer{{Account: CommitteeAcc.Contract.ScriptHash()}}
|
||||||
require.NoError(t, addNetworkFee(bc, tx, CommitteeAcc))
|
require.NoError(t, addNetworkFee(bc, tx, CommitteeAcc))
|
||||||
require.NoError(t, CommitteeAcc.SignTx(netmode.UnitTestNet, tx))
|
require.NoError(t, CommitteeAcc.SignTx(netmode.UnitTestNet, tx))
|
||||||
|
return tx, c.Hash
|
||||||
h := state.CreateContractHash(tx.Sender(), ne.Checksum, m.Name)
|
|
||||||
return tx, h
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func addSystemFee(bc *core.Blockchain, tx *transaction.Transaction) error {
|
func addSystemFee(bc *core.Blockchain, tx *transaction.Transaction) error {
|
||||||
|
|
69
tests/compile.go
Normal file
69
tests/compile.go
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
package tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/cli/smartcontract"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/compiler"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/config"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/nef"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Contract contains contract info for deployment.
|
||||||
|
type Contract struct {
|
||||||
|
Hash util.Uint160
|
||||||
|
NEF *nef.File
|
||||||
|
Manifest *manifest.Manifest
|
||||||
|
}
|
||||||
|
|
||||||
|
var contracts = map[string]*Contract{}
|
||||||
|
|
||||||
|
// ContractInfo compiles contract and returns it's NEF, manifest and hash.
|
||||||
|
func ContractInfo(sender util.Uint160, ctrPath string) (*Contract, error) {
|
||||||
|
if c, ok := contracts[ctrPath]; ok {
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// nef.NewFile() cares about version a lot.
|
||||||
|
config.Version = "0.90.0-test"
|
||||||
|
|
||||||
|
avm, di, err := compiler.CompileWithDebugInfo(ctrPath, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ne, err := nef.NewFile(avm)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
conf, err := smartcontract.ParseContractConfig(path.Join(ctrPath, "config.yml"))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
o := &compiler.Options{}
|
||||||
|
o.Name = conf.Name
|
||||||
|
o.ContractEvents = conf.Events
|
||||||
|
o.ContractSupportedStandards = conf.SupportedStandards
|
||||||
|
o.Permissions = make([]manifest.Permission, len(conf.Permissions))
|
||||||
|
for i := range conf.Permissions {
|
||||||
|
o.Permissions[i] = manifest.Permission(conf.Permissions[i])
|
||||||
|
}
|
||||||
|
o.SafeMethods = conf.SafeMethods
|
||||||
|
m, err := compiler.CreateManifest(di, o)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
c := &Contract{
|
||||||
|
Hash: state.CreateContractHash(sender, ne.Checksum, m.Name),
|
||||||
|
NEF: ne,
|
||||||
|
Manifest: m,
|
||||||
|
}
|
||||||
|
contracts[ctrPath] = c
|
||||||
|
return c, nil
|
||||||
|
}
|
Loading…
Reference in a new issue