1 // Copyright 2016 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
10 "golang.org/x/net/bpf"
13 func TestVMALUOpAdd(t *testing.T) {
14 vm, done, err := testVM(t, []bpf.Instruction{
26 t.Fatalf("failed to load BPF program: %v", err)
30 out, err := vm.Run([]byte{
31 0xff, 0xff, 0xff, 0xff,
32 0xff, 0xff, 0xff, 0xff,
36 t.Fatalf("unexpected error while running program: %v", err)
38 if want, got := 3, out; want != got {
39 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",
44 func TestVMALUOpSub(t *testing.T) {
45 vm, done, err := testVM(t, []bpf.Instruction{
57 t.Fatalf("failed to load BPF program: %v", err)
61 out, err := vm.Run([]byte{
62 0xff, 0xff, 0xff, 0xff,
63 0xff, 0xff, 0xff, 0xff,
67 t.Fatalf("unexpected error while running program: %v", err)
69 if want, got := 0, out; want != got {
70 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",
75 func TestVMALUOpMul(t *testing.T) {
76 vm, done, err := testVM(t, []bpf.Instruction{
88 t.Fatalf("failed to load BPF program: %v", err)
92 out, err := vm.Run([]byte{
93 0xff, 0xff, 0xff, 0xff,
94 0xff, 0xff, 0xff, 0xff,
98 t.Fatalf("unexpected error while running program: %v", err)
100 if want, got := 4, out; want != got {
101 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",
106 func TestVMALUOpDiv(t *testing.T) {
107 vm, done, err := testVM(t, []bpf.Instruction{
119 t.Fatalf("failed to load BPF program: %v", err)
123 out, err := vm.Run([]byte{
124 0xff, 0xff, 0xff, 0xff,
125 0xff, 0xff, 0xff, 0xff,
129 t.Fatalf("unexpected error while running program: %v", err)
131 if want, got := 2, out; want != got {
132 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",
137 func TestVMALUOpDivByZeroALUOpConstant(t *testing.T) {
138 _, _, err := testVM(t, []bpf.Instruction{
145 if errStr(err) != "cannot divide by zero using ALUOpConstant" {
146 t.Fatalf("unexpected error: %v", err)
150 func TestVMALUOpDivByZeroALUOpX(t *testing.T) {
151 vm, done, err := testVM(t, []bpf.Instruction{
152 // Load byte 0 into X
158 // Load byte 1 into A
163 // Attempt to perform 1/0
167 // Return 4 bytes if program does not terminate
174 t.Fatalf("failed to load BPF program: %v", err)
178 out, err := vm.Run([]byte{
179 0xff, 0xff, 0xff, 0xff,
180 0xff, 0xff, 0xff, 0xff,
184 t.Fatalf("unexpected error while running program: %v", err)
186 if want, got := 0, out; want != got {
187 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",
192 func TestVMALUOpOr(t *testing.T) {
193 vm, done, err := testVM(t, []bpf.Instruction{
205 t.Fatalf("failed to load BPF program: %v", err)
209 out, err := vm.Run([]byte{
210 0xff, 0xff, 0xff, 0xff,
211 0xff, 0xff, 0xff, 0xff,
212 0x00, 0x10, 0x03, 0x04,
213 0x05, 0x06, 0x07, 0x08,
217 t.Fatalf("unexpected error while running program: %v", err)
219 if want, got := 9, out; want != got {
220 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",
225 func TestVMALUOpAnd(t *testing.T) {
226 vm, done, err := testVM(t, []bpf.Instruction{
238 t.Fatalf("failed to load BPF program: %v", err)
242 out, err := vm.Run([]byte{
243 0xff, 0xff, 0xff, 0xff,
244 0xff, 0xff, 0xff, 0xff,
248 t.Fatalf("unexpected error while running program: %v", err)
250 if want, got := 1, out; want != got {
251 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",
256 func TestVMALUOpShiftLeft(t *testing.T) {
257 vm, done, err := testVM(t, []bpf.Instruction{
263 Op: bpf.ALUOpShiftLeft,
279 t.Fatalf("failed to load BPF program: %v", err)
283 out, err := vm.Run([]byte{
284 0xff, 0xff, 0xff, 0xff,
285 0xff, 0xff, 0xff, 0xff,
289 t.Fatalf("unexpected error while running program: %v", err)
291 if want, got := 1, out; want != got {
292 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",
297 func TestVMALUOpShiftRight(t *testing.T) {
298 vm, done, err := testVM(t, []bpf.Instruction{
304 Op: bpf.ALUOpShiftRight,
320 t.Fatalf("failed to load BPF program: %v", err)
324 out, err := vm.Run([]byte{
325 0xff, 0xff, 0xff, 0xff,
326 0xff, 0xff, 0xff, 0xff,
330 t.Fatalf("unexpected error while running program: %v", err)
332 if want, got := 1, out; want != got {
333 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",
338 func TestVMALUOpMod(t *testing.T) {
339 vm, done, err := testVM(t, []bpf.Instruction{
351 t.Fatalf("failed to load BPF program: %v", err)
355 out, err := vm.Run([]byte{
356 0xff, 0xff, 0xff, 0xff,
357 0xff, 0xff, 0xff, 0xff,
361 t.Fatalf("unexpected error while running program: %v", err)
363 if want, got := 2, out; want != got {
364 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",
369 func TestVMALUOpModByZeroALUOpConstant(t *testing.T) {
370 _, _, err := testVM(t, []bpf.Instruction{
381 if errStr(err) != "cannot divide by zero using ALUOpConstant" {
382 t.Fatalf("unexpected error: %v", err)
386 func TestVMALUOpModByZeroALUOpX(t *testing.T) {
387 vm, done, err := testVM(t, []bpf.Instruction{
388 // Load byte 0 into X
394 // Load byte 1 into A
399 // Attempt to perform 1%0
403 // Return 4 bytes if program does not terminate
410 t.Fatalf("failed to load BPF program: %v", err)
414 out, err := vm.Run([]byte{
415 0xff, 0xff, 0xff, 0xff,
416 0xff, 0xff, 0xff, 0xff,
420 t.Fatalf("unexpected error while running program: %v", err)
422 if want, got := 0, out; want != got {
423 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",
428 func TestVMALUOpXor(t *testing.T) {
429 vm, done, err := testVM(t, []bpf.Instruction{
451 t.Fatalf("failed to load BPF program: %v", err)
455 out, err := vm.Run([]byte{
456 0xff, 0xff, 0xff, 0xff,
457 0xff, 0xff, 0xff, 0xff,
458 0x0b, 0x00, 0x00, 0x00,
461 t.Fatalf("unexpected error while running program: %v", err)
463 if want, got := 1, out; want != got {
464 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",
469 func TestVMALUOpUnknown(t *testing.T) {
470 vm, done, err := testVM(t, []bpf.Instruction{
479 // Verify that an unknown operation is a no-op
496 t.Fatalf("failed to load BPF program: %v", err)
500 out, err := vm.Run([]byte{
501 0xff, 0xff, 0xff, 0xff,
502 0xff, 0xff, 0xff, 0xff,
506 t.Fatalf("unexpected error while running program: %v", err)
508 if want, got := 1, out; want != got {
509 t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d",