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}