hermez-node/db/statedb/txprocessors_test.go
db/statedb/txprocessors_test.goRaw
1package statedb
2
3import (
4 "encoding/json"
5 "fmt"
6 "io/ioutil"
7 "strings"
8 "testing"
9
10 "github.com/hermeznetwork/hermez-node/common"
11 "github.com/hermeznetwork/hermez-node/test"
12 "github.com/stretchr/testify/assert"
13 "github.com/stretchr/testify/require"
14)
15
16var debug = false
17
18func TestProcessTxs(t *testing.T) {
19 dir, err := ioutil.TempDir("", "tmpdb")
20 require.Nil(t, err)
21
22 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
23 assert.Nil(t, err)
24
25 // generate test transactions from test.SetTest0 code
26 parser := test.NewParser(strings.NewReader(test.SetTest0))
27 instructions, err := parser.Parse()
28 assert.Nil(t, err)
29
30 l1Txs, coordinatorL1Txs, poolL2Txs, _ := test.GenerateTestTxs(t, instructions)
31 assert.Equal(t, 29, len(l1Txs[0]))
32 assert.Equal(t, 0, len(coordinatorL1Txs[0]))
33 assert.Equal(t, 21, len(poolL2Txs[0]))
34
35 // iterate for each batch
36 for i := 0; i < len(l1Txs); i++ {
37 // l2Txs := common.PoolL2TxsToL2Txs(poolL2Txs[i])
38
39 _, _, err := sdb.ProcessTxs(l1Txs[i], coordinatorL1Txs[i], poolL2Txs[i])
40 require.Nil(t, err)
41 }
42
43 accountIdx := common.Idx(256)
44 acc, err := sdb.GetAccount(&accountIdx)
45 assert.Nil(t, err)
46 assert.Equal(t, "23", acc.Balance.String())
47}
48
49func TestProcessTxsSynchronizer(t *testing.T) {
50 // TODO once TTGL is updated, use the blockchain L2Tx (not PoolL2Tx) for
51 // the Synchronizer tests
52
53 dir, err := ioutil.TempDir("", "tmpdb")
54 require.Nil(t, err)
55
56 sdb, err := NewStateDB(dir, TypeSynchronizer, 32)
57 assert.Nil(t, err)
58
59 // generate test transactions from test.SetTest0 code
60 parser := test.NewParser(strings.NewReader(test.SetTest0))
61 instructions, err := parser.Parse()
62 assert.Nil(t, err)
63
64 l1Txs, coordinatorL1Txs, poolL2Txs, _ := test.GenerateTestTxs(t, instructions)
65 assert.Equal(t, 29, len(l1Txs[0]))
66 assert.Equal(t, 0, len(coordinatorL1Txs[0]))
67 assert.Equal(t, 21, len(poolL2Txs[0]))
68 assert.Equal(t, 5, len(l1Txs[1]))
69 assert.Equal(t, 1, len(coordinatorL1Txs[1]))
70 assert.Equal(t, 55, len(poolL2Txs[1]))
71 assert.Equal(t, 10, len(l1Txs[2]))
72 assert.Equal(t, 0, len(coordinatorL1Txs[2]))
73 assert.Equal(t, 7, len(poolL2Txs[2]))
74
75 // use first batch
76 // l2txs := common.PoolL2TxsToL2Txs(poolL2Txs[0])
77 _, exitInfos, err := sdb.ProcessTxs(l1Txs[0], coordinatorL1Txs[0], poolL2Txs[0])
78 require.Nil(t, err)
79 // TODO once TTGL is updated, add a check that a input poolL2Tx with
80 // Nonce & TokenID =0, after ProcessTxs call has the expected value
81
82 assert.Equal(t, 0, len(exitInfos))
83 accountIdx := common.Idx(256)
84 acc, err := sdb.GetAccount(&accountIdx)
85 assert.Nil(t, err)
86 assert.Equal(t, "28", acc.Balance.String())
87
88 // use second batch
89 // l2txs = common.PoolL2TxsToL2Txs(poolL2Txs[1])
90 _, exitInfos, err = sdb.ProcessTxs(l1Txs[1], coordinatorL1Txs[1], poolL2Txs[1])
91 require.Nil(t, err)
92 assert.Equal(t, 5, len(exitInfos))
93 acc, err = sdb.GetAccount(&accountIdx)
94 require.Nil(t, err)
95 assert.Equal(t, "48", acc.Balance.String())
96
97 // use third batch
98 // l2txs = common.PoolL2TxsToL2Txs(poolL2Txs[2])
99 _, exitInfos, err = sdb.ProcessTxs(l1Txs[2], coordinatorL1Txs[2], poolL2Txs[2])
100 require.Nil(t, err)
101 assert.Equal(t, 1, len(exitInfos))
102 acc, err = sdb.GetAccount(&accountIdx)
103 assert.Nil(t, err)
104 assert.Equal(t, "23", acc.Balance.String())
105}
106
107func TestProcessTxsBatchBuilder(t *testing.T) {
108 dir, err := ioutil.TempDir("", "tmpdb")
109 require.Nil(t, err)
110
111 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
112 assert.Nil(t, err)
113
114 // generate test transactions from test.SetTest0 code
115 parser := test.NewParser(strings.NewReader(test.SetTest0))
116 instructions, err := parser.Parse()
117 assert.Nil(t, err)
118
119 l1Txs, coordinatorL1Txs, poolL2Txs, _ := test.GenerateTestTxs(t, instructions)
120 assert.Equal(t, 29, len(l1Txs[0]))
121 assert.Equal(t, 0, len(coordinatorL1Txs[0]))
122 assert.Equal(t, 21, len(poolL2Txs[0]))
123 assert.Equal(t, 5, len(l1Txs[1]))
124 assert.Equal(t, 1, len(coordinatorL1Txs[1]))
125 assert.Equal(t, 55, len(poolL2Txs[1]))
126 assert.Equal(t, 10, len(l1Txs[2]))
127 assert.Equal(t, 0, len(coordinatorL1Txs[2]))
128 assert.Equal(t, 7, len(poolL2Txs[2]))
129
130 // use first batch
131 // l2txs := common.PoolL2TxsToL2Txs(poolL2Txs[0])
132 _, exitInfos, err := sdb.ProcessTxs(l1Txs[0], coordinatorL1Txs[0], poolL2Txs[0])
133 require.Nil(t, err)
134 assert.Equal(t, 0, len(exitInfos))
135 accountIdx := common.Idx(256)
136 acc, err := sdb.GetAccount(&accountIdx)
137 assert.Nil(t, err)
138 assert.Equal(t, "28", acc.Balance.String())
139
140 // use second batch
141 // l2txs = common.PoolL2TxsToL2Txs(poolL2Txs[1])
142 _, exitInfos, err = sdb.ProcessTxs(l1Txs[1], coordinatorL1Txs[1], poolL2Txs[1])
143 require.Nil(t, err)
144 assert.Equal(t, 5, len(exitInfos))
145 acc, err = sdb.GetAccount(&accountIdx)
146 require.Nil(t, err)
147 assert.Equal(t, "48", acc.Balance.String())
148
149 // use third batch
150 // l2txs = common.PoolL2TxsToL2Txs(poolL2Txs[2])
151 _, exitInfos, err = sdb.ProcessTxs(l1Txs[2], coordinatorL1Txs[2], poolL2Txs[2])
152 require.Nil(t, err)
153 assert.Equal(t, 1, len(exitInfos))
154 acc, err = sdb.GetAccount(&accountIdx)
155 assert.Nil(t, err)
156 assert.Equal(t, "23", acc.Balance.String())
157}
158
159func TestZKInputsGeneration(t *testing.T) {
160 dir, err := ioutil.TempDir("", "tmpdb")
161 require.Nil(t, err)
162
163 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
164 assert.Nil(t, err)
165
166 // generate test transactions from test.SetTest0 code
167 parser := test.NewParser(strings.NewReader(test.SetTest0))
168 instructions, err := parser.Parse()
169 assert.Nil(t, err)
170
171 l1Txs, coordinatorL1Txs, poolL2Txs, _ := test.GenerateTestTxs(t, instructions)
172 assert.Equal(t, 29, len(l1Txs[0]))
173 assert.Equal(t, 0, len(coordinatorL1Txs[0]))
174 assert.Equal(t, 21, len(poolL2Txs[0]))
175
176 zki, _, err := sdb.ProcessTxs(l1Txs[0], coordinatorL1Txs[0], poolL2Txs[0])
177 require.Nil(t, err)
178
179 s, err := json.Marshal(zki)
180 require.Nil(t, err)
181 if debug {
182 fmt.Println(string(s))
183 }
184}