X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=protocol%2Fblock_test.go;h=6fcece86a6c4e38894575175b2018a38dd77047b;hb=c748b385a655fd8b1b1b30fb6bd5dda030649318;hp=eae3d8f1f8bc006d1c2b16064e2a8b3091e70bb7;hpb=cda7a0115c222db259b852fa6999c6396f6028e3;p=bytom%2Fvapor.git diff --git a/protocol/block_test.go b/protocol/block_test.go index eae3d8f1..6fcece86 100644 --- a/protocol/block_test.go +++ b/protocol/block_test.go @@ -4,11 +4,13 @@ import ( "testing" "github.com/vapor/config" + "github.com/vapor/protocol/bc" "github.com/vapor/protocol/state" "github.com/vapor/testutil" ) func TestCalcReorganizeNodes(t *testing.T) { + config.CommonConfig = config.DefaultConfig() c := &Chain{index: state.NewBlockIndex()} header := config.GenesisBlock().BlockHeader initNode, err := state.NewBlockNode(&header, nil) @@ -52,3 +54,93 @@ func TestCalcReorganizeNodes(t *testing.T) { t.Errorf("detach nodes want %v but get %v", wantDetachNodes, getDetachNodes) } } + +func TestEdgeCalcReorganizeNodes(t *testing.T) { + config.CommonConfig = config.DefaultConfig() + header := config.GenesisBlock().BlockHeader + initNode, err := state.NewBlockNode(&header, nil) + if err != nil { + t.Fatal(err) + } + + testNodes := []*state.BlockNode{initNode} + testNewNodes := []*state.BlockNode{initNode} + for i := uint64(1); i <= 5; i++ { + node := &state.BlockNode{ + Height: i, + Hash: bc.Hash{V0: uint64(i)}, + Parent: testNodes[i-1], + } + testNodes = append(testNodes, node) + + newNode := &state.BlockNode{ + Height: i, + Hash: bc.Hash{V1: uint64(i)}, + Parent: testNewNodes[i-1], + } + testNewNodes = append(testNewNodes, newNode) + } + + cases := []struct { + mainChainNode *state.BlockNode + newNode *state.BlockNode + wantAttachNodes []*state.BlockNode + wantDetachNodes []*state.BlockNode + }{ + { + mainChainNode: testNodes[1], + newNode: testNodes[5], + wantAttachNodes: testNodes[2:], + wantDetachNodes: []*state.BlockNode{}, + }, + { + mainChainNode: testNodes[5], + newNode: testNodes[2], + wantAttachNodes: []*state.BlockNode{}, + wantDetachNodes: []*state.BlockNode{testNodes[5], testNodes[4], testNodes[3]}, + }, + { + mainChainNode: testNodes[2], + newNode: testNodes[2], + wantAttachNodes: []*state.BlockNode{}, + wantDetachNodes: []*state.BlockNode{}, + }, + { + mainChainNode: testNewNodes[3], + newNode: testNodes[2], + wantAttachNodes: testNodes[1:3], + wantDetachNodes: []*state.BlockNode{testNewNodes[3], testNewNodes[2], testNewNodes[1]}, + }, + { + mainChainNode: testNewNodes[2], + newNode: testNodes[3], + wantAttachNodes: testNodes[1:4], + wantDetachNodes: []*state.BlockNode{testNewNodes[2], testNewNodes[1]}, + }, + { + mainChainNode: testNodes[5], + newNode: testNewNodes[3], + wantAttachNodes: testNewNodes[1:4], + wantDetachNodes: []*state.BlockNode{testNodes[5], testNodes[4], testNodes[3], testNodes[2], testNodes[1]}, + }, + } + + for i, c := range cases { + chain := &Chain{index: state.NewBlockIndex()} + chain.index.AddNode(initNode) + for i := uint64(1); i <= c.mainChainNode.Height; i++ { + chain.index.AddNode(testNodes[i]) + } + chain.bestNode = c.mainChainNode + chain.index.SetMainChain(c.mainChainNode) + getAttachNodes, getDetachNodes := chain.calcReorganizeNodes(c.newNode) + + if !testutil.DeepEqual(c.wantAttachNodes, getAttachNodes) { + t.Errorf("test case %d, attach nodes want %v but get %v", i, c.wantAttachNodes, getAttachNodes) + } + + if !testutil.DeepEqual(c.wantDetachNodes, getDetachNodes) { + t.Errorf("test case %d, detach nodes want %v but get %v", i, c.wantDetachNodes, getDetachNodes) + } + } +}