NAME global_int
PROG i:ms:1 {@a = 10; printf("%d\n", @a); exit();}
EXPECT \@a: 10
TIMEOUT 5

NAME global_string
PROG i:ms:1 {@a = "hi"; printf("%s\n", @a); exit();}
EXPECT @a: hi
TIMEOUT 5

NAME global_buf
PROG i:ms:1 {@a = buf("hi", 2); printf("%r\n", @a); exit();}
EXPECT @a: hi
TIMEOUT 5

NAME local_int
PROG i:ms:1  {$a = 10; printf("a=%d\n", $a); exit();}
EXPECT a=10
TIMEOUT 5

NAME local_string
PROG i:ms:1  {$a = "hi"; printf("a=%s\n", $a); exit();}
EXPECT a=hi
TIMEOUT 5

NAME local_buf
PROG i:ms:1 {$a = buf("hi", 2); printf("a=%r\n", $a); exit();}
EXPECT a=hi
TIMEOUT 5

NAME buf_equality
PROG i:ms:1 {$a = buf("hi", 2); $b = buf("bye", 3); printf("equal=%d, unequal=%d\n", $a == $a, $a != $b); exit();}
EXPECT equal=1, unequal=1
TIMEOUT 5

NAME global_associative_arrays
PROG k:vfs_read { @start[tid] = nsecs; } kretprobe:vfs_read /@start[tid] != 0/ { printf("slept for %d ms\n", (nsecs - @start[tid]) / 1000000); delete(@start[tid]); exit();}
EXPECT slept for [0-9]+ ms
TIMEOUT 5
AFTER ./testprogs/syscall read

NAME scratch
PROG k:vfs_read { @start[tid] = nsecs; } kretprobe:vfs_read /@start[tid] != 0/ { $delta = nsecs - @start[tid]; printf("slept for %d ms\n", $delta / 1000000); delete(@start[tid]); exit(); }
EXPECT slept for [0-9]* ms
TIMEOUT 5
AFTER ./testprogs/syscall read

NAME 32-bit tracepoint arg
PROG tracepoint:random:urandom_read { $i = args->got_bits; printf("bits: %d\n", $i); if ($i == 24) { exit() } }
EXPECT bits: 24
TIMEOUT 5
AFTER dd if=/dev/urandom bs=3 count=1

NAME tracepoint arg casts in predicates
RUN {{BPFTRACE}} -e 'tracepoint:syscalls:sys_enter_wait4 /args->ru/ { @ru[tid] = args->ru; } tracepoint:syscalls:sys_exit_wait4 /@ru[tid]/ { @++; exit(); }' -c ./testprogs/wait4_ru
EXPECT @: 1
TIMEOUT 5
