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