OSDN Git Service

init for remove issue (#63)
[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                 },
18                 Outputs: []*types.TxOutput{
19                         types.NewIntraChainOutput(bc.NewAssetID([32]byte{3}), 8, []byte("wrongprog")),
20                         types.NewIntraChainOutput(bc.NewAssetID([32]byte{3}), 8, []byte("controlprog")),
21                         types.NewIntraChainOutput(bc.NewAssetID([32]byte{2}), 8, []byte("controlprog")),
22                         types.NewIntraChainOutput(bc.NewAssetID([32]byte{2}), 7, []byte("controlprog")),
23                         types.NewIntraChainOutput(bc.NewAssetID([32]byte{2}), 7, []byte("controlprog")),
24                 },
25         })
26
27         txCtx := &entryContext{
28                 entry:   tx.Tx.Entries[tx.Tx.InputIDs[0]],
29                 entries: tx.Tx.Entries,
30         }
31
32         cases := []struct {
33                 // args to CheckOutput
34                 index     uint64
35                 amount    uint64
36                 assetID   []byte
37                 vmVersion uint64
38                 code      []byte
39
40                 wantErr error
41                 wantOk  bool
42         }{
43                 {
44                         index:     4,
45                         amount:    7,
46                         assetID:   append([]byte{2}, make([]byte, 31)...),
47                         vmVersion: 1,
48                         code:      []byte("controlprog"),
49                         wantOk:    true,
50                 },
51                 {
52                         index:     3,
53                         amount:    7,
54                         assetID:   append([]byte{2}, make([]byte, 31)...),
55                         vmVersion: 1,
56                         code:      []byte("controlprog"),
57                         wantOk:    true,
58                 },
59                 {
60                         index:     0,
61                         amount:    1,
62                         assetID:   append([]byte{9}, make([]byte, 31)...),
63                         vmVersion: 1,
64                         code:      []byte("missingprog"),
65                         wantOk:    false,
66                 },
67                 {
68                         index:     5,
69                         amount:    7,
70                         assetID:   append([]byte{2}, make([]byte, 31)...),
71                         vmVersion: 1,
72                         code:      []byte("controlprog"),
73                         wantErr:   vm.ErrBadValue,
74                 },
75         }
76
77         for i, test := range cases {
78                 t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) {
79                         gotOk, err := txCtx.checkOutput(test.index, test.amount, test.assetID, test.vmVersion, test.code, false)
80                         if g := errors.Root(err); g != test.wantErr {
81                                 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)
82                                 return
83                         }
84                         if gotOk != test.wantOk {
85                                 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)
86                         }
87
88                 })
89         }
90 }