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	"os"
  6	"testing"
  7	"time"
  8
  9	"github.com/hermeznetwork/hermez-node/batchbuilder"
 10	"github.com/hermeznetwork/hermez-node/db/historydb"
 11	"github.com/hermeznetwork/hermez-node/db/l2db"
 12	"github.com/hermeznetwork/hermez-node/db/statedb"
 13	"github.com/hermeznetwork/hermez-node/eth"
 14	"github.com/hermeznetwork/hermez-node/log"
 15	"github.com/hermeznetwork/hermez-node/txselector"
 16	"github.com/stretchr/testify/assert"
 17	"github.com/stretchr/testify/require"
 18)
 19
 20func newTestModules(t *testing.T) (*txselector.TxSelector, *batchbuilder.BatchBuilder) { // FUTURE once Synchronizer is ready, should return it also
 21	nLevels := 32
 22
 23	synchDB, err := ioutil.TempDir("", "tmpSynchDB")
 24	require.Nil(t, err)
 25	sdb, err := statedb.NewStateDB(synchDB, true, nLevels)
 26	assert.Nil(t, err)
 27
 28	pass := os.Getenv("POSTGRES_PASS")
 29	l2DB, err := l2db.NewL2DB(5432, "localhost", "hermez", pass, "l2", 10, 512, 24*time.Hour)
 30	require.Nil(t, err)
 31
 32	txselDir, err := ioutil.TempDir("", "tmpTxSelDB")
 33	require.Nil(t, err)
 34	txsel, err := txselector.NewTxSelector(txselDir, sdb, l2DB, 10, 10, 10)
 35	assert.Nil(t, err)
 36
 37	bbDir, err := ioutil.TempDir("", "tmpBatchBuilderDB")
 38	require.Nil(t, err)
 39	bb, err := batchbuilder.NewBatchBuilder(bbDir, sdb, nil, 0, uint64(nLevels))
 40	assert.Nil(t, err)
 41
 42	// l1Txs, coordinatorL1Txs, poolL2Txs := test.GenerateTestTxsFromSet(t, test.SetTest0)
 43
 44	return txsel, bb
 45}
 46
 47// CoordNode is an example of a Node that handles the goroutines for the coordinator
 48type CoordNode struct {
 49	c                     *Coordinator
 50	stopForge             chan bool
 51	stopGetProofCallForge chan bool
 52	stopForgeCallConfirm  chan bool
 53}
 54
 55func NewCoordNode(c *Coordinator) *CoordNode {
 56	return &CoordNode{
 57		c: c,
 58	}
 59}
 60
 61func (cn *CoordNode) Start() {
 62	log.Debugw("Starting CoordNode...")
 63	cn.stopForge = make(chan bool)
 64	cn.stopGetProofCallForge = make(chan bool)
 65	cn.stopForgeCallConfirm = make(chan bool)
 66	batchCh0 := make(chan *BatchInfo)
 67	batchCh1 := make(chan *BatchInfo)
 68
 69	go func() {
 70		for {
 71			select {
 72			case <-cn.stopForge:
 73				return
 74			default:
 75				if forge, err := cn.c.ForgeLoopFn(batchCh0, cn.stopForge); err == ErrStop {
 76					return
 77				} else if err != nil {
 78					log.Errorw("CoordNode ForgeLoopFn", "error", err)
 79				} else if !forge {
 80					time.Sleep(500 * time.Millisecond)
 81				}
 82			}
 83		}
 84	}()
 85	go func() {
 86		for {
 87			select {
 88			case <-cn.stopGetProofCallForge:
 89				return
 90			default:
 91				if err := cn.c.GetProofCallForgeLoopFn(
 92					batchCh0, batchCh1, cn.stopGetProofCallForge); err == ErrStop {
 93					return
 94				} else if err != nil {
 95					log.Errorw("CoordNode GetProofCallForgeLoopFn", "error", err)
 96				}
 97			}
 98		}
 99	}()
100	go func() {
101		for {
102			select {
103			case <-cn.stopForgeCallConfirm:
104				return
105			default:
106				if err := cn.c.ForgeCallConfirmLoopFn(
107					batchCh1, cn.stopForgeCallConfirm); err == ErrStop {
108					return
109				} else if err != nil {
110					log.Errorw("CoordNode ForgeCallConfirmLoopFn", "error", err)
111				}
112			}
113		}
114	}()
115}
116
117func (cn *CoordNode) Stop() {
118	log.Debugw("Stopping CoordNode...")
119	cn.stopForge <- true
120	cn.stopGetProofCallForge <- true
121	cn.stopForgeCallConfirm <- true
122}
123
124func TestCoordinator(t *testing.T) {
125	txsel, bb := newTestModules(t)
126
127	conf := Config{}
128	hdb := &historydb.HistoryDB{}
129	c := NewCoordinator(conf, hdb, txsel, bb, &eth.Client{})
130	cn := NewCoordNode(c)
131	cn.Start()
132	time.Sleep(1 * time.Second)
133
134	// simulate forgeSequence time
135	log.Info("simulate entering in forge time")
136	c.isForgeSeq = true
137	time.Sleep(1 * time.Second)
138
139	// simulate going out from forgeSequence
140	log.Info("simulate going out from forge time")
141	c.isForgeSeq = false
142	time.Sleep(1 * time.Second)
143
144	// simulate entering forgeSequence time again
145	log.Info("simulate entering in forge time again")
146	c.isForgeSeq = true
147	time.Sleep(1 * time.Second)
148
149	// simulate stopping forgerLoop by channel
150	log.Info("simulate stopping forgerLoop by closing coordinator stopch")
151	cn.Stop()
152	time.Sleep(1 * time.Second)
153}