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}