arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/apitypes/apitypes_test.go
apitypes/apitypes_test.goRaw
  1package apitypes
  2
  3import (
  4	"database/sql"
  5	"io/ioutil"
  6	"math/big"
  7	"os"
  8	"testing"
  9
 10	"github.com/iden3/go-iden3-crypto/babyjub"
 11
 12	ethCommon "github.com/ethereum/go-ethereum/common"
 13	dbUtils "github.com/hermeznetwork/hermez-node/db"
 14	_ "github.com/mattn/go-sqlite3" // sqlite driver
 15	"github.com/russross/meddler"
 16	"github.com/stretchr/testify/assert"
 17)
 18
 19var db *sql.DB
 20
 21func TestMain(m *testing.M) {
 22	// Register meddler
 23	meddler.Default = meddler.SQLite
 24	meddler.Register("bigint", dbUtils.BigIntMeddler{})
 25	meddler.Register("bigintnull", dbUtils.BigIntNullMeddler{})
 26	// Create temporary sqlite DB
 27	dir, err := ioutil.TempDir("", "db")
 28	if err != nil {
 29		panic(err)
 30	}
 31	db, err = sql.Open("sqlite3", dir+"sqlite.db")
 32	defer os.RemoveAll(dir)
 33	if err != nil {
 34		panic(err)
 35	}
 36	schema := `CREATE TABLE test (i BLOB);`
 37	if _, err := db.Exec(schema); err != nil {
 38		panic(err)
 39	}
 40	// Run tests
 41	result := m.Run()
 42	os.Exit(result)
 43}
 44
 45func TestBigIntStrScannerValuer(t *testing.T) {
 46	// Clean DB
 47	_, err := db.Exec("delete from test")
 48	assert.NoError(t, err)
 49	// Example structs
 50	type bigInMeddlerStruct struct {
 51		I *big.Int `meddler:"i,bigint"` // note the bigint that instructs meddler to use BigIntMeddler
 52	}
 53	type bigIntStrStruct struct {
 54		I BigIntStr `meddler:"i"` // note that no meddler is specified, and Scan/Value will be used
 55	}
 56	type bigInMeddlerStructNil struct {
 57		I *big.Int `meddler:"i,bigintnull"` // note the bigint that instructs meddler to use BigIntNullMeddler
 58	}
 59	type bigIntStrStructNil struct {
 60		I *BigIntStr `meddler:"i"` // note that no meddler is specified, and Scan/Value will be used
 61	}
 62
 63	// Not nil case
 64	// Insert into DB using meddler
 65	const x = int64(12345)
 66	fromMeddler := bigInMeddlerStruct{
 67		I: big.NewInt(x),
 68	}
 69	err = meddler.Insert(db, "test", &fromMeddler)
 70	assert.NoError(t, err)
 71	// Read from DB using BigIntStr
 72	toBigIntStr := bigIntStrStruct{}
 73	err = meddler.QueryRow(db, &toBigIntStr, "select * from test")
 74	assert.NoError(t, err)
 75	assert.Equal(t, fromMeddler.I.String(), string(toBigIntStr.I))
 76	// Clean DB
 77	_, err = db.Exec("delete from test")
 78	assert.NoError(t, err)
 79	// Insert into DB using BigIntStr
 80	fromBigIntStr := bigIntStrStruct{
 81		I: "54321",
 82	}
 83	err = meddler.Insert(db, "test", &fromBigIntStr)
 84	assert.NoError(t, err)
 85	// Read from DB using meddler
 86	toMeddler := bigInMeddlerStruct{}
 87	err = meddler.QueryRow(db, &toMeddler, "select * from test")
 88	assert.NoError(t, err)
 89	assert.Equal(t, string(fromBigIntStr.I), toMeddler.I.String())
 90
 91	// Nil case
 92	// Clean DB
 93	_, err = db.Exec("delete from test")
 94	assert.NoError(t, err)
 95	// Insert into DB using meddler
 96	fromMeddlerNil := bigInMeddlerStructNil{
 97		I: nil,
 98	}
 99	err = meddler.Insert(db, "test", &fromMeddlerNil)
100	assert.NoError(t, err)
101	// Read from DB using BigIntStr
102	foo := BigIntStr("foo")
103	toBigIntStrNil := bigIntStrStructNil{
104		I: &foo, // check that this will be set to nil, not because of not being initialized
105	}
106	err = meddler.QueryRow(db, &toBigIntStrNil, "select * from test")
107	assert.NoError(t, err)
108	assert.Nil(t, toBigIntStrNil.I)
109	// Clean DB
110	_, err = db.Exec("delete from test")
111	assert.NoError(t, err)
112	// Insert into DB using BigIntStr
113	fromBigIntStrNil := bigIntStrStructNil{
114		I: nil,
115	}
116	err = meddler.Insert(db, "test", &fromBigIntStrNil)
117	assert.NoError(t, err)
118	// Read from DB using meddler
119	toMeddlerNil := bigInMeddlerStructNil{
120		I: big.NewInt(x), // check that this will be set to nil, not because of not being initialized
121	}
122	err = meddler.QueryRow(db, &toMeddlerNil, "select * from test")
123	assert.NoError(t, err)
124	assert.Nil(t, toMeddlerNil.I)
125}
126
127func TestHezEthAddr(t *testing.T) {
128	// Clean DB
129	_, err := db.Exec("delete from test")
130	assert.NoError(t, err)
131	// Example structs
132	type ethAddrStruct struct {
133		I ethCommon.Address `meddler:"i"`
134	}
135	type hezEthAddrStruct struct {
136		I HezEthAddr `meddler:"i"`
137	}
138	type ethAddrStructNil struct {
139		I *ethCommon.Address `meddler:"i"`
140	}
141	type hezEthAddrStructNil struct {
142		I *HezEthAddr `meddler:"i"`
143	}
144
145	// Not nil case
146	// Insert into DB using ethCommon.Address Scan/Value
147	fromEth := ethAddrStruct{
148		I: ethCommon.BigToAddress(big.NewInt(73737373)),
149	}
150	err = meddler.Insert(db, "test", &fromEth)
151	assert.NoError(t, err)
152	// Read from DB using HezEthAddr Scan/Value
153	toHezEth := hezEthAddrStruct{}
154	err = meddler.QueryRow(db, &toHezEth, "select * from test")
155	assert.NoError(t, err)
156	assert.Equal(t, NewHezEthAddr(fromEth.I), toHezEth.I)
157	// Clean DB
158	_, err = db.Exec("delete from test")
159	assert.NoError(t, err)
160	// Insert into DB using HezEthAddr Scan/Value
161	fromHezEth := hezEthAddrStruct{
162		I: NewHezEthAddr(ethCommon.BigToAddress(big.NewInt(3786872586))),
163	}
164	err = meddler.Insert(db, "test", &fromHezEth)
165	assert.NoError(t, err)
166	// Read from DB using ethCommon.Address Scan/Value
167	toEth := ethAddrStruct{}
168	err = meddler.QueryRow(db, &toEth, "select * from test")
169	assert.NoError(t, err)
170	assert.Equal(t, fromHezEth.I, NewHezEthAddr(toEth.I))
171
172	// Nil case
173	// Clean DB
174	_, err = db.Exec("delete from test")
175	assert.NoError(t, err)
176	// Insert into DB using ethCommon.Address Scan/Value
177	fromEthNil := ethAddrStructNil{
178		I: nil,
179	}
180	err = meddler.Insert(db, "test", &fromEthNil)
181	assert.NoError(t, err)
182	// Read from DB using HezEthAddr Scan/Value
183	foo := HezEthAddr("foo")
184	toHezEthNil := hezEthAddrStructNil{
185		I: &foo, // check that this will be set to nil, not because of not being initialized
186	}
187	err = meddler.QueryRow(db, &toHezEthNil, "select * from test")
188	assert.NoError(t, err)
189	assert.Nil(t, toHezEthNil.I)
190	// Clean DB
191	_, err = db.Exec("delete from test")
192	assert.NoError(t, err)
193	// Insert into DB using HezEthAddr Scan/Value
194	fromHezEthNil := hezEthAddrStructNil{
195		I: nil,
196	}
197	err = meddler.Insert(db, "test", &fromHezEthNil)
198	assert.NoError(t, err)
199	// Read from DB using ethCommon.Address Scan/Value
200	fooAddr := ethCommon.BigToAddress(big.NewInt(1))
201	toEthNil := ethAddrStructNil{
202		I: &fooAddr, // check that this will be set to nil, not because of not being initialized
203	}
204	err = meddler.QueryRow(db, &toEthNil, "select * from test")
205	assert.NoError(t, err)
206	assert.Nil(t, toEthNil.I)
207}
208
209func TestHezBJJ(t *testing.T) {
210	// Clean DB
211	_, err := db.Exec("delete from test")
212	assert.NoError(t, err)
213	// Example structs
214	type bjjStruct struct {
215		I *babyjub.PublicKey `meddler:"i"`
216	}
217	type hezBJJStruct struct {
218		I HezBJJ `meddler:"i"`
219	}
220	type hezBJJStructNil struct {
221		I *HezBJJ `meddler:"i"`
222	}
223
224	// Not nil case
225	// Insert into DB using *babyjub.PublicKey Scan/Value
226	priv := babyjub.NewRandPrivKey()
227	fromBJJ := bjjStruct{
228		I: priv.Public(),
229	}
230	err = meddler.Insert(db, "test", &fromBJJ)
231	assert.NoError(t, err)
232	// Read from DB using HezBJJ Scan/Value
233	toHezBJJ := hezBJJStruct{}
234	err = meddler.QueryRow(db, &toHezBJJ, "select * from test")
235	assert.NoError(t, err)
236	assert.Equal(t, NewHezBJJ(fromBJJ.I), toHezBJJ.I)
237	// Clean DB
238	_, err = db.Exec("delete from test")
239	assert.NoError(t, err)
240	// Insert into DB using HezBJJ Scan/Value
241	fromHezBJJ := hezBJJStruct{
242		I: NewHezBJJ(priv.Public()),
243	}
244	err = meddler.Insert(db, "test", &fromHezBJJ)
245	assert.NoError(t, err)
246	// Read from DB using *babyjub.PublicKey Scan/Value
247	toBJJ := bjjStruct{}
248	err = meddler.QueryRow(db, &toBJJ, "select * from test")
249	assert.NoError(t, err)
250	assert.Equal(t, fromHezBJJ.I, NewHezBJJ(toBJJ.I))
251
252	// Nil case
253	// Clean DB
254	_, err = db.Exec("delete from test")
255	assert.NoError(t, err)
256	// Insert into DB using *babyjub.PublicKey Scan/Value
257	fromBJJNil := bjjStruct{
258		I: nil,
259	}
260	err = meddler.Insert(db, "test", &fromBJJNil)
261	assert.NoError(t, err)
262	// Read from DB using HezBJJ Scan/Value
263	foo := HezBJJ("foo")
264	toHezBJJNil := hezBJJStructNil{
265		I: &foo, // check that this will be set to nil, not because of not being initialized
266	}
267	err = meddler.QueryRow(db, &toHezBJJNil, "select * from test")
268	assert.NoError(t, err)
269	assert.Nil(t, toHezBJJNil.I)
270	// Clean DB
271	_, err = db.Exec("delete from test")
272	assert.NoError(t, err)
273	// Insert into DB using HezBJJ Scan/Value
274	fromHezBJJNil := hezBJJStructNil{
275		I: nil,
276	}
277	err = meddler.Insert(db, "test", &fromHezBJJNil)
278	assert.NoError(t, err)
279	// Read from DB using *babyjub.PublicKey Scan/Value
280	toBJJNil := bjjStruct{
281		I: priv.Public(), // check that this will be set to nil, not because of not being initialized
282	}
283	err = meddler.QueryRow(db, &toBJJNil, "select * from test")
284	assert.NoError(t, err)
285	assert.Nil(t, toBJJNil.I)
286}