OSDN Git Service

writer close
[bytom/vapor.git] / proposal / proposal_test.go
index d8f7abf..e211b14 100644 (file)
@@ -1,13 +1,12 @@
 package proposal
 
 import (
-       "encoding/hex"
        "testing"
 
        "github.com/vapor/consensus"
+       "github.com/vapor/protocol/bc"
        "github.com/vapor/protocol/bc/types"
        "github.com/vapor/protocol/state"
-       "github.com/vapor/protocol/vm/vmutil"
        "github.com/vapor/testutil"
 )
 
@@ -21,10 +20,9 @@ func TestCalCoinbaseTxReward(t *testing.T) {
        reductionInterval := uint64(840000)
 
        cases := []struct {
-               desc            string
-               block           *types.Block
-               consensusResult *state.ConsensusResult
-               wantReward      state.CoinbaseReward
+               desc       string
+               block      *types.Block
+               wantReward state.CoinbaseReward
        }{
                {
                        desc: "the block height is reductionInterval - 1",
@@ -32,10 +30,14 @@ func TestCalCoinbaseTxReward(t *testing.T) {
                                BlockHeader: types.BlockHeader{
                                        Height: reductionInterval - 1,
                                },
-                               Transactions: []*types.Tx{nil},
-                       },
-                       consensusResult: &state.ConsensusResult{
-                               CoinbaseReward: map[string]uint64{},
+                               Transactions: []*types.Tx{
+                                       &types.Tx{
+                                               TxData: types.TxData{
+                                                       Inputs:  []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
+                                                       Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51})},
+                                               },
+                                       },
+                               },
                        },
                        wantReward: state.CoinbaseReward{
                                Amount:         24,
@@ -48,10 +50,14 @@ func TestCalCoinbaseTxReward(t *testing.T) {
                                BlockHeader: types.BlockHeader{
                                        Height: reductionInterval,
                                },
-                               Transactions: []*types.Tx{nil},
-                       },
-                       consensusResult: &state.ConsensusResult{
-                               CoinbaseReward: map[string]uint64{},
+                               Transactions: []*types.Tx{
+                                       &types.Tx{
+                                               TxData: types.TxData{
+                                                       Inputs:  []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
+                                                       Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51})},
+                                               },
+                                       },
+                               },
                        },
                        wantReward: state.CoinbaseReward{
                                Amount:         24,
@@ -64,10 +70,14 @@ func TestCalCoinbaseTxReward(t *testing.T) {
                                BlockHeader: types.BlockHeader{
                                        Height: reductionInterval + 1,
                                },
-                               Transactions: []*types.Tx{nil},
-                       },
-                       consensusResult: &state.ConsensusResult{
-                               CoinbaseReward: map[string]uint64{},
+                               Transactions: []*types.Tx{
+                                       &types.Tx{
+                                               TxData: types.TxData{
+                                                       Inputs:  []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
+                                                       Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51})},
+                                               },
+                                       },
+                               },
                        },
                        wantReward: state.CoinbaseReward{
                                Amount:         12,
@@ -80,10 +90,14 @@ func TestCalCoinbaseTxReward(t *testing.T) {
                                BlockHeader: types.BlockHeader{
                                        Height: reductionInterval * 2,
                                },
-                               Transactions: []*types.Tx{nil},
-                       },
-                       consensusResult: &state.ConsensusResult{
-                               CoinbaseReward: map[string]uint64{},
+                               Transactions: []*types.Tx{
+                                       &types.Tx{
+                                               TxData: types.TxData{
+                                                       Inputs:  []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
+                                                       Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51})},
+                                               },
+                                       },
+                               },
                        },
                        wantReward: state.CoinbaseReward{
                                Amount:         12,
@@ -96,10 +110,14 @@ func TestCalCoinbaseTxReward(t *testing.T) {
                                BlockHeader: types.BlockHeader{
                                        Height: 2*reductionInterval + 1,
                                },
-                               Transactions: []*types.Tx{nil},
-                       },
-                       consensusResult: &state.ConsensusResult{
-                               CoinbaseReward: map[string]uint64{},
+                               Transactions: []*types.Tx{
+                                       &types.Tx{
+                                               TxData: types.TxData{
+                                                       Inputs:  []*types.TxInput{types.NewCoinbaseInput([]byte{0x01})},
+                                                       Outputs: []*types.TxOutput{types.NewIntraChainOutput(bc.AssetID{}, 0, []byte{0x51})},
+                                               },
+                                       },
+                               },
                        },
                        wantReward: state.CoinbaseReward{
                                Amount:         6,
@@ -108,25 +126,14 @@ func TestCalCoinbaseTxReward(t *testing.T) {
                },
        }
 
-       var err error
        for i, c := range cases {
-               c.block.Transactions[0], err = createCoinbaseTx(nil, c.block.Height)
+               gotReward, err := state.CalCoinbaseReward(c.block)
                if err != nil {
                        t.Fatal(err)
                }
 
-               if err := c.consensusResult.AttachCoinbaseReward(c.block); err != nil {
-                       t.Fatal(err)
-               }
-
-               defaultProgram, _ := vmutil.DefaultCoinbaseProgram()
-               gotReward := state.CoinbaseReward{
-                       Amount:         c.consensusResult.CoinbaseReward[hex.EncodeToString(defaultProgram)],
-                       ControlProgram: defaultProgram,
-               }
-
-               if !testutil.DeepEqual(gotReward, c.wantReward) {
-                       t.Fatalf("test case %d: %s, the coinbase reward got: %v, want: %v", i, c.desc, gotReward, c.wantReward)
+               if !testutil.DeepEqual(*gotReward, c.wantReward) {
+                       t.Fatalf("test case %d: %s, the coinbase reward got: %v, want: %v", i, c.desc, *gotReward, c.wantReward)
                }
        }
 }
@@ -140,10 +147,11 @@ func TestCountCoinbaseTxRewards(t *testing.T) {
        }
 
        cases := []struct {
-               desc            string
-               block           *types.Block
-               consensusResult *state.ConsensusResult
-               wantRewards     []state.CoinbaseReward
+               desc                string
+               block               *types.Block
+               consensusResult     *state.ConsensusResult
+               wantRewards         []state.CoinbaseReward
+               wantConsensusResult *state.ConsensusResult
        }{
                {
                        desc: "the block height is RoundVoteBlockNums - 1",
@@ -159,6 +167,11 @@ func TestCountCoinbaseTxRewards(t *testing.T) {
                                },
                        },
                        wantRewards: []state.CoinbaseReward{},
+                       wantConsensusResult: &state.ConsensusResult{
+                               CoinbaseReward: map[string]uint64{
+                                       "51": 34,
+                               },
+                       },
                },
                {
                        desc: "the block height is RoundVoteBlockNums",
@@ -174,14 +187,11 @@ func TestCountCoinbaseTxRewards(t *testing.T) {
                                        "52": 20,
                                },
                        },
-                       wantRewards: []state.CoinbaseReward{
-                               state.CoinbaseReward{
-                                       Amount:         34,
-                                       ControlProgram: []byte{0x51},
-                               },
-                               state.CoinbaseReward{
-                                       Amount:         20,
-                                       ControlProgram: []byte{0x52},
+                       wantRewards: []state.CoinbaseReward{},
+                       wantConsensusResult: &state.ConsensusResult{
+                               CoinbaseReward: map[string]uint64{
+                                       "51": 34,
+                                       "52": 20,
                                },
                        },
                },
@@ -198,7 +208,17 @@ func TestCountCoinbaseTxRewards(t *testing.T) {
                                        "51": 10,
                                },
                        },
-                       wantRewards: []state.CoinbaseReward{},
+                       wantRewards: []state.CoinbaseReward{
+                               state.CoinbaseReward{
+                                       Amount:         10,
+                                       ControlProgram: []byte{0x51},
+                               },
+                       },
+                       wantConsensusResult: &state.ConsensusResult{
+                               CoinbaseReward: map[string]uint64{
+                                       "51": 24,
+                               },
+                       },
                },
                {
                        desc: "the block height is RoundVoteBlockNums * 2",
@@ -210,28 +230,13 @@ func TestCountCoinbaseTxRewards(t *testing.T) {
                        },
                        consensusResult: &state.ConsensusResult{
                                CoinbaseReward: map[string]uint64{
-                                       "50": 20,
                                        "51": 10,
-                                       "52": 20,
-                                       "53": 30,
                                },
                        },
-                       wantRewards: []state.CoinbaseReward{
-                               state.CoinbaseReward{
-                                       Amount:         34,
-                                       ControlProgram: []byte{0x51},
-                               },
-                               state.CoinbaseReward{
-                                       Amount:         30,
-                                       ControlProgram: []byte{0x53},
-                               },
-                               state.CoinbaseReward{
-                                       Amount:         20,
-                                       ControlProgram: []byte{0x52},
-                               },
-                               state.CoinbaseReward{
-                                       Amount:         20,
-                                       ControlProgram: []byte{0x50},
+                       wantRewards: []state.CoinbaseReward{},
+                       wantConsensusResult: &state.ConsensusResult{
+                               CoinbaseReward: map[string]uint64{
+                                       "51": 34,
                                },
                        },
                },
@@ -244,29 +249,51 @@ func TestCountCoinbaseTxRewards(t *testing.T) {
                                Transactions: []*types.Tx{nil},
                        },
                        consensusResult: &state.ConsensusResult{
-                               CoinbaseReward: map[string]uint64{},
+                               CoinbaseReward: map[string]uint64{
+                                       "51": 10,
+                                       "52": 20,
+                               },
+                       },
+                       wantRewards: []state.CoinbaseReward{
+                               state.CoinbaseReward{
+                                       Amount:         20,
+                                       ControlProgram: []byte{0x52},
+                               },
+                               state.CoinbaseReward{
+                                       Amount:         10,
+                                       ControlProgram: []byte{0x51},
+                               },
+                       },
+                       wantConsensusResult: &state.ConsensusResult{
+                               CoinbaseReward: map[string]uint64{
+                                       "51": 24,
+                               },
                        },
-                       wantRewards: []state.CoinbaseReward{},
                },
        }
 
-       var err error
        for i, c := range cases {
-               c.block.Transactions[0], err = createCoinbaseTx(nil, c.block.Height)
+               rewards, err := c.consensusResult.GetCoinbaseRewards(c.block.Height - 1)
                if err != nil {
                        t.Fatal(err)
                }
 
-               if err := c.consensusResult.AttachCoinbaseReward(c.block); err != nil {
-                       t.Fatal(err)
+               if !testutil.DeepEqual(rewards, c.wantRewards) {
+                       t.Fatalf("test case %d: %s, the coinbase reward got: %v, want: %v", i, c.desc, rewards, c.wantRewards)
                }
 
-               rewards, err := c.consensusResult.GetCoinbaseRewards(c.block.Height)
+               // create coinbase transaction
+               c.block.Transactions[0], err = createCoinbaseTx(nil, c.block.Height, rewards)
                if err != nil {
                        t.Fatal(err)
                }
-               if !testutil.DeepEqual(rewards, c.wantRewards) {
-                       t.Fatalf("test case %d: %s, the coinbase reward got: %v, want: %v", i, c.desc, rewards, c.wantRewards)
+
+               if err := c.consensusResult.AttachCoinbaseReward(c.block); err != nil {
+                       t.Fatal(err)
+               }
+
+               if !testutil.DeepEqual(c.consensusResult, c.wantConsensusResult) {
+                       t.Fatalf("test case %d: %s, the consensusResult got: %v, want: %v", i, c.desc, c.consensusResult, c.wantConsensusResult)
                }
        }
 }