hermez-node/db/statedb/txprocessors_test.go
db/statedb/txprocessors_test.goRaw
1package statedb
2
3import (
4 "io/ioutil"
5 "os"
6 "testing"
7
8 "github.com/hermeznetwork/hermez-node/common"
9 "github.com/hermeznetwork/hermez-node/test/transakcio"
10 "github.com/stretchr/testify/assert"
11 "github.com/stretchr/testify/require"
12)
13
14func TestProcessTxsSynchronizer(t *testing.T) {
15 // TODO once TTGL is updated, use the blockchain L2Tx (not PoolL2Tx) for
16 // the Synchronizer tests
17
18 dir, err := ioutil.TempDir("", "tmpdb")
19 require.Nil(t, err)
20 defer assert.Nil(t, os.RemoveAll(dir))
21
22 sdb, err := NewStateDB(dir, TypeSynchronizer, 32)
23 assert.Nil(t, err)
24
25 // generate test transactions from test.SetTest0 code
26 tc := transakcio.NewTestContext()
27 blocks, err := tc.GenerateBlocks(transakcio.SetBlockchain0)
28 require.Nil(t, err)
29
30 assert.Equal(t, 29, len(blocks[0].Batches[0].L1UserTxs))
31 assert.Equal(t, 0, len(blocks[0].Batches[0].L1CoordinatorTxs))
32 assert.Equal(t, 21, len(blocks[0].Batches[0].L2Txs))
33 assert.Equal(t, 1, len(blocks[0].Batches[1].L1UserTxs))
34 assert.Equal(t, 1, len(blocks[0].Batches[1].L1CoordinatorTxs))
35 assert.Equal(t, 59, len(blocks[0].Batches[1].L2Txs))
36 assert.Equal(t, 9, len(blocks[0].Batches[2].L1UserTxs))
37 assert.Equal(t, 1, len(blocks[0].Batches[2].L1CoordinatorTxs))
38 assert.Equal(t, 8, len(blocks[0].Batches[2].L2Txs))
39
40 // use first batch
41 l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[0].L2Txs)
42 _, exitInfos, err := sdb.ProcessTxs(blocks[0].Batches[0].L1UserTxs, blocks[0].Batches[0].L1CoordinatorTxs, l2Txs)
43 require.Nil(t, err)
44 // TODO once TTGL is updated, add a check that a input poolL2Tx with
45 // Nonce & TokenID =0, after ProcessTxs call has the expected value
46
47 assert.Equal(t, 0, len(exitInfos))
48 acc, err := sdb.GetAccount(common.Idx(256))
49 assert.Nil(t, err)
50 assert.Equal(t, "28", acc.Balance.String())
51
52 // use second batch
53 l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[1].L2Txs)
54 _, exitInfos, err = sdb.ProcessTxs(blocks[0].Batches[1].L1UserTxs, blocks[0].Batches[1].L1CoordinatorTxs, l2Txs)
55 require.Nil(t, err)
56 assert.Equal(t, 5, len(exitInfos))
57 acc, err = sdb.GetAccount(common.Idx(256))
58 require.Nil(t, err)
59 assert.Equal(t, "48", acc.Balance.String())
60
61 // use third batch
62 l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[2].L2Txs)
63 _, exitInfos, err = sdb.ProcessTxs(blocks[0].Batches[2].L1UserTxs, blocks[0].Batches[2].L1CoordinatorTxs, l2Txs)
64 require.Nil(t, err)
65 assert.Equal(t, 1, len(exitInfos))
66 acc, err = sdb.GetAccount(common.Idx(256))
67 assert.Nil(t, err)
68 assert.Equal(t, "73", acc.Balance.String())
69}
70
71/*
72WIP
73
74func TestProcessTxsBatchBuilder(t *testing.T) {
75 dir, err := ioutil.TempDir("", "tmpdb")
76 require.Nil(t, err)
77 defer assert.Nil(t, os.RemoveAll(dir))
78
79 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
80 assert.Nil(t, err)
81
82 // generate test transactions from test.SetTest0 code
83 tc := transakcio.NewTestContext()
84 blocks := tc.GenerateBlocks(transakcio.SetBlockchain0)
85
86 assert.Equal(t, 29, len(blocks[0].Batches[0].L1UserTxs))
87 assert.Equal(t, 0, len(blocks[0].Batches[0].L1CoordinatorTxs))
88 assert.Equal(t, 21, len(blocks[0].Batches[0].L2Txs))
89 assert.Equal(t, 1, len(blocks[0].Batches[1].L1UserTxs))
90 assert.Equal(t, 1, len(blocks[0].Batches[1].L1CoordinatorTxs))
91 assert.Equal(t, 59, len(blocks[0].Batches[1].L2Txs))
92 assert.Equal(t, 9, len(blocks[0].Batches[2].L1UserTxs))
93 assert.Equal(t, 0, len(blocks[0].Batches[2].L1CoordinatorTxs))
94 assert.Equal(t, 8, len(blocks[0].Batches[2].L2Txs))
95
96 // use first batch
97 l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[0].L2Txs)
98 _, exitInfos, err := sdb.ProcessTxs(blocks[0].Batches[0].L1UserTxs, blocks[0].Batches[0].L1CoordinatorTxs, l2Txs)
99 require.Nil(t, err)
100 assert.Equal(t, 0, len(exitInfos))
101 acc, err := sdb.GetAccount(common.Idx(256))
102 assert.Nil(t, err)
103 assert.Equal(t, "28", acc.Balance.String())
104
105 // use second batch
106 l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[1].L2Txs)
107 _, exitInfos, err = sdb.ProcessTxs(blocks[0].Batches[1].L1UserTxs, blocks[0].Batches[1].L1CoordinatorTxs, l2Txs)
108 require.Nil(t, err)
109 assert.Equal(t, 5, len(exitInfos))
110 acc, err = sdb.GetAccount(common.Idx(256))
111 require.Nil(t, err)
112 assert.Equal(t, "48", acc.Balance.String())
113
114 // use third batch
115 l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[2].L2Txs)
116 _, exitInfos, err = sdb.ProcessTxs(blocks[0].Batches[2].L1UserTxs, blocks[0].Batches[2].L1CoordinatorTxs, l2Txs)
117 require.Nil(t, err)
118 assert.Equal(t, 1, len(exitInfos))
119 acc, err = sdb.GetAccount(common.Idx(256))
120 assert.Nil(t, err)
121 assert.Equal(t, "23", acc.Balance.String())
122}
123
124func TestZKInputsGeneration(t *testing.T) {
125 dir, err := ioutil.TempDir("", "tmpdb")
126 require.Nil(t, err)
127 defer assert.Nil(t, os.RemoveAll(dir))
128
129 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
130 assert.Nil(t, err)
131
132 // generate test transactions from test.SetTest0 code
133 tc := transakcio.NewTestContext()
134 blocks := tc.GenerateBlocks(transakcio.SetBlockchain0)
135 assert.Equal(t, 29, len(blocks[0].Batches[0].L1UserTxs))
136 assert.Equal(t, 0, len(blocks[0].Batches[0].L1CoordinatorTxs))
137 assert.Equal(t, 21, len(blocks[0].Batches[0].L2Txs))
138
139 l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[0].L2Txs)
140 zki, _, err := sdb.ProcessTxs(blocks[0].Batches[0].L1UserTxs, blocks[0].Batches[0].L1CoordinatorTxs, l2Txs)
141 require.Nil(t, err)
142
143 s, err := json.Marshal(zki)
144 require.Nil(t, err)
145 debug:=true
146 if debug {
147 fmt.Println(string(s))
148 }
149}
150*/