arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/coordinator/coordinator_test.go
coordinator/coordinator_test.goRaw
  1package coordinator
  2
  3import (
  4	"io/ioutil"
  5	"math/big"
  6	"os"
  7	"testing"
  8	"time"
  9
 10	ethCommon "github.com/ethereum/go-ethereum/common"
 11	"github.com/hermeznetwork/hermez-node/batchbuilder"
 12	dbUtils "github.com/hermeznetwork/hermez-node/db"
 13	"github.com/hermeznetwork/hermez-node/db/historydb"
 14	"github.com/hermeznetwork/hermez-node/db/l2db"
 15	"github.com/hermeznetwork/hermez-node/db/statedb"
 16	"github.com/hermeznetwork/hermez-node/log"
 17	"github.com/hermeznetwork/hermez-node/synchronizer"
 18	"github.com/hermeznetwork/hermez-node/test"
 19	"github.com/hermeznetwork/hermez-node/txselector"
 20	"github.com/stretchr/testify/assert"
 21	"github.com/stretchr/testify/require"
 22)
 23
 24func newTestModules(t *testing.T) (*txselector.TxSelector, *batchbuilder.BatchBuilder) { // FUTURE once Synchronizer is ready, should return it also
 25	nLevels := 32
 26
 27	synchDBPath, err := ioutil.TempDir("", "tmpSynchDB")
 28	require.Nil(t, err)
 29	defer assert.Nil(t, os.RemoveAll(synchDBPath))
 30	synchSdb, err := statedb.NewStateDB(synchDBPath, statedb.TypeSynchronizer, nLevels)
 31	assert.Nil(t, err)
 32
 33	pass := os.Getenv("POSTGRES_PASS")
 34	db, err := dbUtils.InitSQLDB(5432, "localhost", "hermez", pass, "hermez")
 35	require.Nil(t, err)
 36	l2DB := l2db.NewL2DB(db, 10, 100, 24*time.Hour)
 37
 38	txselDir, err := ioutil.TempDir("", "tmpTxSelDB")
 39	require.Nil(t, err)
 40	defer assert.Nil(t, os.RemoveAll(txselDir))
 41	txsel, err := txselector.NewTxSelector(txselDir, synchSdb, l2DB, 10, 10, 10)
 42	assert.Nil(t, err)
 43
 44	bbDir, err := ioutil.TempDir("", "tmpBatchBuilderDB")
 45	require.Nil(t, err)
 46	defer assert.Nil(t, os.RemoveAll(bbDir))
 47	bb, err := batchbuilder.NewBatchBuilder(bbDir, synchSdb, nil, 0, uint64(nLevels))
 48	assert.Nil(t, err)
 49
 50	// l1Txs, coordinatorL1Txs, poolL2Txs := test.GenerateTestTxsFromSet(t, test.SetTest0)
 51
 52	return txsel, bb
 53}
 54
 55type timer struct {
 56	time int64
 57}
 58
 59func (t *timer) Time() int64 {
 60	currentTime := t.time
 61	t.time++
 62	return currentTime
 63}
 64
 65var forger ethCommon.Address
 66var bidder ethCommon.Address
 67
 68func waitForSlot(t *testing.T, coord *Coordinator, c *test.Client, slot int64) {
 69	for {
 70		blockNum, err := c.EthLastBlock()
 71		require.Nil(t, err)
 72		nextBlockSlot, err := c.AuctionGetSlotNumber(blockNum + 1)
 73		require.Nil(t, err)
 74		if nextBlockSlot == slot {
 75			break
 76		}
 77		c.CtlMineBlock()
 78		time.Sleep(100 * time.Millisecond)
 79		var stats synchronizer.Stats
 80		stats.Eth.LastBlock = c.CtlLastBlock()
 81		stats.Sync.LastBlock = c.CtlLastBlock()
 82		canForge, err := c.AuctionCanForge(forger, blockNum+1)
 83		require.Nil(t, err)
 84		if canForge {
 85			// fmt.Println("DBG canForge")
 86			stats.Sync.Auction.CurrentSlot.Forger = forger
 87		}
 88		coord.SendMsg(MsgSyncStats{
 89			Stats: stats,
 90		})
 91	}
 92}
 93
 94func TestCoordinator(t *testing.T) {
 95	txsel, bb := newTestModules(t)
 96	bidder = ethCommon.HexToAddress("0x6b175474e89094c44da98b954eedeac495271d0f")
 97	forger = ethCommon.HexToAddress("0xc344E203a046Da13b0B4467EB7B3629D0C99F6E6")
 98
 99	conf := Config{
100		ForgerAddress: forger,
101	}
102	hdb := &historydb.HistoryDB{}
103	serverProofs := []ServerProofInterface{&ServerProofMock{}, &ServerProofMock{}}
104
105	var timer timer
106	ethClientSetup := test.NewClientSetupExample()
107	ethClient := test.NewClient(true, &timer, &bidder, ethClientSetup)
108
109	// Bid for slot 2 and 4
110	_, err := ethClient.AuctionSetCoordinator(forger, "https://foo.bar")
111	require.Nil(t, err)
112	_, err = ethClient.AuctionBidSimple(2, big.NewInt(9999))
113	require.Nil(t, err)
114	_, err = ethClient.AuctionBidSimple(4, big.NewInt(9999))
115	require.Nil(t, err)
116
117	scConsts := &synchronizer.SCConsts{
118		Rollup:   *ethClientSetup.RollupConstants,
119		Auction:  *ethClientSetup.AuctionConstants,
120		WDelayer: *ethClientSetup.WDelayerConstants,
121	}
122	initSCVars := &synchronizer.SCVariables{
123		Rollup:   *ethClientSetup.RollupVariables,
124		Auction:  *ethClientSetup.AuctionVariables,
125		WDelayer: *ethClientSetup.WDelayerVariables,
126	}
127	c := NewCoordinator(conf, hdb, txsel, bb, serverProofs, ethClient, scConsts, initSCVars)
128	c.Start()
129	time.Sleep(1 * time.Second)
130
131	// NOTE: With the current test, the coordinator will enter in forge
132	// time before the bidded slot because no one else is forging in the
133	// other slots before the slot deadline.
134	// simulate forgeSequence time
135	waitForSlot(t, c, ethClient, 2)
136	log.Info("~~~ simulate entering in forge time")
137	time.Sleep(1 * time.Second)
138
139	// simulate going out from forgeSequence
140	waitForSlot(t, c, ethClient, 3)
141	log.Info("~~~ simulate going out from forge time")
142	time.Sleep(1 * time.Second)
143
144	// simulate entering forgeSequence time again
145	waitForSlot(t, c, ethClient, 4)
146	log.Info("~~~ simulate entering in forge time again")
147	time.Sleep(2 * time.Second)
148
149	// simulate stopping forgerLoop by channel
150	log.Info("~~~ simulate stopping forgerLoop by closing coordinator stopch")
151	c.Stop()
152	time.Sleep(1 * time.Second)
153}