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
MAX_KERNEL 5.16
AFTER dd if=/dev/urandom bs=3 count=1

NAME 32-bit tracepoint arg openat_flags
PROG tracepoint:syscalls:sys_enter_openat /comm == "syscall"/ { $i = args->flags; printf("openflags: %d\n", $i); if ($i == 64) { exit() } }
EXPECT openflags: 64
TIMEOUT 5
AFTER ./testprogs/syscall openat

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

NAME variable string type resize
PROG BEGIN { $x = "hello"; $x = "hi"; printf("%s\n", $x); exit(); }
EXPECT hi
TIMEOUT 2

NAME map string type resize
PROG BEGIN { @ = "hello"; } i:ms:1 { @ = "hi"; exit(); }
EXPECT @: hi
TIMEOUT 2

NAME map key string type resize
PROG BEGIN { @["hello"] = 0; } i:ms:1 { @["hi"] = 1; exit(); }
EXPECT @\[hi\]: 1
TIMEOUT 2

NAME map multi-key string type resize
PROG BEGIN { @["hello", 0] = 0; } i:ms:1 { @["hi", 1] = 1; exit(); }
EXPECT @\[hi, 1\]: 1
TIMEOUT 2

NAME tuple string resize
PROG BEGIN { @ = ("hello", 0); } i:ms:1 { @ = ("hi", 1); exit(); }
EXPECT @: \(hi, 1\)
TIMEOUT 2
