arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/db/statedb/statedb_test.go
db/statedb/statedb_test.goRaw
  1package statedb
  2
  3import (
  4	"encoding/hex"
  5	"io/ioutil"
  6	"math/big"
  7	"testing"
  8
  9	ethCrypto "github.com/ethereum/go-ethereum/crypto"
 10	"github.com/hermeznetwork/hermez-node/common"
 11	"github.com/iden3/go-iden3-crypto/babyjub"
 12	"github.com/iden3/go-merkletree/db"
 13	"github.com/stretchr/testify/assert"
 14	"github.com/stretchr/testify/require"
 15)
 16
 17func newAccount(t *testing.T, i int) *common.Account {
 18	var sk babyjub.PrivateKey
 19	_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
 20	require.Nil(t, err)
 21	pk := sk.Public()
 22
 23	key, err := ethCrypto.GenerateKey()
 24	require.Nil(t, err)
 25	address := ethCrypto.PubkeyToAddress(key.PublicKey)
 26
 27	return &common.Account{
 28		TokenID:   common.TokenID(i),
 29		Nonce:     uint64(i),
 30		Balance:   big.NewInt(1000),
 31		PublicKey: pk,
 32		EthAddr:   address,
 33	}
 34
 35}
 36
 37func TestStateDBWithoutMT(t *testing.T) {
 38	dir, err := ioutil.TempDir("", "tmpdb")
 39	require.Nil(t, err)
 40
 41	sdb, err := NewStateDB(dir, false, false, 0)
 42	assert.Nil(t, err)
 43
 44	// create test accounts
 45	var accounts []*common.Account
 46	for i := 0; i < 100; i++ {
 47		accounts = append(accounts, newAccount(t, i))
 48	}
 49
 50	// get non-existing account, expecting an error
 51	_, err = sdb.GetAccount(common.Idx(1))
 52	assert.NotNil(t, err)
 53	assert.Equal(t, db.ErrNotFound, err)
 54
 55	// add test accounts
 56	for i := 0; i < len(accounts); i++ {
 57		err = sdb.CreateAccount(common.Idx(i), accounts[i])
 58		assert.Nil(t, err)
 59	}
 60
 61	for i := 0; i < len(accounts); i++ {
 62		accGetted, err := sdb.GetAccount(common.Idx(i))
 63		assert.Nil(t, err)
 64		assert.Equal(t, accounts[i], accGetted)
 65	}
 66
 67	// try already existing idx and get error
 68	_, err = sdb.GetAccount(common.Idx(1)) // check that exist
 69	assert.Nil(t, err)
 70	err = sdb.CreateAccount(common.Idx(1), accounts[1]) // check that can not be created twice
 71	assert.NotNil(t, err)
 72	assert.Equal(t, ErrAccountAlreadyExists, err)
 73
 74	// update accounts
 75	for i := 0; i < len(accounts); i++ {
 76		accounts[i].Nonce = accounts[i].Nonce + 1
 77		err = sdb.UpdateAccount(common.Idx(i), accounts[i])
 78		assert.Nil(t, err)
 79	}
 80
 81	// check that can not call MerkleTree methods of the StateDB
 82	_, err = sdb.MTCreateAccount(common.Idx(1), accounts[1])
 83	assert.NotNil(t, err)
 84	assert.Equal(t, ErrStateDBWithoutMT, err)
 85
 86	_, err = sdb.MTUpdateAccount(common.Idx(1), accounts[1])
 87	assert.NotNil(t, err)
 88	assert.Equal(t, ErrStateDBWithoutMT, err)
 89
 90	_, err = sdb.MTGetProof(common.Idx(1))
 91	assert.NotNil(t, err)
 92	assert.Equal(t, ErrStateDBWithoutMT, err)
 93}
 94
 95func TestStateDBWithMT(t *testing.T) {
 96	dir, err := ioutil.TempDir("", "tmpdb")
 97	require.Nil(t, err)
 98
 99	sdb, err := NewStateDB(dir, false, true, 32)
100	assert.Nil(t, err)
101
102	// create test accounts
103	var accounts []*common.Account
104	for i := 0; i < 100; i++ {
105		accounts = append(accounts, newAccount(t, i))
106	}
107
108	// get non-existing account, expecting an error
109	_, err = sdb.GetAccount(common.Idx(1))
110	assert.NotNil(t, err)
111	assert.Equal(t, db.ErrNotFound, err)
112
113	// add test accounts
114	for i := 0; i < len(accounts); i++ {
115		_, err = sdb.MTCreateAccount(common.Idx(i), accounts[i])
116		assert.Nil(t, err)
117	}
118
119	for i := 0; i < len(accounts); i++ {
120		accGetted, err := sdb.GetAccount(common.Idx(i))
121		assert.Nil(t, err)
122		assert.Equal(t, accounts[i], accGetted)
123	}
124
125	// try already existing idx and get error
126	_, err = sdb.GetAccount(common.Idx(1)) // check that exist
127	assert.Nil(t, err)
128	_, err = sdb.MTCreateAccount(common.Idx(1), accounts[1]) // check that can not be created twice
129	assert.NotNil(t, err)
130	assert.Equal(t, ErrAccountAlreadyExists, err)
131
132	_, err = sdb.MTGetProof(common.Idx(1))
133	assert.Nil(t, err)
134
135	// update accounts
136	for i := 0; i < len(accounts); i++ {
137		accounts[i].Nonce = accounts[i].Nonce + 1
138		_, err = sdb.MTUpdateAccount(common.Idx(i), accounts[i])
139		assert.Nil(t, err)
140	}
141	a, err := sdb.GetAccount(common.Idx(1)) // check that account value has been updated
142	assert.Nil(t, err)
143	assert.Equal(t, accounts[1].Nonce, a.Nonce)
144}