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 require.Nil(t, err)
79 }
80
81 for i := range l1UserTxs[0] {
82 client.CtlAddL1TxUser(&l1UserTxs[0][i])
83 }
84 client.CtlMineBlock()
85
86 err = s.Sync(context.Background())
87 require.Nil(t, err)
88
89 getTokens, err := s.historyDB.GetTokens()
90 require.Nil(t, err)
91 assert.Equal(t, 3, len(getTokens))
92
93 // TODO: Reorg will be properly tested once we have the mock ethClient implemented
94 /*
95 // Force a Reorg
96 lastSavedBlock, err := historyDB.GetLastBlock()
97 require.Nil(t, err)
98
99 lastSavedBlock.EthBlockNum++
100 err = historyDB.AddBlock(lastSavedBlock)
101 require.Nil(t, err)
102
103 lastSavedBlock.EthBlockNum++
104 err = historyDB.AddBlock(lastSavedBlock)
105 require.Nil(t, err)
106
107 log.Debugf("Wait for the blockchain to generate some blocks...")
108 time.Sleep(40 * time.Second)
109
110
111 err = s.Sync()
112 require.Nil(t, err)
113 */
114}