mirror of
https://github.com/arnaucube/hermez-node.git
synced 2026-02-07 11:26:44 +01:00
122
db/historydb/historydb_test.go
Normal file
122
db/historydb/historydb_test.go
Normal file
@@ -0,0 +1,122 @@
|
||||
package historydb
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/big"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
eth "github.com/ethereum/go-ethereum/common"
|
||||
"github.com/hermeznetwork/hermez-node/common"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
var historyDB *HistoryDB
|
||||
|
||||
// In order to run the test you need to run a Posgres DB with
|
||||
// a database named "history" that is accessible by
|
||||
// user: "hermez"
|
||||
// pass: set it using the env var POSTGRES_PASS
|
||||
// This can be achieved by running: POSTGRES_PASS=your_strong_pass && sudo docker run --rm --name hermez-db-test -p 5432:5432 -e POSTGRES_DB=history -e POSTGRES_USER=hermez -e POSTGRES_PASSWORD=$POSTGRES_PASS -d postgres && sleep 2s && sudo docker exec -it hermez-db-test psql -a history -U hermez -c "CREATE DATABASE l2;"
|
||||
// After running the test you can stop the container by running: sudo docker kill hermez-db-test
|
||||
// If you already did that for the L2DB you don't have to do it again
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
// init DB
|
||||
var err error
|
||||
pass := os.Getenv("POSTGRES_PASS")
|
||||
historyDB, err = NewHistoryDB(5432, "localhost", "hermez", pass, "history")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
// Run tests
|
||||
result := m.Run()
|
||||
// Close DB
|
||||
if err := historyDB.Close(); err != nil {
|
||||
fmt.Println("Error closing the history DB:", err)
|
||||
}
|
||||
os.Exit(result)
|
||||
}
|
||||
|
||||
func TestAddBlock(t *testing.T) {
|
||||
var fromBlock, toBlock uint64
|
||||
fromBlock = 1
|
||||
toBlock = 5
|
||||
// Delete peviously created rows (clean previous test execs)
|
||||
assert.NoError(t, historyDB.reorg(fromBlock-1))
|
||||
// Generate fake blocks
|
||||
blocks := genBlocks(fromBlock, toBlock)
|
||||
// Insert blocks into DB
|
||||
err := historyDB.addBlocks(blocks)
|
||||
assert.NoError(t, err)
|
||||
// Get blocks from DB
|
||||
fetchedBlocks, err := historyDB.GetBlocks(fromBlock, toBlock)
|
||||
// Compare generated vs getted blocks
|
||||
assert.NoError(t, err)
|
||||
for i, fetchedBlock := range fetchedBlocks {
|
||||
assert.Equal(t, blocks[i].EthBlockNum, fetchedBlock.EthBlockNum)
|
||||
assert.Equal(t, blocks[i].Hash, fetchedBlock.Hash)
|
||||
assert.Equal(t, blocks[i].Timestamp.Unix(), fetchedBlock.Timestamp.Unix())
|
||||
}
|
||||
}
|
||||
|
||||
func TestBids(t *testing.T) {
|
||||
const fromBlock uint64 = 1
|
||||
const toBlock uint64 = 5
|
||||
const bidsPerSlot = 5
|
||||
// Prepare blocks in the DB
|
||||
setTestBlocks(fromBlock, toBlock)
|
||||
// Generate fake bids
|
||||
bids := make([]common.Bid, 0, (toBlock-fromBlock)*bidsPerSlot)
|
||||
for i := fromBlock; i < toBlock; i++ {
|
||||
for j := 0; j < bidsPerSlot; j++ {
|
||||
bids = append(bids, common.Bid{
|
||||
SlotNum: common.SlotNum(i),
|
||||
BidValue: big.NewInt(int64(j)),
|
||||
EthBlockNum: i,
|
||||
ForgerAddr: eth.BigToAddress(big.NewInt(int64(j))),
|
||||
})
|
||||
}
|
||||
}
|
||||
err := historyDB.addBids(bids)
|
||||
assert.NoError(t, err)
|
||||
// Fetch bids
|
||||
fetchedBidsPtr, err := historyDB.GetBidsByBlock(fromBlock, toBlock)
|
||||
assert.NoError(t, err)
|
||||
// Compare fetched bids vs generated bids
|
||||
fetchedBids := make([]common.Bid, 0, (toBlock-fromBlock)*bidsPerSlot)
|
||||
for _, bid := range fetchedBidsPtr {
|
||||
fetchedBids = append(fetchedBids, *bid)
|
||||
}
|
||||
assert.Equal(t, bids, fetchedBids)
|
||||
}
|
||||
|
||||
// setTestBlocks WARNING: this will delete the blocks and recreate them
|
||||
func setTestBlocks(from, to uint64) {
|
||||
if from == 0 {
|
||||
if err := historyDB.reorg(from); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
} else {
|
||||
if err := historyDB.reorg(from - 1); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
blocks := genBlocks(from, to)
|
||||
if err := historyDB.addBlocks(blocks); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func genBlocks(from, to uint64) []common.Block {
|
||||
var blocks []common.Block
|
||||
for i := from; i < to; i++ {
|
||||
blocks = append(blocks, common.Block{
|
||||
EthBlockNum: i,
|
||||
Timestamp: time.Now().Add(time.Second * 13).UTC(),
|
||||
Hash: eth.BigToHash(big.NewInt(int64(i))),
|
||||
})
|
||||
}
|
||||
return blocks
|
||||
}
|
||||
Reference in New Issue
Block a user