NAME kprobe
PROG kprobe:vfs_read { printf("SUCCESS '$test' %d\n", pid); exit(); }
EXPECT SUCCESS kprobe [0-9][0-9]*
TIMEOUT 5
AFTER ./testprogs/syscall read

NAME kprobe_short_name
PROG k:vfs_read { printf("SUCCESS '$test' %d\n", pid); exit(); }
EXPECT SUCCESS kprobe_short_name [0-9][0-9]*
TIMEOUT 5
AFTER ./testprogs/syscall read

NAME kprobe_target
PROG kprobe:syscalls:sys_exit_nanosleep { printf("SUCCESS '$test' %d\n", pid); exit(); }
EXPECT kprobe probe type requires 1 argument
TIMEOUT 5

NAME kprobe_order
RUN {{BPFTRACE}} runtime/scripts/kprobe_order.bt
EXPECT first second
TIMEOUT 5
AFTER /bin/bash -c "./testprogs/syscall nanosleep 1000"; /bin/bash -c "./testprogs/syscall nanosleep 1000"

NAME kprobe_offset
PROG kprobe:vfs_read+0 { printf("SUCCESS '$test' %d\n", pid); exit(); }
EXPECT SUCCESS kprobe_offset [0-9][0-9]*
TIMEOUT 5
AFTER ./testprogs/syscall read

# Note: this test may fail if you've installed a new kernel but not rebooted
# yet. Reason is b/c bpftrace will look for a vmlinux based on the running kernel's
# version.
NAME kprobe_offset_fail_size
PROG kprobe:vfs_read+1000000 { printf("SUCCESS '$test' %d\n", pid); exit(); }
EXPECT Offset outside the function bounds \('vfs_read' size is*
TIMEOUT 5

NAME kretprobe
PROG kretprobe:vfs_read { printf("SUCCESS '$test' %d\n", pid); exit(); }
EXPECT SUCCESS kretprobe [0-9][0-9]*
TIMEOUT 5
AFTER ./testprogs/syscall read

NAME kretprobe_short_name
PROG kr:vfs_read { printf("SUCCESS '$test' %d\n", pid); exit(); }
EXPECT SUCCESS kretprobe_short_name [0-9][0-9]*
TIMEOUT 5
AFTER ./testprogs/syscall read

NAME kretprobe_target
PROG kretprobe:syscalls:sys_exit_nanosleep { printf("SUCCESS '$test' %d\n", pid); exit(); }
EXPECT kretprobe probe type requires 1 argument
TIMEOUT 5

NAME kretprobe_order
RUN {{BPFTRACE}} runtime/scripts/kretprobe_order.bt
EXPECT first second
TIMEOUT 5
AFTER /bin/bash -c "./testprogs/syscall nanosleep 1000"; /bin/bash -c "./testprogs/syscall nanosleep 1000"

NAME uprobe
PROG uprobe:/bin/bash:echo_builtin { printf("arg0: %d\n", arg0); exit();}
EXPECT arg0: [0-9]*
TIMEOUT 5
AFTER /bin/bash -c "echo lala"

NAME uprobe_offset
PROG uprobe:/bin/bash:echo_builtin+0 { printf("arg0: %d\n", arg0); exit();}
EXPECT arg0: [0-9]*
TIMEOUT 5
AFTER /bin/bash -c "echo lala"

NAME uprobe_offset
PROG uprobe:/bin/bash:"echo_builtin"+0 { printf("arg0: %d\n", arg0); exit();}
EXPECT arg0: [0-9]*
TIMEOUT 5
AFTER /bin/bash -c "echo lala"

NAME uprobe_offset_fail_size
PROG uprobe:/bin/bash:echo_builtin+1000000 { printf("arg0: %d\n", arg0); exit();}
EXPECT Offset outside the function bounds \('echo_builtin' size is*
TIMEOUT 5

NAME uprobe_address_fail_resolve
PROG uprobe:/bin/bash:10 { printf("arg0: %d\n", arg0); exit();}
EXPECT Could not resolve address: /bin/bash:0xa
TIMEOUT 5

NAME uprobe_library
PROG uprobe:libc:fread { printf("size: %d\n", arg1); exit(); }
EXPECT size: [0-9]+
TIMEOUT 5
AFTER ./testprogs/uprobe_library
REQUIRES_FEATURE libpath_resolv

NAME uprobe_order
RUN {{BPFTRACE}} runtime/scripts/uprobe_order.bt
EXPECT first second
TIMEOUT 5
AFTER /bin/bash -c "echo lala"; /bin/bash -c "echo lala"

NAME uretprobe
PROG uretprobe:/bin/bash:echo_builtin { printf("readline: %d\n", retval); exit();}
EXPECT readline: [0-9]*
TIMEOUT 5
AFTER /bin/bash -c "echo lala"

NAME uretprobe_order
RUN {{BPFTRACE}} runtime/scripts/uretprobe_order.bt
EXPECT first second
TIMEOUT 5
AFTER /bin/bash -c "echo lala"; /bin/bash -c "echo lala"

NAME tracepoint
PROG tracepoint:syscalls:sys_exit_nanosleep { printf("SUCCESS '$test' %d\n", gid); exit(); }
EXPECT SUCCESS tracepoint [0-9][0-9]*
AFTER ./testprogs/syscall nanosleep 1e8
TIMEOUT 5

NAME tracepoint_short_name
PROG t:syscalls:sys_exit_nanosleep { printf("SUCCESS '$test' %d\n", gid); exit(); }
EXPECT SUCCESS tracepoint_short_name [0-9][0-9]*
AFTER ./testprogs/syscall nanosleep 1e8
TIMEOUT 5

NAME tracepoint_order
RUN {{BPFTRACE}} runtime/scripts/tracepoint_order.bt
EXPECT first second
TIMEOUT 5
AFTER ./testprogs/syscall nanosleep 1e8; ./testprogs/syscall nanosleep 1e8

NAME tracepoint_expansion
RUN {{BPFTRACE}} -e 'tracepoint:syscalls:sys_*_nanosleep { printf("hit "); }' -c "./testprogs/syscall nanosleep 1e8"
EXPECT hit hit
TIMEOUT 5

# Test that we get at least two characters out
NAME tracepoint_data_loc
PROG tracepoint:irq:irq_handler_entry { print(str(args->name)); exit(); }
EXPECT ..+
TIMEOUT 5

NAME profile
PROG profile:hz:599 { @[tid] = count(); exit();}
EXPECT \@\[[0-9]*\]\:\s[0-9]
TIMEOUT 5

NAME profile_short_name
PROG p:hz:599 { @[tid] = count(); exit();}
EXPECT \@\[[0-9]*\]\:\s[0-9]
TIMEOUT 5

NAME interval
PROG t:raw_syscalls:sys_enter { @syscalls = count(); } interval:ms:1{ print(@syscalls); clear(@syscalls); exit();}
EXPECT @syscalls\:\s[0-9]*
TIMEOUT 5

NAME interval_short_name
PROG t:raw_syscalls:sys_enter { @syscalls = count(); } i:ms:1{ print(@syscalls); clear(@syscalls); exit();}
EXPECT @syscalls\:\s[0-9]*
TIMEOUT 5

NAME software
PROG software:faults:1 { @[comm] = count(); exit();}
EXPECT @\[.*\]\:\s[0-9]*
TIMEOUT 5

NAME software_order
RUN {{BPFTRACE}} runtime/scripts/software_order.bt
EXPECT first second
TIMEOUT 5

NAME hardware
REQUIRES ls /sys/devices/cpu/events/cache-misses
PROG hardware:cache-misses:10 { @[pid] = count(); exit(); }
EXPECT @\[.*\]\:\s[0-9]*
TIMEOUT 5
NAME BEGIN
PROG BEGIN { printf("Hello\n"); exit();}
EXPECT Hello
TIMEOUT 2

NAME END_processing_after_exit
RUN {{BPFTRACE}} -e "interval:s:1 { exit(); } END { printf("end"); }"
EXPECT end
TIMEOUT 2
