github.com/Bytom/bytom@v1.1.2-0.20210127130405-ae40204c0b09/protocol/bc/types/map_test.go (about)

     1  package types
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  
     7  	"github.com/davecgh/go-spew/spew"
     8  
     9  	"github.com/bytom/bytom/consensus"
    10  	"github.com/bytom/bytom/protocol/bc"
    11  	"github.com/bytom/bytom/testutil"
    12  )
    13  
    14  func TestMapSpendTx(t *testing.T) {
    15  	cases := []*TxData{
    16  		&TxData{
    17  			Inputs: []*TxInput{
    18  				NewSpendInput(nil, testutil.MustDecodeHash("fad5195a0c8e3b590b86a3c0a95e7529565888508aecca96e9aeda633002f409"), *consensus.BTMAssetID, 88, 3, []byte{1}),
    19  			},
    20  			Outputs: []*TxOutput{
    21  				NewTxOutput(*consensus.BTMAssetID, 80, []byte{1}),
    22  			},
    23  		},
    24  		&TxData{
    25  			Inputs: []*TxInput{
    26  				NewIssuanceInput([]byte("nonce"), 254354, []byte("issuanceProgram"), [][]byte{[]byte("arguments1"), []byte("arguments2")}, []byte("assetDefinition")),
    27  			},
    28  			Outputs: []*TxOutput{
    29  				NewTxOutput(*consensus.BTMAssetID, 80, []byte{1}),
    30  			},
    31  		},
    32  		&TxData{
    33  			Inputs: []*TxInput{
    34  				NewIssuanceInput([]byte("nonce"), 254354, []byte("issuanceProgram"), [][]byte{[]byte("arguments1"), []byte("arguments2")}, []byte("assetDefinition")),
    35  				NewSpendInput(nil, testutil.MustDecodeHash("db7b16ac737440d6e38559996ddabb207d7ce84fbd6f3bfd2525d234761dc863"), *consensus.BTMAssetID, 88, 3, []byte{1}),
    36  			},
    37  			Outputs: []*TxOutput{
    38  				NewTxOutput(*consensus.BTMAssetID, 80, []byte{1}),
    39  				NewTxOutput(*consensus.BTMAssetID, 80, []byte{1}),
    40  			},
    41  		},
    42  	}
    43  
    44  	for _, txData := range cases {
    45  		tx := MapTx(txData)
    46  		if len(tx.ResultIds) != len(txData.Outputs) {
    47  			t.Errorf("ResultIds contains %d item(s), expected %d", len(tx.ResultIds), len(txData.Outputs))
    48  		}
    49  
    50  		for i, oldIn := range txData.Inputs {
    51  			resultEntry, ok := tx.Entries[tx.InputIDs[i]]
    52  			if !ok {
    53  				t.Errorf("entryMap contains nothing for tx.InputIDs[%d] (%x)", i, tx.InputIDs[i].Bytes())
    54  			}
    55  			switch newInput := resultEntry.(type) {
    56  			case *bc.Issuance:
    57  				if *newInput.Value.AssetId != oldIn.AssetID() || newInput.Value.Amount != oldIn.Amount() {
    58  					t.Errorf("tx.InputIDs[%d]'s asset amount is not equal after map'", i)
    59  				}
    60  			case *bc.Spend:
    61  				spendOut, err := tx.Output(*newInput.SpentOutputId)
    62  				if err != nil {
    63  					t.Fatal(err)
    64  				}
    65  				if *spendOut.Source.Value != oldIn.AssetAmount() {
    66  					t.Errorf("tx.InputIDs[%d]'s asset amount is not equal after map'", i)
    67  				}
    68  			default:
    69  				t.Errorf("unexpect input type")
    70  			}
    71  		}
    72  
    73  		for i, oldOut := range txData.Outputs {
    74  			resultEntry, ok := tx.Entries[*tx.ResultIds[i]]
    75  			if !ok {
    76  				t.Errorf("entryMap contains nothing for header.ResultIds[%d] (%x)", i, tx.ResultIds[i].Bytes())
    77  			}
    78  			newOut, ok := resultEntry.(*bc.Output)
    79  			if !ok {
    80  				t.Errorf("header.ResultIds[%d] has type %T, expected *Output", i, resultEntry)
    81  			}
    82  
    83  			if *newOut.Source.Value != oldOut.AssetAmount {
    84  				t.Errorf("header.ResultIds[%d].(*output).Source is %v, expected %v", i, newOut.Source.Value, oldOut.AssetAmount)
    85  			}
    86  			if newOut.ControlProgram.VmVersion != 1 {
    87  				t.Errorf("header.ResultIds[%d].(*output).ControlProgram.VMVersion is %d, expected 1", i, newOut.ControlProgram.VmVersion)
    88  			}
    89  			if !bytes.Equal(newOut.ControlProgram.Code, oldOut.ControlProgram) {
    90  				t.Errorf("header.ResultIds[%d].(*output).ControlProgram.Code is %x, expected %x", i, newOut.ControlProgram.Code, oldOut.ControlProgram)
    91  			}
    92  
    93  		}
    94  	}
    95  }
    96  
    97  func TestMapCoinbaseTx(t *testing.T) {
    98  	txData := &TxData{
    99  		Inputs: []*TxInput{
   100  			NewCoinbaseInput([]byte("TestMapCoinbaseTx")),
   101  		},
   102  		Outputs: []*TxOutput{
   103  			NewTxOutput(*consensus.BTMAssetID, 800000000000, []byte{1}),
   104  		},
   105  	}
   106  	oldOut := txData.Outputs[0]
   107  
   108  	tx := MapTx(txData)
   109  	t.Log(spew.Sdump(tx.Entries))
   110  
   111  	if len(tx.InputIDs) != 1 {
   112  		t.Errorf("expect to  only have coinbase input id")
   113  	}
   114  	if len(tx.SpentOutputIDs) != 0 {
   115  		t.Errorf("coinbase tx doesn't spend any utxo")
   116  	}
   117  	if len(tx.GasInputIDs) != 1 {
   118  		t.Errorf("coinbase tx should have 1 gas input")
   119  	}
   120  	if len(tx.ResultIds) != 1 {
   121  		t.Errorf("expect to  only have one output")
   122  	}
   123  
   124  	outEntry, ok := tx.Entries[*tx.ResultIds[0]]
   125  	if !ok {
   126  		t.Errorf("entryMap contains nothing for output")
   127  	}
   128  	newOut, ok := outEntry.(*bc.Output)
   129  	if !ok {
   130  		t.Errorf("header.ResultIds[0] has type %T, expected *Output", outEntry)
   131  	}
   132  	if *newOut.Source.Value != oldOut.AssetAmount {
   133  		t.Errorf("(*output).Source is %v, expected %v", newOut.Source.Value, oldOut.AssetAmount)
   134  	}
   135  
   136  	muxEntry, ok := tx.Entries[*newOut.Source.Ref]
   137  	if !ok {
   138  		t.Errorf("entryMap contains nothing for mux")
   139  	}
   140  	mux, ok := muxEntry.(*bc.Mux)
   141  	if !ok {
   142  		t.Errorf("muxEntry has type %T, expected *Mux", muxEntry)
   143  	}
   144  	if *mux.WitnessDestinations[0].Value != *newOut.Source.Value {
   145  		t.Errorf("(*Mux).Destinations is %v, expected %v", *mux.WitnessDestinations[0].Value, *newOut.Source.Value)
   146  	}
   147  
   148  	coinbaseEntry, ok := tx.Entries[tx.InputIDs[0]]
   149  	if !ok {
   150  		t.Errorf("entryMap contains nothing for coinbase input")
   151  	}
   152  	coinbase, ok := coinbaseEntry.(*bc.Coinbase)
   153  	if !ok {
   154  		t.Errorf("inputEntry has type %T, expected *Coinbase", coinbaseEntry)
   155  	}
   156  	if coinbase.WitnessDestination.Value != mux.Sources[0].Value {
   157  		t.Errorf("(*Coinbase).Destination is %v, expected %v", coinbase.WitnessDestination.Value, *mux.Sources[0].Value)
   158  	}
   159  }