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}