arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
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}