core: get rid of global variables in tests

It can lead to unnecessary race conditions and is just
a bad practice.
This commit is contained in:
Evgenii Stratonikov 2020-02-29 17:24:37 +03:00
parent 8ca94e23c8
commit 357bb4ce41
2 changed files with 22 additions and 21 deletions

View file

@ -3,6 +3,7 @@ package core
import ( import (
"testing" "testing"
"github.com/CityOfZion/neo-go/pkg/core/block"
"github.com/CityOfZion/neo-go/pkg/core/storage" "github.com/CityOfZion/neo-go/pkg/core/storage"
"github.com/CityOfZion/neo-go/pkg/core/transaction" "github.com/CityOfZion/neo-go/pkg/core/transaction"
"github.com/CityOfZion/neo-go/pkg/crypto/hash" "github.com/CityOfZion/neo-go/pkg/crypto/hash"
@ -14,9 +15,10 @@ import (
func TestAddHeaders(t *testing.T) { func TestAddHeaders(t *testing.T) {
bc := newTestChain(t) bc := newTestChain(t)
h1 := newBlock(1).Header() lastBlock := bc.topBlock.Load().(*block.Block)
h2 := newBlock(2).Header() h1 := newBlock(bc.config, 1, lastBlock.Hash()).Header()
h3 := newBlock(3).Header() h2 := newBlock(bc.config, 2, h1.Hash()).Header()
h3 := newBlock(bc.config, 3, h2.Hash()).Header()
if err := bc.AddHeaders(h1, h2, h3); err != nil { if err := bc.AddHeaders(h1, h2, h3); err != nil {
t.Fatal(err) t.Fatal(err)
@ -83,7 +85,7 @@ func TestScriptFromWitness(t *testing.T) {
func TestGetHeader(t *testing.T) { func TestGetHeader(t *testing.T) {
bc := newTestChain(t) bc := newTestChain(t)
block := newBlock(1, newMinerTX()) block := bc.newBlock(newMinerTX())
err := bc.AddBlock(block) err := bc.AddBlock(block)
assert.Nil(t, err) assert.Nil(t, err)
@ -94,7 +96,7 @@ func TestGetHeader(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, block.Header(), header) assert.Equal(t, block.Header(), header)
b2 := newBlock(2) b2 := bc.newBlock()
_, err = bc.GetHeader(b2.Hash()) _, err = bc.GetHeader(b2.Hash())
assert.Error(t, err) assert.Error(t, err)
assert.NoError(t, bc.persist()) assert.NoError(t, bc.persist())
@ -130,7 +132,7 @@ func TestHasBlock(t *testing.T) {
for i := 0; i < len(blocks); i++ { for i := 0; i < len(blocks); i++ {
assert.True(t, bc.HasBlock(blocks[i].Hash())) assert.True(t, bc.HasBlock(blocks[i].Hash()))
} }
newBlock := newBlock(51) newBlock := bc.newBlock()
assert.False(t, bc.HasBlock(newBlock.Hash())) assert.False(t, bc.HasBlock(newBlock.Hash()))
assert.NoError(t, bc.persist()) assert.NoError(t, bc.persist())
} }

View file

@ -24,9 +24,6 @@ import (
"go.uber.org/zap/zaptest" "go.uber.org/zap/zaptest"
) )
var newBlockPrevHash util.Uint256
var unitTestNetCfg config.Config
var privNetKeys = []string{ var privNetKeys = []string{
"KxyjQ8eUa4FHt3Gvioyt1Wz29cTUrE4eTqX3yFSk1YFCsPL8uNsY", "KxyjQ8eUa4FHt3Gvioyt1Wz29cTUrE4eTqX3yFSk1YFCsPL8uNsY",
"KzfPUYDC9n2yf4fK5ro4C8KMcdeXtFuEnStycbZgX3GomiUsvX6W", "KzfPUYDC9n2yf4fK5ro4C8KMcdeXtFuEnStycbZgX3GomiUsvX6W",
@ -37,8 +34,7 @@ var privNetKeys = []string{
// newTestChain should be called before newBlock invocation to properly setup // newTestChain should be called before newBlock invocation to properly setup
// global state. // global state.
func newTestChain(t *testing.T) *Blockchain { func newTestChain(t *testing.T) *Blockchain {
var err error unitTestNetCfg, err := config.Load("../../config", config.ModeUnitTestNet)
unitTestNetCfg, err = config.Load("../../config", config.ModeUnitTestNet)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -47,14 +43,16 @@ func newTestChain(t *testing.T) *Blockchain {
t.Fatal(err) t.Fatal(err)
} }
go chain.Run() go chain.Run()
zeroHash, err := chain.GetHeader(chain.GetHeaderHash(0))
require.Nil(t, err)
newBlockPrevHash = zeroHash.Hash()
return chain return chain
} }
func newBlock(index uint32, txs ...*transaction.Transaction) *block.Block { func (bc *Blockchain) newBlock(txs ...*transaction.Transaction) *block.Block {
validators, _ := getValidators(unitTestNetCfg.ProtocolConfiguration) lastBlock := bc.topBlock.Load().(*block.Block)
return newBlock(bc.config, lastBlock.Index+1, lastBlock.Hash(), txs...)
}
func newBlock(cfg config.ProtocolConfiguration, index uint32, prev util.Uint256, txs ...*transaction.Transaction) *block.Block {
validators, _ := getValidators(cfg)
vlen := len(validators) vlen := len(validators)
valScript, _ := smartcontract.CreateMultiSigRedeemScript( valScript, _ := smartcontract.CreateMultiSigRedeemScript(
vlen-(vlen-1)/3, vlen-(vlen-1)/3,
@ -66,7 +64,7 @@ func newBlock(index uint32, txs ...*transaction.Transaction) *block.Block {
b := &block.Block{ b := &block.Block{
Base: block.Base{ Base: block.Base{
Version: 0, Version: 0,
PrevHash: newBlockPrevHash, PrevHash: prev,
Timestamp: uint32(time.Now().UTC().Unix()) + index, Timestamp: uint32(time.Now().UTC().Unix()) + index,
Index: index, Index: index,
ConsensusData: 1111, ConsensusData: 1111,
@ -76,7 +74,6 @@ func newBlock(index uint32, txs ...*transaction.Transaction) *block.Block {
Transactions: txs, Transactions: txs,
} }
_ = b.RebuildMerkleRoot() _ = b.RebuildMerkleRoot()
newBlockPrevHash = b.Hash()
invScript := make([]byte, 0) invScript := make([]byte, 0)
for _, wif := range privNetKeys { for _, wif := range privNetKeys {
@ -98,11 +95,13 @@ func newBlock(index uint32, txs ...*transaction.Transaction) *block.Block {
func (bc *Blockchain) genBlocks(n int) ([]*block.Block, error) { func (bc *Blockchain) genBlocks(n int) ([]*block.Block, error) {
blocks := make([]*block.Block, n) blocks := make([]*block.Block, n)
lastHash := bc.topBlock.Load().(*block.Block).Hash()
for i := 0; i < n; i++ { for i := 0; i < n; i++ {
blocks[i] = newBlock(uint32(i)+1, newMinerTX()) blocks[i] = newBlock(bc.config, uint32(i)+1, lastHash, newMinerTX())
if err := bc.AddBlock(blocks[i]); err != nil { if err := bc.AddBlock(blocks[i]); err != nil {
return blocks, err return blocks, err
} }
lastHash = blocks[i].Hash()
} }
return blocks, nil return blocks, nil
} }
@ -207,7 +206,7 @@ func _(t *testing.T) {
tx2 := transaction.NewInvocationTX(txScript, util.Fixed8FromFloat(100)) tx2 := transaction.NewInvocationTX(txScript, util.Fixed8FromFloat(100))
block := newBlock(uint32(n+1), tx1, tx2) block := bc.newBlock(tx1, tx2)
if err := bc.AddBlock(block); err != nil { if err := bc.AddBlock(block); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -221,7 +220,7 @@ func _(t *testing.T) {
emit.AppCall(script.BinWriter, hash.Hash160(avm), false) emit.AppCall(script.BinWriter, hash.Hash160(avm), false)
tx3 := transaction.NewInvocationTX(script.Bytes(), util.Fixed8FromFloat(100)) tx3 := transaction.NewInvocationTX(script.Bytes(), util.Fixed8FromFloat(100))
b := newBlock(uint32(n+2), newMinerTX(), tx3) b := bc.newBlock(newMinerTX(), tx3)
require.NoError(t, bc.AddBlock(b)) require.NoError(t, bc.AddBlock(b))
outStream, err := os.Create("../rpc/testdata/testblocks.acc") outStream, err := os.Create("../rpc/testdata/testblocks.acc")