7 "github.com/vapor/protocol/bc"
8 "github.com/vapor/protocol/bc/types"
9 "github.com/vapor/testutil"
12 var testBlocks = []*types.Block{
13 &types.Block{BlockHeader: types.BlockHeader{
14 PreviousBlockHash: bc.Hash{V0: 1},
17 &types.Block{BlockHeader: types.BlockHeader{
18 PreviousBlockHash: bc.Hash{V0: 1},
21 &types.Block{BlockHeader: types.BlockHeader{
22 PreviousBlockHash: bc.Hash{V0: 2},
27 var blockHashes = []bc.Hash{}
30 for _, block := range testBlocks {
31 blockHashes = append(blockHashes, block.Hash())
35 func TestOrphanManageAdd(t *testing.T) {
39 addOrphan *types.Block
42 before: &OrphanManage{
43 orphan: map[bc.Hash]*orphanBlock{},
44 prevOrphans: map[bc.Hash][]*bc.Hash{},
47 orphan: map[bc.Hash]*orphanBlock{
48 blockHashes[0]: &orphanBlock{testBlocks[0], time.Time{}},
50 prevOrphans: map[bc.Hash][]*bc.Hash{
51 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
54 addOrphan: testBlocks[0],
57 before: &OrphanManage{
58 orphan: map[bc.Hash]*orphanBlock{
59 blockHashes[0]: &orphanBlock{testBlocks[0], time.Time{}},
61 prevOrphans: map[bc.Hash][]*bc.Hash{
62 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
66 orphan: map[bc.Hash]*orphanBlock{
67 blockHashes[0]: &orphanBlock{testBlocks[0], time.Time{}},
69 prevOrphans: map[bc.Hash][]*bc.Hash{
70 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
73 addOrphan: testBlocks[0],
76 before: &OrphanManage{
77 orphan: map[bc.Hash]*orphanBlock{
78 blockHashes[0]: &orphanBlock{testBlocks[0], time.Time{}},
80 prevOrphans: map[bc.Hash][]*bc.Hash{
81 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
85 orphan: map[bc.Hash]*orphanBlock{
86 blockHashes[0]: &orphanBlock{testBlocks[0], time.Time{}},
87 blockHashes[1]: &orphanBlock{testBlocks[1], time.Time{}},
89 prevOrphans: map[bc.Hash][]*bc.Hash{
90 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0], &blockHashes[1]},
93 addOrphan: testBlocks[1],
96 before: &OrphanManage{
97 orphan: map[bc.Hash]*orphanBlock{
98 blockHashes[0]: &orphanBlock{testBlocks[0], time.Time{}},
100 prevOrphans: map[bc.Hash][]*bc.Hash{
101 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
104 after: &OrphanManage{
105 orphan: map[bc.Hash]*orphanBlock{
106 blockHashes[0]: &orphanBlock{testBlocks[0], time.Time{}},
107 blockHashes[2]: &orphanBlock{testBlocks[2], time.Time{}},
109 prevOrphans: map[bc.Hash][]*bc.Hash{
110 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
111 bc.Hash{V0: 2}: []*bc.Hash{&blockHashes[2]},
114 addOrphan: testBlocks[2],
118 for i, c := range cases {
119 c.before.Add(c.addOrphan)
120 for _, orphan := range c.before.orphan {
121 orphan.expiration = time.Time{}
123 if !testutil.DeepEqual(c.before, c.after) {
124 t.Errorf("case %d: got %v want %v", i, c.before, c.after)
129 func TestOrphanManageDelete(t *testing.T) {
136 before: &OrphanManage{
137 orphan: map[bc.Hash]*orphanBlock{
138 blockHashes[0]: &orphanBlock{testBlocks[0], time.Time{}},
140 prevOrphans: map[bc.Hash][]*bc.Hash{
141 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
144 after: &OrphanManage{
145 orphan: map[bc.Hash]*orphanBlock{
146 blockHashes[0]: &orphanBlock{testBlocks[0], time.Time{}},
148 prevOrphans: map[bc.Hash][]*bc.Hash{
149 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
152 remove: &blockHashes[1],
155 before: &OrphanManage{
156 orphan: map[bc.Hash]*orphanBlock{
157 blockHashes[0]: &orphanBlock{testBlocks[0], time.Time{}},
159 prevOrphans: map[bc.Hash][]*bc.Hash{
160 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
163 after: &OrphanManage{
164 orphan: map[bc.Hash]*orphanBlock{},
165 prevOrphans: map[bc.Hash][]*bc.Hash{},
167 remove: &blockHashes[0],
170 before: &OrphanManage{
171 orphan: map[bc.Hash]*orphanBlock{
172 blockHashes[0]: &orphanBlock{testBlocks[0], time.Time{}},
173 blockHashes[1]: &orphanBlock{testBlocks[1], time.Time{}},
175 prevOrphans: map[bc.Hash][]*bc.Hash{
176 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0], &blockHashes[1]},
179 after: &OrphanManage{
180 orphan: map[bc.Hash]*orphanBlock{
181 blockHashes[0]: &orphanBlock{testBlocks[0], time.Time{}},
183 prevOrphans: map[bc.Hash][]*bc.Hash{
184 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
187 remove: &blockHashes[1],
191 for i, c := range cases {
192 c.before.delete(c.remove)
193 if !testutil.DeepEqual(c.before, c.after) {
194 t.Errorf("case %d: got %v want %v", i, c.before, c.after)
199 func TestOrphanManageExpire(t *testing.T) {
205 before: &OrphanManage{
206 orphan: map[bc.Hash]*orphanBlock{
207 blockHashes[0]: &orphanBlock{
209 time.Unix(1633479700, 0),
212 prevOrphans: map[bc.Hash][]*bc.Hash{
213 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
216 after: &OrphanManage{
217 orphan: map[bc.Hash]*orphanBlock{},
218 prevOrphans: map[bc.Hash][]*bc.Hash{},
222 before: &OrphanManage{
223 orphan: map[bc.Hash]*orphanBlock{
224 blockHashes[0]: &orphanBlock{
226 time.Unix(1633479702, 0),
229 prevOrphans: map[bc.Hash][]*bc.Hash{
230 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
233 after: &OrphanManage{
234 orphan: map[bc.Hash]*orphanBlock{
235 blockHashes[0]: &orphanBlock{
237 time.Unix(1633479702, 0),
240 prevOrphans: map[bc.Hash][]*bc.Hash{
241 bc.Hash{V0: 1}: []*bc.Hash{&blockHashes[0]},
247 for i, c := range cases {
248 c.before.orphanExpire(time.Unix(1633479701, 0))
249 if !testutil.DeepEqual(c.before, c.after) {
250 t.Errorf("case %d: got %v want %v", i, c.before, c.after)
255 func TestOrphanManageNumLimit(t *testing.T) {
257 addOrphanBlockNum int
258 expectOrphanBlockNum int
261 addOrphanBlockNum: 10,
262 expectOrphanBlockNum: 10,
265 addOrphanBlockNum: numOrphanBlockLimit,
266 expectOrphanBlockNum: numOrphanBlockLimit,
269 addOrphanBlockNum: numOrphanBlockLimit + 1,
270 expectOrphanBlockNum: numOrphanBlockLimit,
273 addOrphanBlockNum: numOrphanBlockLimit + 10,
274 expectOrphanBlockNum: numOrphanBlockLimit,
278 for i, c := range cases {
279 orphanManage := &OrphanManage{
280 orphan: map[bc.Hash]*orphanBlock{},
281 prevOrphans: map[bc.Hash][]*bc.Hash{},
283 for num := 0; num < c.addOrphanBlockNum; num++ {
284 orphanManage.Add(&types.Block{BlockHeader: types.BlockHeader{Height: uint64(num)}})
286 if len(orphanManage.orphan) != c.expectOrphanBlockNum {
287 t.Errorf("case %d: got %d want %d", i, len(orphanManage.orphan), c.expectOrphanBlockNum)