arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/api/parsers_test.go
api/parsers_test.goRaw
  1package api
  2
  3import (
  4	"encoding/base64"
  5	"math/big"
  6	"strconv"
  7	"testing"
  8
  9	ethCommon "github.com/ethereum/go-ethereum/common"
 10	"github.com/hermeznetwork/hermez-node/common"
 11	"github.com/iden3/go-iden3-crypto/babyjub"
 12	"github.com/stretchr/testify/assert"
 13)
 14
 15type queryParser struct {
 16	m map[string]string
 17}
 18
 19func (qp *queryParser) Query(query string) string {
 20	if val, ok := qp.m[query]; ok {
 21		return val
 22	}
 23	return ""
 24}
 25
 26func TestParseQueryUint(t *testing.T) {
 27	name := "foo"
 28	c := &queryParser{}
 29	c.m = make(map[string]string)
 30	var min uint = 1
 31	var max uint = 10
 32	var dflt *uint
 33	// Not uint
 34	c.m[name] = "-1"
 35	_, err := parseQueryUint(name, dflt, min, max, c)
 36	assert.Error(t, err)
 37	c.m[name] = "a"
 38	_, err = parseQueryUint(name, dflt, min, max, c)
 39	assert.Error(t, err)
 40	c.m[name] = "0.1"
 41	_, err = parseQueryUint(name, dflt, min, max, c)
 42	assert.Error(t, err)
 43	c.m[name] = "1.0"
 44	_, err = parseQueryUint(name, dflt, min, max, c)
 45	assert.Error(t, err)
 46	// Out of range
 47	c.m[name] = strconv.Itoa(int(min) - 1)
 48	_, err = parseQueryUint(name, dflt, min, max, c)
 49	assert.Error(t, err)
 50	c.m[name] = strconv.Itoa(int(max) + 1)
 51	_, err = parseQueryUint(name, dflt, min, max, c)
 52	assert.Error(t, err)
 53	// Default nil
 54	c.m[name] = ""
 55	res, err := parseQueryUint(name, dflt, min, max, c)
 56	assert.NoError(t, err)
 57	assert.Nil(t, res)
 58	// Default not nil
 59	dflt = new(uint)
 60	*dflt = uint(min)
 61	res, err = parseQueryUint(name, dflt, min, max, c)
 62	assert.NoError(t, err)
 63	assert.Equal(t, uint(min), *res)
 64	// Correct
 65	c.m[name] = strconv.Itoa(int(max))
 66	res, err = parseQueryUint(name, res, min, max, c)
 67	assert.NoError(t, err)
 68	assert.Equal(t, uint(max), *res)
 69}
 70
 71func TestParseQueryBool(t *testing.T) {
 72	name := "foo"
 73	c := &queryParser{}
 74	c.m = make(map[string]string)
 75	var dflt *bool
 76	// Not bool
 77	c.m[name] = "x"
 78	_, err := parseQueryBool(name, dflt, c)
 79	assert.Error(t, err)
 80	c.m[name] = "False"
 81	_, err = parseQueryBool(name, dflt, c)
 82	assert.Error(t, err)
 83	c.m[name] = "0"
 84	_, err = parseQueryBool(name, dflt, c)
 85	assert.Error(t, err)
 86	c.m[name] = "1"
 87	_, err = parseQueryBool(name, dflt, c)
 88	assert.Error(t, err)
 89	// Default nil
 90	c.m[name] = ""
 91	res, err := parseQueryBool(name, dflt, c)
 92	assert.NoError(t, err)
 93	assert.Nil(t, res)
 94	// Default not nil
 95	dflt = new(bool)
 96	*dflt = true
 97	res, err = parseQueryBool(name, dflt, c)
 98	assert.NoError(t, err)
 99	assert.True(t, *res)
100	// Correct
101	c.m[name] = "false"
102	res, err = parseQueryBool(name, dflt, c)
103	assert.NoError(t, err)
104	assert.False(t, *res)
105	c.m[name] = "true"
106	res, err = parseQueryBool(name, dflt, c)
107	assert.NoError(t, err)
108	assert.True(t, *res)
109}
110
111func TestParsePagination(t *testing.T) {
112	c := &queryParser{}
113	c.m = make(map[string]string)
114	// Offset out of range
115	c.m["offset"] = "-1"
116	_, _, _, err := parsePagination(c)
117	assert.Error(t, err)
118	c.m["offset"] = strconv.Itoa(maxUint32 + 1)
119	_, _, _, err = parsePagination(c)
120	assert.Error(t, err)
121	c.m["offset"] = ""
122	// Limit out of range
123	c.m["limit"] = "0"
124	_, _, _, err = parsePagination(c)
125	assert.Error(t, err)
126	c.m["limit"] = strconv.Itoa(int(maxLimit) + 1)
127	_, _, _, err = parsePagination(c)
128	assert.Error(t, err)
129	c.m["limit"] = ""
130	// Last and offset
131	c.m["offset"] = "1"
132	c.m["last"] = "true"
133	_, _, _, err = parsePagination(c)
134	assert.Error(t, err)
135	// Default
136	c.m["offset"] = ""
137	c.m["last"] = ""
138	c.m["limit"] = ""
139	offset, last, limit, err := parsePagination(c)
140	assert.NoError(t, err)
141	assert.Equal(t, 0, int(*offset))
142	assert.Equal(t, dfltLast, *last)
143	assert.Equal(t, dfltLimit, *limit)
144	// Correct
145	c.m["offset"] = ""
146	c.m["last"] = "true"
147	c.m["limit"] = "25"
148	offset, last, limit, err = parsePagination(c)
149	assert.NoError(t, err)
150	assert.Equal(t, 0, int(*offset))
151	assert.True(t, *last)
152	assert.Equal(t, 25, int(*limit))
153	c.m["offset"] = "25"
154	c.m["last"] = "false"
155	c.m["limit"] = "50"
156	offset, last, limit, err = parsePagination(c)
157	assert.NoError(t, err)
158	assert.Equal(t, 25, int(*offset))
159	assert.False(t, *last)
160	assert.Equal(t, 50, int(*limit))
161}
162
163func TestParseQueryHezEthAddr(t *testing.T) {
164	name := "hermezEthereumAddress"
165	c := &queryParser{}
166	c.m = make(map[string]string)
167	ethAddr := ethCommon.BigToAddress(big.NewInt(int64(347683)))
168	// Not HEZ Eth addr
169	c.m[name] = "hez:0xf"
170	_, err := parseQueryHezEthAddr(c)
171	assert.Error(t, err)
172	c.m[name] = ethAddr.String()
173	_, err = parseQueryHezEthAddr(c)
174	assert.Error(t, err)
175	c.m[name] = "hez:0xXX942cfcd25ad4d90a62358b0dd84f33b39826XX"
176	_, err = parseQueryHezEthAddr(c)
177	assert.Error(t, err)
178	// Default
179	c.m[name] = ""
180	res, err := parseQueryHezEthAddr(c)
181	assert.NoError(t, err)
182	assert.Nil(t, res)
183	// Correct
184	c.m[name] = "hez:" + ethAddr.String()
185	res, err = parseQueryHezEthAddr(c)
186	assert.NoError(t, err)
187	assert.Equal(t, ethAddr, *res)
188}
189
190func TestParseQueryBJJ(t *testing.T) {
191	name := "BJJ"
192	c := &queryParser{}
193	c.m = make(map[string]string)
194	privK := babyjub.NewRandPrivKey()
195	pubK := privK.Public()
196	pkComp := [32]byte(pubK.Compress())
197	// Not HEZ Eth addr
198	c.m[name] = "hez:abcd"
199	_, err := parseQueryBJJ(c)
200	assert.Error(t, err)
201	c.m[name] = pubK.String()
202	_, err = parseQueryBJJ(c)
203	assert.Error(t, err)
204	// Wrong checksum
205	bjjSum := append(pkComp[:], byte(1))
206	c.m[name] = "hez:" + base64.RawStdEncoding.EncodeToString(bjjSum)
207	_, err = parseQueryBJJ(c)
208	assert.Error(t, err)
209	// Default
210	c.m[name] = ""
211	res, err := parseQueryBJJ(c)
212	assert.NoError(t, err)
213	assert.Nil(t, res)
214	// Correct
215	c.m[name] = bjjToString(pubK)
216	res, err = parseQueryBJJ(c)
217	assert.NoError(t, err)
218	assert.Equal(t, *pubK, *res)
219}
220
221func TestParseQueryTxType(t *testing.T) {
222	name := "type"
223	c := &queryParser{}
224	c.m = make(map[string]string)
225	// Incorrect values
226	c.m[name] = "deposit"
227	_, err := parseQueryTxType(c)
228	assert.Error(t, err)
229	c.m[name] = "1"
230	_, err = parseQueryTxType(c)
231	assert.Error(t, err)
232	// Default
233	c.m[name] = ""
234	res, err := parseQueryTxType(c)
235	assert.NoError(t, err)
236	assert.Nil(t, res)
237	// Correct values
238	c.m[name] = string(common.TxTypeExit)
239	res, err = parseQueryTxType(c)
240	assert.NoError(t, err)
241	assert.Equal(t, common.TxTypeExit, *res)
242	c.m[name] = string(common.TxTypeWithdrawn)
243	res, err = parseQueryTxType(c)
244	assert.NoError(t, err)
245	assert.Equal(t, common.TxTypeWithdrawn, *res)
246	c.m[name] = string(common.TxTypeTransfer)
247	res, err = parseQueryTxType(c)
248	assert.NoError(t, err)
249	assert.Equal(t, common.TxTypeTransfer, *res)
250	c.m[name] = string(common.TxTypeDeposit)
251	res, err = parseQueryTxType(c)
252	assert.NoError(t, err)
253	assert.Equal(t, common.TxTypeDeposit, *res)
254	c.m[name] = string(common.TxTypeCreateAccountDeposit)
255	res, err = parseQueryTxType(c)
256	assert.NoError(t, err)
257	assert.Equal(t, common.TxTypeCreateAccountDeposit, *res)
258	c.m[name] = string(common.TxTypeCreateAccountDepositTransfer)
259	res, err = parseQueryTxType(c)
260	assert.NoError(t, err)
261	assert.Equal(t, common.TxTypeCreateAccountDepositTransfer, *res)
262	c.m[name] = string(common.TxTypeDepositTransfer)
263	res, err = parseQueryTxType(c)
264	assert.NoError(t, err)
265	assert.Equal(t, common.TxTypeDepositTransfer, *res)
266	c.m[name] = string(common.TxTypeForceTransfer)
267	res, err = parseQueryTxType(c)
268	assert.NoError(t, err)
269	assert.Equal(t, common.TxTypeForceTransfer, *res)
270	c.m[name] = string(common.TxTypeForceExit)
271	res, err = parseQueryTxType(c)
272	assert.NoError(t, err)
273	assert.Equal(t, common.TxTypeForceExit, *res)
274	c.m[name] = string(common.TxTypeTransferToEthAddr)
275	res, err = parseQueryTxType(c)
276	assert.NoError(t, err)
277	assert.Equal(t, common.TxTypeTransferToEthAddr, *res)
278	c.m[name] = string(common.TxTypeTransferToBJJ)
279	res, err = parseQueryTxType(c)
280	assert.NoError(t, err)
281	assert.Equal(t, common.TxTypeTransferToBJJ, *res)
282}