OSDN Git Service

Dpos process block (#69)
[bytom/vapor.git] / protocol / bbft_test.go
1 package protocol
2
3 import (
4         "testing"
5 )
6
7 func TestNextLeaderTime(t *testing.T) {
8         cases := []struct {
9                 desc               string
10                 startTime          uint64
11                 endTime            uint64
12                 now                uint64
13                 nodeOrder          uint64
14                 wantError          error
15                 wantNextLeaderTime int64
16         }{
17                 {
18                         desc:               "normal case",
19                         startTime:          1557906284061,
20                         endTime:            1557906784061,
21                         now:                1557906534061,
22                         nodeOrder:          1,
23                         wantError:          nil,
24                         wantNextLeaderTime: 1557906537561,
25                 },
26                 {
27                         desc:               "best block height equals to start block height",
28                         startTime:          1557906284061,
29                         endTime:            1557906784061,
30                         now:                1557906284061,
31                         nodeOrder:          0,
32                         wantError:          nil,
33                         wantNextLeaderTime: 1557906284061,
34                 },
35                 {
36                         desc:               "best block height equals to start block height",
37                         startTime:          1557906284061,
38                         endTime:            1557906784061,
39                         now:                1557906284061,
40                         nodeOrder:          1,
41                         wantError:          nil,
42                         wantNextLeaderTime: 1557906284061 + blockNumEachNode*blockTimeInterval,
43                 },
44                 {
45                         desc:               "has no chance product block in this round of voting",
46                         startTime:          1557906284061,
47                         endTime:            1557906784061,
48                         now:                1557906781561,
49                         nodeOrder:          1,
50                         wantError:          errHasNoChanceProductBlock,
51                         wantNextLeaderTime: 0,
52                 },
53                 {
54                         desc:               "the node is producting block",
55                         startTime:          1557906284061,
56                         endTime:            1557906784061,
57                         now:                1557906284561,
58                         nodeOrder:          0,
59                         wantError:          nil,
60                         wantNextLeaderTime: 1557906284061,
61                 },
62                 {
63                         desc:               "the node is producting block",
64                         startTime:          1557906284061,
65                         endTime:            1557906784061,
66                         now:                1557906317561,
67                         nodeOrder:          1,
68                         wantError:          nil,
69                         wantNextLeaderTime: 1557906284061 + 66*blockTimeInterval,
70                 },
71                 {
72                         desc:               "first round, must exclude genesis block",
73                         startTime:          1557906284061,
74                         endTime:            1557906783561,
75                         now:                1557906286561,
76                         nodeOrder:          3,
77                         wantError:          nil,
78                         wantNextLeaderTime: 1557906284061 + 9*blockTimeInterval,
79                 },
80         }
81
82         for i, c := range cases {
83                 nextLeaderTime, err := nextLeaderTimeHelper(c.startTime, c.endTime, c.now, c.nodeOrder)
84                 if err != c.wantError {
85                         t.Fatalf("case #%d (%s) want error:%v, got error:%v", i, c.desc, c.wantError, err)
86                 }
87
88                 if err != nil {
89                         continue
90                 }
91                 nextLeaderTimestamp := nextLeaderTime.UnixNano() / 1e6
92                 if nextLeaderTimestamp != c.wantNextLeaderTime {
93                         t.Errorf("case #%d (%s) want next leader time:%d, got next leader time:%d", i, c.desc, c.wantNextLeaderTime, nextLeaderTimestamp)
94                 }
95         }
96 }