OSDN Git Service

7756800a3e97e2c0d660bae7918f1fc60422c983
[bytom/vapor.git] / protocol / validation / vmcontext_test.go
1 package validation
2
3 import (
4         "fmt"
5         "testing"
6
7         "github.com/vapor/errors"
8         "github.com/vapor/protocol/bc"
9         "github.com/vapor/protocol/bc/types"
10         "github.com/vapor/protocol/vm"
11 )
12
13 func TestCheckOutput(t *testing.T) {
14         tx := types.NewTx(types.TxData{
15                 Inputs: []*types.TxInput{
16                         types.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendprog")),
17                         types.NewIssuanceInput(nil, 6, []byte("issueprog"), nil, nil),
18                 },
19                 Outputs: []*types.TxOutput{
20                         types.NewTxOutput(bc.NewAssetID([32]byte{3}), 8, []byte("wrongprog")),
21                         types.NewTxOutput(bc.NewAssetID([32]byte{3}), 8, []byte("controlprog")),
22                         types.NewTxOutput(bc.NewAssetID([32]byte{2}), 8, []byte("controlprog")),
23                         types.NewTxOutput(bc.NewAssetID([32]byte{2}), 7, []byte("controlprog")),
24                         types.NewTxOutput(bc.NewAssetID([32]byte{2}), 7, []byte("controlprog")),
25                 },
26         })
27
28         txCtx := &entryContext{
29                 entry:   tx.Tx.Entries[tx.Tx.InputIDs[0]],
30                 entries: tx.Tx.Entries,
31         }
32
33         cases := []struct {
34                 // args to CheckOutput
35                 index     uint64
36                 amount    uint64
37                 assetID   []byte
38                 vmVersion uint64
39                 code      []byte
40
41                 wantErr error
42                 wantOk  bool
43         }{
44                 {
45                         index:     4,
46                         amount:    7,
47                         assetID:   append([]byte{2}, make([]byte, 31)...),
48                         vmVersion: 1,
49                         code:      []byte("controlprog"),
50                         wantOk:    true,
51                 },
52                 {
53                         index:     3,
54                         amount:    7,
55                         assetID:   append([]byte{2}, make([]byte, 31)...),
56                         vmVersion: 1,
57                         code:      []byte("controlprog"),
58                         wantOk:    true,
59                 },
60                 {
61                         index:     0,
62                         amount:    1,
63                         assetID:   append([]byte{9}, make([]byte, 31)...),
64                         vmVersion: 1,
65                         code:      []byte("missingprog"),
66                         wantOk:    false,
67                 },
68                 {
69                         index:     5,
70                         amount:    7,
71                         assetID:   append([]byte{2}, make([]byte, 31)...),
72                         vmVersion: 1,
73                         code:      []byte("controlprog"),
74                         wantErr:   vm.ErrBadValue,
75                 },
76         }
77
78         for i, test := range cases {
79                 t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) {
80                         gotOk, err := txCtx.checkOutput(test.index, test.amount, test.assetID, test.vmVersion, test.code, false)
81                         if g := errors.Root(err); g != test.wantErr {
82                                 t.Errorf("checkOutput(%v, %v, %x, %v, %x) err = %v, want %v", test.index, test.amount, test.assetID, test.vmVersion, test.code, g, test.wantErr)
83                                 return
84                         }
85                         if gotOk != test.wantOk {
86                                 t.Errorf("checkOutput(%v, %v, %x, %v, %x) ok = %t, want %v", test.index, test.amount, test.assetID, test.vmVersion, test.code, gotOk, test.wantOk)
87                         }
88
89                 })
90         }
91 }