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	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}