NAME pid
PROG i:ms:1 { printf("SUCCESS %d\n", pid); exit(); }
EXPECT SUCCESS [0-9][0-9]*
TIMEOUT 5

NAME tid
PROG i:ms:1 { printf("SUCCESS %d\n", tid); exit(); }
EXPECT SUCCESS [0-9][0-9]*
TIMEOUT 5

NAME uid
PROG i:ms:1 { printf("SUCCESS %d\n", uid); exit(); }
EXPECT SUCCESS [0-9][0-9]*
TIMEOUT 5

NAME gid
PROG i:ms:1 { printf("SUCCESS %d\n", gid); exit(); }
EXPECT SUCCESS [0-9][0-9]*
TIMEOUT 5

NAME nsecs
PROG i:ms:1 { printf("SUCCESS %d\n", nsecs); exit(); }
EXPECT SUCCESS -?[0-9][0-9]*
TIMEOUT 5

NAME elapsed
PROG i:ms:1 { printf("SUCCESS %d\n", elapsed); exit(); }
EXPECT SUCCESS -?[0-9][0-9]*
TIMEOUT 5

NAME numaid
PROG i:ms:1 { printf("SUCCESS %d\n", numaid); exit(); }
EXPECT SUCCESS -?[0-9][0-9]*
TIMEOUT 5

NAME cpu
PROG i:ms:1 { printf("SUCCESS %d\n", cpu); exit(); }
EXPECT SUCCESS -?[0-9][0-9]*
TIMEOUT 5

NAME comm
PROG k:vfs_read { printf("SUCCESS %s\n", comm); exit(); }
EXPECT SUCCESS .*
TIMEOUT 5
AFTER ./testprogs/syscall read

NAME kstack
PROG k:vfs_read{ printf("%s\n", kstack); exit(); }
EXPECT Attaching 1 probe
TIMEOUT 5
AFTER ./testprogs/syscall read

NAME ustack
PROG k:vfs_read { printf("%s\n", ustack); exit(); }
EXPECT Attaching 1 probe
TIMEOUT 5
AFTER ./testprogs/syscall read

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

NAME sarg
PROG uprobe:./testprogs/stack_args:too_many_args { printf("SUCCESS %d %d\n", sarg0, sarg1); exit(); }
EXPECT SUCCESS 32 64
ARCH x86_64
TIMEOUT 5
AFTER ./testprogs/stack_args

NAME sarg
PROG uprobe:./testprogs/stack_args:too_many_args { printf("SUCCESS %d %d\n", sarg0, sarg1); exit(); }
EXPECT SUCCESS 128 256
ARCH aarch64|ppc64|ppc64le
TIMEOUT 5
AFTER ./testprogs/stack_args

NAME sarg
PROG uprobe:./testprogs/stack_args:too_many_args { printf("SUCCESS %d %d\n", sarg0, sarg1); exit(); }
EXPECT SUCCESS 16 32
ARCH s390x
TIMEOUT 5
AFTER ./testprogs/stack_args

NAME sarg
PROG uprobe:./testprogs/stack_args:too_many_args { printf("SUCCESS %d %d\n", sarg0, sarg1); exit(); }
EXPECT SUCCESS 8 16
ARCH armv7l
TIMEOUT 5
AFTER ./testprogs/stack_args

NAME retval
PROG kretprobe:vfs_read { printf("SUCCESS %d\n", retval); exit(); }
EXPECT SUCCESS .*
TIMEOUT 5
AFTER ./testprogs/syscall read

NAME func
PROG k:vfs_read { printf("SUCCESS %s\n", func); exit(); }
EXPECT SUCCESS .*
TIMEOUT 5
AFTER ./testprogs/syscall read

NAME func_uprobe
PROG uprobe:./testprogs/uprobe_negative_retval:function1 { printf("SUCCESS %s\n", func); exit(); }
EXPECT SUCCESS .*
AFTER ./testprogs/uprobe_negative_retval
TIMEOUT 5

NAME username
PROG i:ms:1 { printf("SUCCESS %s\n", username); exit(); }
EXPECT SUCCESS .*
TIMEOUT 5

NAME probe
PROG k:do_nanosleep { printf("SUCCESS %s\n", probe); exit(); }
EXPECT SUCCESS kprobe:do_nanosleep
TIMEOUT 5
AFTER ./testprogs/syscall nanosleep 1e8

NAME begin probe
PROG BEGIN { printf("%s", probe);exit(); } END{printf("-%s\n", probe); }
EXPECT ^BEGIN-END$
TIMEOUT 5
AFTER ./testprogs/syscall nanosleep 1e8

NAME curtask
PROG i:ms:1 { printf("SUCCESS %d\n", curtask); exit(); }
EXPECT SUCCESS -?[0-9][0-9]*
TIMEOUT 5

NAME curtask_field
PROG struct task_struct {int x;} i:ms:1 { printf("SUCCESS %d\n", curtask->x); exit(); }
EXPECT SUCCESS -?[0-9][0-9]*
TIMEOUT 5

NAME rand
PROG i:ms:1 { printf("SUCCESS %d\n", rand); exit(); }
EXPECT SUCCESS -?[0-9][0-9]*
TIMEOUT 5

NAME cgroup
PROG i:ms:1 { printf("SUCCESS %d\n", cgroup); exit(); }
EXPECT SUCCESS -?[0-9][0-9]*
TIMEOUT 5
MIN_KERNEL 4.18

NAME ctx
PROG struct x {unsigned long x}; i:ms:1 { printf("SUCCESS %d\n", ((struct x*)ctx)->x); exit(); }
EXPECT SUCCESS -?[0-9][0-9]*
TIMEOUT 5

NAME cat
PROG i:ms:1 { cat("/proc/loadavg"); exit(); }
EXPECT ^([0-9]+\.[0-9]+ ?)+.*$
TIMEOUT 5

NAME cat limited output
ENV BPFTRACE_CAT_BYTES_MAX=1
PROG i:ms:1 { cat("/proc/loadavg"); exit(); }
EXPECT ^[0-9]$
TIMEOUT 5

NAME cat format str
PROG i:ms:1 { $s = "loadavg"; cat("/proc/%s", $s); exit(); }
EXPECT ^([0-9]+\.[0-9]+ ?)+.*$
TIMEOUT 5

NAME log size too small
ENV BPFTRACE_LOG_SIZE=1
RUN {{BPFTRACE}} -ve 'BEGIN { if (str($1) == str($2)) { printf("%s\n", str($1)); exit() } }' "hello" "hello"
EXPECT Error loading program: BEGIN
TIMEOUT 5
WILL_FAIL

NAME increase log size
RUN {{BPFTRACE}} -ve 'BEGIN { if (str($1) == str($2)) { printf("%s\n", str($1)); exit() } }' "hello" "hello"
EXPECT ^Attaching 1 probe
TIMEOUT 5

NAME cat "no such file"
PROG i:ms:1 { cat("/does/not/exist/file"); exit(); }
EXPECT ^ERROR: failed to open file '/does/not/exist/file': No such file or directory$
TIMEOUT 5

NAME sizeof
PROG struct Foo { int x; char c; } BEGIN { $x = 1; printf("%d %d %d %d %d\n", sizeof(struct Foo), sizeof((*(struct Foo*)0).x), sizeof((*(struct Foo*)0).c), sizeof(1 == 1), sizeof($x)); exit(); }
EXPECT ^8 4 1 8 8$
TIMEOUT 5

NAME sizeof_ints
PROG BEGIN { printf("%d %d %d %d %d %d\n", sizeof(uint8), sizeof(int8), sizeof(uint16), sizeof(int16), sizeof(uint32), sizeof(int32)); exit(); }
EXPECT ^1 1 2 2 4 4$
TIMEOUT 5

# printf only takes 7 args
NAME sizeof_ints_pt2
PROG BEGIN { printf("%d %d\n", sizeof(uint64), sizeof(int64)); exit(); }
EXPECT ^8 8$
TIMEOUT 5

NAME sizeof_btf
PROG BEGIN { printf("size=%d\n", sizeof(struct task_struct)); exit(); }
EXPECT ^size=
TIMEOUT 5
REQUIRES_FEATURE btf
