1
1
package blockchainstate
2
2
3
3
import (
4
+ "context"
5
+ "errors"
4
6
"testing"
5
7
"time"
6
8
9
+ mock_blockchainstate "github.com/status-im/status-go/services/wallet/blockchainstate/mock"
7
10
"github.com/stretchr/testify/require"
11
+
12
+ "go.uber.org/mock/gomock"
8
13
)
9
14
10
15
var mockupTime = time .Unix (946724400 , 0 ) // 2000-01-01 12:00:00
@@ -13,34 +18,95 @@ func mockupSince(t time.Time) time.Duration {
13
18
return mockupTime .Sub (t )
14
19
}
15
20
16
- func setupTestState (t * testing.T ) (s * BlockChainState ) {
17
- state := NewBlockChainState ()
21
+ func setupTestState (t * testing.T ) (* BlockChainState , * mock_blockchainstate.MockEthClientGetter ) {
22
+ ctrl := gomock .NewController (t )
23
+ ethClientGetter := mock_blockchainstate .NewMockEthClientGetter (ctrl )
24
+
25
+ state := NewBlockChainState (ethClientGetter )
18
26
state .sinceFn = mockupSince
19
- return state
27
+ return state , ethClientGetter
20
28
}
21
29
22
- func TestEstimateLatestBlockNumber (t * testing.T ) {
23
- state := setupTestState (t )
30
+ func TestGetEstimatedLatestBlockNumber_WithExistingData (t * testing.T ) {
31
+ state , _ := setupTestState (t )
24
32
25
- state .setLatestBlockDataForChain (1 , LatestBlockData {
26
- blockNumber : uint64 (100 ),
33
+ // Manually set block data (simulating what would happen after initialization)
34
+ state .latestBlockNumbers [1 ] = LatestBlockData {
35
+ blockNumber : 100 ,
27
36
timestamp : mockupTime .Add (- 31 * time .Second ),
28
37
blockDuration : 10 * time .Second ,
29
- })
38
+ }
30
39
31
- state .setLatestBlockDataForChain ( 2 , LatestBlockData {
32
- blockNumber : uint64 ( 200 ) ,
40
+ state .latestBlockNumbers [ 2 ] = LatestBlockData {
41
+ blockNumber : 200 ,
33
42
timestamp : mockupTime .Add (- 5 * time .Second ),
34
43
blockDuration : 12 * time .Second ,
35
- })
36
-
37
- val , ok := state .estimateLatestBlockNumber (1 )
38
- require .True (t , ok )
39
- require .Equal (t , uint64 (103 ), val )
40
- val , ok = state .estimateLatestBlockNumber (2 )
41
- require .True (t , ok )
42
- require .Equal (t , uint64 (200 ), val )
43
- val , ok = state .estimateLatestBlockNumber (3 )
44
- require .False (t , ok )
45
- require .Equal (t , uint64 (0 ), val )
44
+ }
45
+
46
+ // Test chain 1: should estimate 3 blocks ahead (31 seconds / 10 seconds per block)
47
+ blockNumber , err := state .GetEstimatedLatestBlockNumber (context .Background (), 1 )
48
+ require .NoError (t , err )
49
+ require .Equal (t , uint64 (103 ), blockNumber )
50
+
51
+ // Test chain 2: should not estimate ahead (5 seconds < 12 seconds per block)
52
+ blockNumber , err = state .GetEstimatedLatestBlockNumber (context .Background (), 2 )
53
+ require .NoError (t , err )
54
+ require .Equal (t , uint64 (200 ), blockNumber )
55
+ }
56
+
57
+ func TestGetEstimatedLatestBlockNumber_WithInitialization (t * testing.T ) {
58
+ state , ethClientGetter := setupTestState (t )
59
+
60
+ // Mock eth client to return an error (simulating network failure)
61
+ ethClientGetter .EXPECT ().EthClient (uint64 (1 )).Return (nil , errors .New ("network error" )).AnyTimes ()
62
+
63
+ // This should trigger initialization but fail
64
+ blockNumber , err := state .GetEstimatedLatestBlockNumber (context .Background (), 1 )
65
+ require .Error (t , err )
66
+ require .Equal (t , uint64 (0 ), blockNumber )
67
+ require .Contains (t , err .Error (), "network error" )
68
+ }
69
+
70
+ func TestGetEstimatedBlockTime (t * testing.T ) {
71
+ state , _ := setupTestState (t )
72
+
73
+ // Set up test data
74
+ state .latestBlockNumbers [1 ] = LatestBlockData {
75
+ blockNumber : 100 ,
76
+ timestamp : mockupTime .Add (- 10 * time .Second ),
77
+ blockDuration : 2 * time .Second ,
78
+ }
79
+
80
+ // Test block time estimation
81
+ blockTime , err := state .GetEstimatedBlockTime (context .Background (), 1 , 105 )
82
+ require .NoError (t , err )
83
+
84
+ // Block 105 is 5 blocks ahead of 100, so 5 * 2 seconds = 10 seconds ahead
85
+ expectedTime := mockupTime
86
+ require .Equal (t , expectedTime , blockTime )
87
+ }
88
+
89
+ func TestSetLatestBlockNumber (t * testing.T ) {
90
+ state , _ := setupTestState (t )
91
+
92
+ // Test setting block number
93
+ state .SetLatestBlockNumber (1 , 100 )
94
+
95
+ // Verify it was set
96
+ blockData , exists := state .latestBlockNumbers [1 ]
97
+ require .True (t , exists )
98
+ require .Equal (t , uint64 (100 ), blockData .blockNumber )
99
+ require .True (t , blockData .timestamp .After (mockupTime .Add (- time .Minute ))) // Should be recent
100
+
101
+ // Test setting a smaller block number (should not update)
102
+ state .SetLatestBlockNumber (1 , 50 )
103
+ blockData , exists = state .latestBlockNumbers [1 ]
104
+ require .True (t , exists )
105
+ require .Equal (t , uint64 (100 ), blockData .blockNumber ) // Should still be 100
106
+
107
+ // Test setting a larger block number (should update)
108
+ state .SetLatestBlockNumber (1 , 150 )
109
+ blockData , exists = state .latestBlockNumbers [1 ]
110
+ require .True (t , exists )
111
+ require .Equal (t , uint64 (150 ), blockData .blockNumber ) // Should be updated to 150
46
112
}
0 commit comments