6 "github.com/vapor/testutil"
9 func TestControlOps(t *testing.T) {
10 type testStruct struct {
12 startVM *virtualMachine
14 wantVM *virtualMachine
16 cases := []testStruct{{
18 startVM: &virtualMachine{
22 data: []byte{0x05, 0x00, 0x00, 0x00},
25 wantVM: &virtualMachine{
29 data: []byte{0x05, 0x00, 0x00, 0x00},
33 startVM: &virtualMachine{
37 data: []byte{0xff, 0xff, 0xff, 0xff},
40 wantVM: &virtualMachine{
44 data: []byte{0xff, 0xff, 0xff, 0xff},
48 startVM: &virtualMachine{
53 dataStack: [][]byte{{1}},
54 data: []byte{0x05, 0x00, 0x00, 0x00},
57 wantVM: &virtualMachine{
62 dataStack: [][]byte{},
63 data: []byte{0x05, 0x00, 0x00, 0x00},
67 startVM: &virtualMachine{
72 dataStack: [][]byte{{}},
73 data: []byte{0x05, 0x00, 0x00, 0x00},
76 wantVM: &virtualMachine{
81 dataStack: [][]byte{},
82 data: []byte{0x05, 0x00, 0x00, 0x00},
86 startVM: &virtualMachine{
90 dataStack: [][]byte{{1}},
93 wantVM: &virtualMachine{
96 dataStack: [][]byte{},
100 startVM: &virtualMachine{
103 dataStack: [][]byte{{1, 1}},
106 wantVM: &virtualMachine{
109 dataStack: [][]byte{},
113 startVM: &virtualMachine{
116 dataStack: [][]byte{{}},
118 wantErr: ErrVerifyFailed,
120 startVM: &virtualMachine{runLimit: 50000},
124 op: OP_CHECKPREDICATE,
125 startVM: &virtualMachine{
127 dataStack: [][]byte{{}, {byte(OP_TRUE)}, {}},
129 wantVM: &virtualMachine{
131 deferredCost: -49951,
132 dataStack: [][]byte{{1}},
135 op: OP_CHECKPREDICATE,
136 startVM: &virtualMachine{
138 dataStack: [][]byte{{}, {}, {}},
140 wantVM: &virtualMachine{
142 deferredCost: -49952,
143 dataStack: [][]byte{{}},
146 op: OP_CHECKPREDICATE,
147 startVM: &virtualMachine{
149 dataStack: [][]byte{{}, {byte(OP_FAIL)}, {}},
151 wantVM: &virtualMachine{
153 deferredCost: -49952,
154 dataStack: [][]byte{{}},
157 op: OP_CHECKPREDICATE,
158 startVM: &virtualMachine{
160 dataStack: [][]byte{{}, {}, Int64Bytes(-1)},
162 wantErr: ErrBadValue,
164 op: OP_CHECKPREDICATE,
165 startVM: &virtualMachine{
167 dataStack: [][]byte{{}, {}, Int64Bytes(50000)},
169 wantErr: ErrRunLimitExceeded,
171 op: OP_CHECKPREDICATE,
172 startVM: &virtualMachine{
174 dataStack: [][]byte{{0x05}, {0x07}, {0x02}, {byte(OP_ADD), byte(OP_12), byte(OP_NUMEQUAL)}, {}},
176 wantVM: &virtualMachine{
177 deferredCost: -49968,
178 dataStack: [][]byte{{0x01}},
181 // stack underflow in child vm should produce false result in parent vm
182 op: OP_CHECKPREDICATE,
183 startVM: &virtualMachine{
185 dataStack: [][]byte{{0x05}, {0x07}, {0x01}, {byte(OP_ADD), byte(OP_DATA_12), byte(OP_NUMEQUAL)}, {}},
187 wantVM: &virtualMachine{
188 deferredCost: -49954,
189 dataStack: [][]byte{{0x05}, {}},
194 OP_CHECKPREDICATE, OP_VERIFY, OP_FAIL,
197 for _, op := range limitChecks {
198 cases = append(cases, testStruct{
200 startVM: &virtualMachine{runLimit: 0},
201 wantErr: ErrRunLimitExceeded,
205 for i, c := range cases {
206 err := ops[c.op].fn(c.startVM)
208 if err != c.wantErr {
209 t.Errorf("case %d, op %s: got err = %v want %v", i, c.op.String(), err, c.wantErr)
212 if c.wantErr != nil {
216 if !testutil.DeepEqual(c.startVM, c.wantVM) {
217 t.Errorf("case %d, op %s: unexpected vm result\n\tgot: %+v\n\twant: %+v\n", i, c.op.String(), c.startVM, c.wantVM)