arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/db/statedb/utils_test.go
db/statedb/utils_test.goRaw
 1package statedb
 2
 3import (
 4	"fmt"
 5	"io/ioutil"
 6	"os"
 7	"testing"
 8
 9	ethCommon "github.com/ethereum/go-ethereum/common"
10	"github.com/hermeznetwork/hermez-node/common"
11	"github.com/hermeznetwork/tracerr"
12	"github.com/iden3/go-iden3-crypto/babyjub"
13	"github.com/stretchr/testify/assert"
14	"github.com/stretchr/testify/require"
15)
16
17func TestGetIdx(t *testing.T) {
18	dir, err := ioutil.TempDir("", "tmpdb")
19	require.NoError(t, err)
20	defer assert.NoError(t, os.RemoveAll(dir))
21
22	sdb, err := NewStateDB(dir, 128, TypeTxSelector, 0)
23	assert.NoError(t, err)
24
25	var sk babyjub.PrivateKey
26	copy(sk[:], []byte("1234")) // only for testing
27	pk := sk.Public()
28	var sk2 babyjub.PrivateKey
29	copy(sk2[:], []byte("12345")) // only for testing
30	pk2 := sk2.Public()
31	addr := ethCommon.HexToAddress("0x74E803744B7EEFc272E852f89a05D41515d431f2")
32	addr2 := ethCommon.HexToAddress("0x54A0706531cEa2ee8F09bAd22f604e377bb56948")
33	idx := common.Idx(1234)
34	idx2 := common.Idx(12345)
35	idx3 := common.Idx(1233)
36
37	tokenID0 := common.TokenID(0)
38	tokenID1 := common.TokenID(1)
39
40	// store the keys for idx by Addr & BJJ
41	err = sdb.setIdxByEthAddrBJJ(idx, addr, pk.Compress(), tokenID0)
42	require.NoError(t, err)
43
44	idxR, err := sdb.GetIdxByEthAddrBJJ(addr, pk.Compress(), tokenID0)
45	assert.NoError(t, err)
46	assert.Equal(t, idx, idxR)
47
48	// expect error when getting only by EthAddr, as value does not exist
49	// in the db for only EthAddr
50	_, err = sdb.GetIdxByEthAddr(addr, tokenID0)
51	assert.NoError(t, err)
52	_, err = sdb.GetIdxByEthAddr(addr2, tokenID0)
53	assert.NotNil(t, err)
54	// expect error when getting by EthAddr and BJJ, but for another TokenID
55	_, err = sdb.GetIdxByEthAddrBJJ(addr, pk.Compress(), tokenID1)
56	assert.NotNil(t, err)
57
58	// expect to fail
59	idxR, err = sdb.GetIdxByEthAddrBJJ(addr2, pk.Compress(), tokenID0)
60	assert.NotNil(t, err)
61	assert.Equal(t, common.Idx(0), idxR)
62	idxR, err = sdb.GetIdxByEthAddrBJJ(addr, pk2.Compress(), tokenID0)
63	assert.NotNil(t, err)
64	assert.Equal(t, common.Idx(0), idxR)
65
66	// try to store bigger idx, will not affect as already exist a smaller
67	// Idx for that Addr & BJJ
68	err = sdb.setIdxByEthAddrBJJ(idx2, addr, pk.Compress(), tokenID0)
69	assert.NoError(t, err)
70
71	// store smaller idx
72	err = sdb.setIdxByEthAddrBJJ(idx3, addr, pk.Compress(), tokenID0)
73	assert.NoError(t, err)
74
75	idxR, err = sdb.GetIdxByEthAddrBJJ(addr, pk.Compress(), tokenID0)
76	assert.NoError(t, err)
77	assert.Equal(t, idx3, idxR)
78
79	// by EthAddr should work
80	idxR, err = sdb.GetIdxByEthAddr(addr, tokenID0)
81	assert.NoError(t, err)
82	assert.Equal(t, idx3, idxR)
83	// expect error when trying to get Idx by addr2 & pk2
84	idxR, err = sdb.GetIdxByEthAddrBJJ(addr2, pk2.Compress(), tokenID0)
85	assert.NotNil(t, err)
86	expectedErr := fmt.Errorf("GetIdxByEthAddrBJJ: %s: ToEthAddr: %s, ToBJJ: %s, TokenID: %d", ErrToIdxNotFound, addr2.Hex(), pk2, tokenID0)
87	assert.Equal(t, expectedErr, tracerr.Unwrap(err))
88	assert.Equal(t, common.Idx(0), idxR)
89	// expect error when trying to get Idx by addr with not used TokenID
90	_, err = sdb.GetIdxByEthAddr(addr, tokenID1)
91	assert.NotNil(t, err)
92}