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 acc, err := sdb.GetAccount(common.Idx(256))
44 assert.Nil(t, err)
45 assert.Equal(t, "23", acc.Balance.String())
46}
47
48func TestProcessTxsSynchronizer(t *testing.T) {
49 // TODO once TTGL is updated, use the blockchain L2Tx (not PoolL2Tx) for
50 // the Synchronizer tests
51
52 dir, err := ioutil.TempDir("", "tmpdb")
53 require.Nil(t, err)
54
55 sdb, err := NewStateDB(dir, TypeSynchronizer, 32)
56 assert.Nil(t, err)
57
58 // generate test transactions from test.SetTest0 code
59 parser := test.NewParser(strings.NewReader(test.SetTest0))
60 instructions, err := parser.Parse()
61 assert.Nil(t, err)
62
63 l1Txs, coordinatorL1Txs, poolL2Txs, _ := test.GenerateTestTxs(t, instructions)
64 assert.Equal(t, 29, len(l1Txs[0]))
65 assert.Equal(t, 0, len(coordinatorL1Txs[0]))
66 assert.Equal(t, 21, len(poolL2Txs[0]))
67 assert.Equal(t, 5, len(l1Txs[1]))
68 assert.Equal(t, 1, len(coordinatorL1Txs[1]))
69 assert.Equal(t, 55, len(poolL2Txs[1]))
70 assert.Equal(t, 10, len(l1Txs[2]))
71 assert.Equal(t, 0, len(coordinatorL1Txs[2]))
72 assert.Equal(t, 7, len(poolL2Txs[2]))
73
74 // use first batch
75 // l2txs := common.PoolL2TxsToL2Txs(poolL2Txs[0])
76 _, exitInfos, err := sdb.ProcessTxs(l1Txs[0], coordinatorL1Txs[0], poolL2Txs[0])
77 require.Nil(t, err)
78 // TODO once TTGL is updated, add a check that a input poolL2Tx with
79 // Nonce & TokenID =0, after ProcessTxs call has the expected value
80
81 assert.Equal(t, 0, len(exitInfos))
82 acc, err := sdb.GetAccount(common.Idx(256))
83 assert.Nil(t, err)
84 assert.Equal(t, "28", acc.Balance.String())
85
86 // use second batch
87 // l2txs = common.PoolL2TxsToL2Txs(poolL2Txs[1])
88 _, exitInfos, err = sdb.ProcessTxs(l1Txs[1], coordinatorL1Txs[1], poolL2Txs[1])
89 require.Nil(t, err)
90 assert.Equal(t, 5, len(exitInfos))
91 acc, err = sdb.GetAccount(common.Idx(256))
92 require.Nil(t, err)
93 assert.Equal(t, "48", acc.Balance.String())
94
95 // use third batch
96 // l2txs = common.PoolL2TxsToL2Txs(poolL2Txs[2])
97 _, exitInfos, err = sdb.ProcessTxs(l1Txs[2], coordinatorL1Txs[2], poolL2Txs[2])
98 require.Nil(t, err)
99 assert.Equal(t, 1, len(exitInfos))
100 acc, err = sdb.GetAccount(common.Idx(256))
101 assert.Nil(t, err)
102 assert.Equal(t, "23", acc.Balance.String())
103}
104
105func TestProcessTxsBatchBuilder(t *testing.T) {
106 dir, err := ioutil.TempDir("", "tmpdb")
107 require.Nil(t, err)
108
109 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
110 assert.Nil(t, err)
111
112 // generate test transactions from test.SetTest0 code
113 parser := test.NewParser(strings.NewReader(test.SetTest0))
114 instructions, err := parser.Parse()
115 assert.Nil(t, err)
116
117 l1Txs, coordinatorL1Txs, poolL2Txs, _ := test.GenerateTestTxs(t, instructions)
118 assert.Equal(t, 29, len(l1Txs[0]))
119 assert.Equal(t, 0, len(coordinatorL1Txs[0]))
120 assert.Equal(t, 21, len(poolL2Txs[0]))
121 assert.Equal(t, 5, len(l1Txs[1]))
122 assert.Equal(t, 1, len(coordinatorL1Txs[1]))
123 assert.Equal(t, 55, len(poolL2Txs[1]))
124 assert.Equal(t, 10, len(l1Txs[2]))
125 assert.Equal(t, 0, len(coordinatorL1Txs[2]))
126 assert.Equal(t, 7, len(poolL2Txs[2]))
127
128 // use first batch
129 // l2txs := common.PoolL2TxsToL2Txs(poolL2Txs[0])
130 _, exitInfos, err := sdb.ProcessTxs(l1Txs[0], coordinatorL1Txs[0], poolL2Txs[0])
131 require.Nil(t, err)
132 assert.Equal(t, 0, len(exitInfos))
133 acc, err := sdb.GetAccount(common.Idx(256))
134 assert.Nil(t, err)
135 assert.Equal(t, "28", acc.Balance.String())
136
137 // use second batch
138 // l2txs = common.PoolL2TxsToL2Txs(poolL2Txs[1])
139 _, exitInfos, err = sdb.ProcessTxs(l1Txs[1], coordinatorL1Txs[1], poolL2Txs[1])
140 require.Nil(t, err)
141 assert.Equal(t, 5, len(exitInfos))
142 acc, err = sdb.GetAccount(common.Idx(256))
143 require.Nil(t, err)
144 assert.Equal(t, "48", acc.Balance.String())
145
146 // use third batch
147 // l2txs = common.PoolL2TxsToL2Txs(poolL2Txs[2])
148 _, exitInfos, err = sdb.ProcessTxs(l1Txs[2], coordinatorL1Txs[2], poolL2Txs[2])
149 require.Nil(t, err)
150 assert.Equal(t, 1, len(exitInfos))
151 acc, err = sdb.GetAccount(common.Idx(256))
152 assert.Nil(t, err)
153 assert.Equal(t, "23", acc.Balance.String())
154}
155
156func TestZKInputsGeneration(t *testing.T) {
157 dir, err := ioutil.TempDir("", "tmpdb")
158 require.Nil(t, err)
159
160 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
161 assert.Nil(t, err)
162
163 // generate test transactions from test.SetTest0 code
164 parser := test.NewParser(strings.NewReader(test.SetTest0))
165 instructions, err := parser.Parse()
166 assert.Nil(t, err)
167
168 l1Txs, coordinatorL1Txs, poolL2Txs, _ := test.GenerateTestTxs(t, instructions)
169 assert.Equal(t, 29, len(l1Txs[0]))
170 assert.Equal(t, 0, len(coordinatorL1Txs[0]))
171 assert.Equal(t, 21, len(poolL2Txs[0]))
172
173 zki, _, err := sdb.ProcessTxs(l1Txs[0], coordinatorL1Txs[0], poolL2Txs[0])
174 require.Nil(t, err)
175
176 s, err := json.Marshal(zki)
177 require.Nil(t, err)
178 if debug {
179 fmt.Println(string(s))
180 }
181}