6 "github.com/vapor/config"
7 "github.com/vapor/protocol/bc"
8 "github.com/vapor/protocol/state"
9 "github.com/vapor/testutil"
12 func TestCalcReorganizeNodes(t *testing.T) {
13 c := &Chain{index: state.NewBlockIndex()}
14 header := config.GenesisBlock().BlockHeader
15 initNode, err := state.NewBlockNode(&header, nil)
20 c.index.AddNode(initNode)
21 var wantAttachNodes []*state.BlockNode
22 var wantDetachNodes []*state.BlockNode
24 mainChainNode := initNode
25 for i := 1; i <= 7; i++ {
26 header.Height = uint64(i)
28 mainChainNode, err = state.NewBlockNode(&header, mainChainNode)
32 wantDetachNodes = append([]*state.BlockNode{mainChainNode}, wantDetachNodes...)
33 c.index.AddNode(mainChainNode)
35 c.bestNode = mainChainNode
36 c.index.SetMainChain(mainChainNode)
38 sideChainNode := initNode
39 for i := 1; i <= 13; i++ {
40 header.Height = uint64(i)
42 sideChainNode, err = state.NewBlockNode(&header, sideChainNode)
46 wantAttachNodes = append(wantAttachNodes, sideChainNode)
47 c.index.AddNode(sideChainNode)
50 getAttachNodes, getDetachNodes := c.calcReorganizeNodes(sideChainNode)
51 if !testutil.DeepEqual(wantAttachNodes, getAttachNodes) {
52 t.Errorf("attach nodes want %v but get %v", wantAttachNodes, getAttachNodes)
54 if !testutil.DeepEqual(wantDetachNodes, getDetachNodes) {
55 t.Errorf("detach nodes want %v but get %v", wantDetachNodes, getDetachNodes)
59 func TestEdgeCalcReorganizeNodes(t *testing.T) {
60 header := config.GenesisBlock().BlockHeader
61 initNode, err := state.NewBlockNode(&header, nil)
66 testNodes := []*state.BlockNode{initNode}
67 testNewNodes := []*state.BlockNode{initNode}
68 for i := uint64(1); i <= 5; i++ {
69 node := &state.BlockNode{
72 Hash: bc.Hash{V0: uint64(i)},
73 Parent: testNodes[i-1],
75 testNodes = append(testNodes, node)
77 newNode := &state.BlockNode{
80 Hash: bc.Hash{V1: uint64(i)},
81 Parent: testNewNodes[i-1],
83 testNewNodes = append(testNewNodes, newNode)
87 mainChainNode *state.BlockNode
88 newNode *state.BlockNode
89 wantAttachNodes []*state.BlockNode
90 wantDetachNodes []*state.BlockNode
93 mainChainNode: testNodes[1],
94 newNode: testNodes[5],
95 wantAttachNodes: testNodes[2:],
96 wantDetachNodes: []*state.BlockNode{},
99 mainChainNode: testNodes[5],
100 newNode: testNodes[2],
101 wantAttachNodes: []*state.BlockNode{},
102 wantDetachNodes: []*state.BlockNode{testNodes[5], testNodes[4], testNodes[3]},
105 mainChainNode: testNodes[2],
106 newNode: testNodes[2],
107 wantAttachNodes: []*state.BlockNode{},
108 wantDetachNodes: []*state.BlockNode{},
111 mainChainNode: testNewNodes[3],
112 newNode: testNodes[2],
113 wantAttachNodes: testNodes[1:3],
114 wantDetachNodes: []*state.BlockNode{testNewNodes[3], testNewNodes[2], testNewNodes[1]},
117 mainChainNode: testNewNodes[2],
118 newNode: testNodes[3],
119 wantAttachNodes: testNodes[1:4],
120 wantDetachNodes: []*state.BlockNode{testNewNodes[2], testNewNodes[1]},
123 mainChainNode: testNodes[5],
124 newNode: testNewNodes[3],
125 wantAttachNodes: testNewNodes[1:4],
126 wantDetachNodes: []*state.BlockNode{testNodes[5], testNodes[4], testNodes[3], testNodes[2], testNodes[1]},
130 for i, c := range cases {
131 chain := &Chain{index: state.NewBlockIndex()}
132 chain.index.AddNode(initNode)
133 for i := uint64(1); i <= c.mainChainNode.Height; i++ {
134 chain.index.AddNode(testNodes[i])
136 chain.bestNode = c.mainChainNode
137 chain.index.SetMainChain(c.mainChainNode)
138 getAttachNodes, getDetachNodes := chain.calcReorganizeNodes(c.newNode)
140 if !testutil.DeepEqual(c.wantAttachNodes, getAttachNodes) {
141 t.Errorf("test case %d, attach nodes want %v but get %v", i, c.wantAttachNodes, getAttachNodes)
144 if !testutil.DeepEqual(c.wantDetachNodes, getDetachNodes) {
145 t.Errorf("test case %d, detach nodes want %v but get %v", i, c.wantDetachNodes, getDetachNodes)