NAME assert_macro
PROG BEGIN { assert(false, "My error message"); }
EXPECT stdlib/base.bt:6:5-37: ERROR: assert failed: My error message
WILL_FAIL

NAME ppid_macro
PROG BEGIN { printf("SUCCESS %d\n", ppid(curtask)); exit(); }
EXPECT_REGEX SUCCESS [0-9][0-9]*

NAME strerror
PROG BEGIN { print(strerror(22)); }
EXPECT Invalid argument

NAME signal_name
PROG BEGIN { print(signal_name(2)); print(signal_name(0)); print(signal_name(1024)); }
EXPECT Interrupt
EXPECT Unknown signal 0
EXPECT N/A

NAME comm from pid
PROG iter:task { @ = comm(pid); exit() }
EXPECT @: bpftrace

NAME pcomm and leader_comm for thread
RUN {{BPFTRACE}} -e 'uprobe:./testprogs/multi_threads:stub { printf("%s %s %s\n", comm, pcomm, leader_comm); }'
EXPECT son-thread multi_threads parent-thread
EXPECT grandson-thread multi_threads parent-thread
AFTER ./testprogs/multi_threads

NAME pcomm and leader_comm for process
RUN {{BPFTRACE}} -e 'uprobe:./testprogs/multi_procs:stub { printf("%s %s %s\n", comm, pcomm, leader_comm); }'
EXPECT son-proc parent-proc son-proc
EXPECT grandson-proc son-proc grandson-proc
AFTER ./testprogs/multi_procs

NAME delete map
PROG begin { @ = 1; @a[1] = 1; @b[1, 2] = 2; if (delete(@)) { printf("ok1\n"); } delete(@a, 1); if (delete(@b, (1, 2))) { printf("ok2\n"); } if (!delete(@b, (5, 6))) { printf("ok3\n"); } }
EXPECT ok1
EXPECT ok2
EXPECT ok3
TIMEOUT 1

NAME delete count-map
PROG begin { @ = count(); @a[1] = count(); delete(@); delete(@a, 1); }
EXPECT_NONE @: 0
EXPECT_NONE @a[1]: 1
TIMEOUT 1

NAME delete deprecated
PROG begin { @a[1] = 1; @b[2, "hi"] = 2; delete(@a[1]); delete(@b[2, "hi"]); }
EXPECT_NONE @a[1]: 1
EXPECT_NONE @b[2, hi]: 2
TIMEOUT 1

NAME bad delete
PROG begin { @a[1] = 1; $x = delete(@a, 2); $y = delete(@a, 1); if ($x == false && $y == true) { printf("SUCCESS"); } }
EXPECT SUCCESS
TIMEOUT 1

# Kernel commit 541003b576c3 ("rename do_filp_open() to do_file_open()") renamed
# do_filp_open to do_file_open since version 7.0 so use wildcard below to handle
# both names.
NAME is_err
PROG fexit:do_fil*_open { if (is_err(retval)) { printf("is_err: %ld\n", (int64)retval); exit(); } }
EXPECT_REGEX is_err: -[0-9]{1,4}$
AFTER cat /tmp/bpftrace_nonexistent_file
REQUIRES_FEATURE btf
TIMEOUT 5

NAME strlen
PROG begin { $a = "hello"; print(strlen($a)); }
EXPECT 5
