hermez-node/synchronizer/synchronizer_test.go
synchronizer/synchronizer_test.goRaw
1package synchronizer
2
3import (
4 "context"
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/hermeznetwork/hermez-node/db/historydb"
13 "github.com/hermeznetwork/hermez-node/db/statedb"
14 "github.com/hermeznetwork/hermez-node/test"
15 "github.com/stretchr/testify/assert"
16 "github.com/stretchr/testify/require"
17)
18
19type timer struct {
20 time int64
21}
22
23func (t *timer) Time() int64 {
24 currentTime := t.time
25 t.time++
26 return currentTime
27}
28
29func TestSync(t *testing.T) {
30 // Int State DB
31 dir, err := ioutil.TempDir("", "tmpdb")
32 require.Nil(t, err)
33
34 stateDB, err := statedb.NewStateDB(dir, statedb.TypeSynchronizer, 32)
35 assert.Nil(t, err)
36
37 // Init History DB
38 pass := os.Getenv("POSTGRES_PASS")
39 db, err := dbUtils.InitSQLDB(5432, "localhost", "hermez", pass, "hermez")
40 require.Nil(t, err)
41 historyDB := historydb.NewHistoryDB(db)
42 // Clear DB
43 err = historyDB.Reorg(-1)
44 assert.Nil(t, err)
45
46 // Init eth client
47 var timer timer
48 clientSetup := test.NewClientSetupExample()
49 client := test.NewClient(true, &timer, ðCommon.Address{}, clientSetup)
50
51 // Create Synchronizer
52 s, err := NewSynchronizer(client, historyDB, stateDB)
53 require.Nil(t, err)
54
55 // Test Sync for ethereum genesis block
56 err = s.Sync(context.Background())
57 require.Nil(t, err)
58
59 blocks, err := s.historyDB.GetBlocks(0, 9999)
60 require.Nil(t, err)
61 assert.Equal(t, int64(0), blocks[0].EthBlockNum)
62
63 // Test Sync for a block with new Tokens and L1UserTxs
64 // accounts := test.GenerateKeys(t, []string{"A", "B", "C", "D"})
65 l1UserTxs, _, _, _ := test.GenerateTestTxsFromSet(t, `
66A (1): 10
67A (2): 20
68B (1): 5
69C (1): 8
70D (3): 15
71> advance batch
72 `)
73 require.Greater(t, len(l1UserTxs[0]), 0)
74 // require.Greater(t, len(tokens), 0)
75
76 for i := 1; i <= 3; i++ {
77 _, err := client.RollupAddToken(ethCommon.BigToAddress(big.NewInt(int64(i*10000))),
78 clientSetup.RollupVariables.FeeAddToken)
79 require.Nil(t, err)
80 }
81
82 for i := range l1UserTxs[0] {
83 client.CtlAddL1TxUser(&l1UserTxs[0][i])
84 }
85 client.CtlMineBlock()
86
87 err = s.Sync(context.Background())
88 require.Nil(t, err)
89
90 getTokens, err := s.historyDB.GetTokens()
91 require.Nil(t, err)
92 assert.Equal(t, 3, len(getTokens))
93
94 // TODO: Reorg will be properly tested once we have the mock ethClient implemented
95 /*
96 // Force a Reorg
97 lastSavedBlock, err := historyDB.GetLastBlock()
98 require.Nil(t, err)
99
100 lastSavedBlock.EthBlockNum++
101 err = historyDB.AddBlock(lastSavedBlock)
102 require.Nil(t, err)
103
104 lastSavedBlock.EthBlockNum++
105 err = historyDB.AddBlock(lastSavedBlock)
106 require.Nil(t, err)
107
108 log.Debugf("Wait for the blockchain to generate some blocks...")
109 time.Sleep(40 * time.Second)
110
111
112 err = s.Sync()
113 require.Nil(t, err)
114 */
115}