8 "github.com/bytom/errors"
9 "github.com/bytom/protocol/bc"
10 "github.com/bytom/protocol/bc/legacy"
11 "github.com/bytom/protocol/vm"
14 func TestCheckOutput(t *testing.T) {
15 tx := legacy.NewTx(legacy.TxData{
16 ReferenceData: []byte("txref"),
17 Inputs: []*legacy.TxInput{
18 legacy.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendprog"), bc.Hash{}, []byte("ref")),
19 legacy.NewIssuanceInput(nil, 6, nil, bc.Hash{}, []byte("issueprog"), nil, nil),
21 Outputs: []*legacy.TxOutput{
22 legacy.NewTxOutput(bc.NewAssetID([32]byte{3}), 8, []byte("wrongprog"), nil),
23 legacy.NewTxOutput(bc.NewAssetID([32]byte{3}), 8, []byte("controlprog"), nil),
24 legacy.NewTxOutput(bc.NewAssetID([32]byte{2}), 8, []byte("controlprog"), nil),
25 legacy.NewTxOutput(bc.NewAssetID([32]byte{2}), 7, []byte("controlprog"), nil),
26 legacy.NewTxOutput(bc.NewAssetID([32]byte{2}), 7, []byte("controlprog"), []byte("outref")),
32 txCtx := &entryContext{
33 entry: tx.Tx.Entries[tx.Tx.InputIDs[0]],
34 entries: tx.Tx.Entries,
38 // args to CheckOutput
51 data: mustDecodeHex("1f2a05f881ed9fa0c9068a84823677409f863891a2196eb55dbfbb677a566374"),
53 assetID: append([]byte{2}, make([]byte, 31)...),
55 code: []byte("controlprog"),
60 data: mustDecodeHex("1f2a05f881ed9fa0c9068a84823677409f863891a2196eb55dbfbb677a566374"),
62 assetID: append([]byte{2}, make([]byte, 31)...),
64 code: []byte("controlprog"),
71 assetID: append([]byte{9}, make([]byte, 31)...),
73 code: []byte("missingprog"),
78 data: mustDecodeHex("1f2a05f881ed9fa0c9068a84823677409f863891a2196eb55dbfbb677a566374"),
80 assetID: append([]byte{2}, make([]byte, 31)...),
82 code: []byte("controlprog"),
83 wantErr: vm.ErrBadValue,
87 for i, test := range cases {
88 t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) {
89 gotOk, err := txCtx.checkOutput(test.index, test.data, test.amount, test.assetID, test.vmVersion, test.code, false)
90 if g := errors.Root(err); g != test.wantErr {
91 t.Errorf("checkOutput(%v, %v, %v, %x, %v, %x) err = %v, want %v",
92 test.index, test.data, test.amount, test.assetID, test.vmVersion, test.code,
96 if gotOk != test.wantOk {
97 t.Errorf("checkOutput(%v, %v, %v, %x, %v, %x) ok = %v, want %v",
98 test.index, test.data, test.amount, test.assetID, test.vmVersion, test.code,
106 func mustDecodeHex(h string) []byte {
107 bits, err := hex.DecodeString(h)