NAME usdt probes - list probes by file
RUN {{BPFTRACE}} -l 'usdt:./testprogs/usdt_test:*'
EXPECT usdt:./testprogs/usdt_test:tracetest:testprobe

NAME usdt - list probes by file with wildcarded probe type
RUN {{BPFTRACE}} -l '*:./testprogs/usdt_test:*' | grep -e '^usdt:'
EXPECT usdt:./testprogs/usdt_test:tracetest:testprobe

NAME usdt probes - list probes by pid
RUN {{BPFTRACE}} -l -p {{BEFORE_PID}} | grep -e '^usdt:'
EXPECT_REGEX ^usdt:.*/testprogs/usdt_test:tracetest:testprobe$
BEFORE ./testprogs/usdt_test

NAME usdt probes - list probes by pid; usdt only
RUN {{BPFTRACE}} -l 'usdt:*' -p {{BEFORE_PID}}
EXPECT_REGEX ^usdt:.*/testprogs/usdt_test:tracetest:testprobe$
BEFORE ./testprogs/usdt_test

NAME usdt probes - lists linked library probes by pid
RUN {{BPFTRACE}} -l 'usdt:*' -p $(pidof usdt_lib)
EXPECT_REGEX usdt:.*/libusdt_tp.so:tracetestlib:lib_probe_1$
BEFORE ./testprogs/usdt_lib

NAME usdt probes - filter probes by file on provider
RUN {{BPFTRACE}} -l 'usdt:./testprogs/usdt_test:tracetest2:*'
EXPECT usdt:./testprogs/usdt_test:tracetest2:testprobe2

NAME usdt probes - filter probes by pid on provider
RUN {{BPFTRACE}} -l 'usdt:*:tracetest2:*' -p {{BEFORE_PID}}
EXPECT_REGEX ^usdt:.*/usdt_test:tracetest2:testprobe2$
BEFORE ./testprogs/usdt_test

NAME usdt probes - filter probes by wildcard file and wildcard probe name
RUN {{BPFTRACE}} -l 'usdt:./testprogs/usdt_test*:tracetest:test*'
EXPECT usdt:./testprogs/usdt_test:tracetest:testprobe2

NAME usdt probes - filter probes by file and wildcard probe name
RUN {{BPFTRACE}} -l 'usdt:./testprogs/usdt_test:tracetest:test*'
EXPECT usdt:./testprogs/usdt_test:tracetest:testprobe2

NAME usdt probes - filter probes by pid and wildcard probe name
RUN {{BPFTRACE}} -l 'usdt:*:tracetest:test*' -p {{BEFORE_PID}}
EXPECT_REGEX ^usdt:.*/usdt_test:tracetest:testprobe$
EXPECT_REGEX ^usdt:.*/usdt_test:tracetest:testprobe2$
BEFORE ./testprogs/usdt_test

NAME usdt probes - attach to fully specified probe by file
PROG usdt:./testprogs/usdt_test:tracetest:testprobe { printf("here\n" ); exit(); }
EXPECT here
BEFORE ./testprogs/usdt_test

NAME usdt probes - attach to fully specified probe of child
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_test:tracetest:testprobe { printf("here\n" ); exit(); }' -c ./testprogs/usdt_test
EXPECT here

NAME usdt probes - attach to fully specified probe by pid
RUN {{BPFTRACE}} -e 'usdt::tracetest:testprobe { printf("here\n" ); exit(); }' -p {{BEFORE_PID}}
EXPECT here
BEFORE ./testprogs/usdt_test

NAME usdt probes - attach to fully specified probe all pids
RUN {{BPFTRACE}} -e 'usdt:*:tracetest:testprobe { printf("here\n" ); exit(); }'
EXPECT here
BEFORE ./testprogs/usdt_test
NEW_PIDNS
# On 9pfs, is_elf() hangs on a syscall to fstat64. We suspect it's
# a bug with 9pfs. https://github.com/danobi/vmtest/pull/88 should help
# when it lands. So for now, don't run this test on 9pfs.
REQUIRES findmnt -n / | awk '{exit $3!="9pfs"}'

NAME usdt probes - attach to fully specified library probe by pid
RUN {{BPFTRACE}} -e 'usdt:./testlibs/libusdt_tp.so:tracetestlib:lib_probe_1 { printf("here\n" ); exit(); }' -p $(pidof usdt_lib)
BEFORE ./testprogs/usdt_lib
EXPECT here

NAME usdt probes - all probes by wildcard and file
PROG usdt:./testprogs/usdt_test:* { printf("here\n" ); exit(); }
EXPECT Attached 3 probes
BEFORE ./testprogs/usdt_test

NAME usdt probes - all probes by wildcard and file with child
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_test:* { printf("here\n" ); exit(); }' -c ./testprogs/usdt_test
EXPECT Attached 3 probes

# TODO(mmarchini): re-enable this test
# This test has two problems: it relies on the latest version of bcc and it
# assumes USDTs are coming only from the binary. On Ubuntu, glibc is built with
# USDT support, which means it will attach to 43 probes instead of 3. Before
# re-enabling this test, we should:
#  - Skip if bcc doesn't support multiple probes with the same name
#  - Fix https://github.com/bpftrace/bpftrace/issues/565#issuecomment-496731112
#    and https://github.com/bpftrace/bpftrace/issues/688
NAME usdt probes - all probes by wildcard and pid
RUN {{BPFTRACE}} -e 'usdt:* { printf("here\n" ); exit(); }' -p {{BEFORE_PID}}
EXPECT Attached 3 probes
BEFORE ./testprogs/usdt_test
REQUIRES bash -c "exit 1"

NAME usdt probes - attach to probe by wildcard and file
PROG usdt:./testprogs/usdt_test::*probe2 { printf("here\n" ); exit(); }
EXPECT Attached 2 probes
BEFORE ./testprogs/usdt_test

NAME usdt probes - attach to probe by wildcard and file with child
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_test::*probe2 { printf("here\n" ); exit(); }' -c ./testprogs/usdt_test
EXPECT Attached 2 probes

NAME usdt probes - attach to probes by wildcard file
PROG usdt:./testprogs/usdt_test*::* { printf("here\n" ); exit(); }
EXPECT Attached 3 probes
BEFORE ./testprogs/usdt_test

NAME usdt probes - attach to probes by wildcard file with child
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_test*::* { printf("here\n" ); exit(); }' -c ./testprogs/usdt_test
EXPECT Attached 3 probes

NAME usdt probes - attach to probe on multiple files by wildcard
PROG usdt:./testprogs/usdt*::* { printf("here\n" ); exit(); }
EXPECT Attached 49 probes

NAME usdt probes - attach to probe on multiple providers by wildcard and pid
RUN {{BPFTRACE}} -e 'usdt:::*probe2 { printf("here\n" ); exit(); }' -p {{BEFORE_PID}}
EXPECT Attached 2 probes
BEFORE ./testprogs/usdt_test

NAME usdt probes - attach to multiple probes with different number of locations by wildcard
PROG usdt:./testprogs/usdt_multiple_locations:tracetest:testprobe* { printf("here\n" ); exit(); }
BEFORE ./testprogs/usdt_multiple_locations
EXPECT Attached 6 probes

NAME usdt probes - attach to probe with args by file
PROG usdt:./testprogs/usdt_test:* { $a = str(arg1); print($a); @c[$a] = 1; if (len(@c) == 3) { exit(); } }
EXPECT Hello World1
EXPECT Hello World2
EXPECT Hello World3
BEFORE ./testprogs/usdt_test

NAME usdt probes - attach to probe with args by pid
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_test:* { $a = str(arg1); print($a); @c[$a] = 1; if (len(@c) == 3) { exit(); } }' -p {{BEFORE_PID}}
EXPECT Hello World1
EXPECT Hello World2
EXPECT Hello World3
BEFORE ./testprogs/usdt_test

NAME usdt probes - attach to probe with probe builtin and args by file
PROG usdt:./testprogs/usdt_test:* { printf("%lld %s\n", arg0, probe ); exit(); }
EXPECT_REGEX ^\d+ usdt:./testprogs/usdt_test:tracetest.?:testprobe.?$
BEFORE ./testprogs/usdt_test

NAME usdt probes - attach to probe with probe builtin and args by file with child
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_test:* { printf("%lld %s\n", arg0, probe ); exit(); }' -c ./testprogs/usdt_test
EXPECT_REGEX ^\d+ usdt:./testprogs/usdt_test:tracetest.?:testprobe.?$

NAME usdt probes - attach to probe with probe builtin and args by pid
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_test:* { printf("%lld %s\n", arg0, probe ); exit(); }' -p {{BEFORE_PID}}
EXPECT_REGEX ^\d+ usdt:.*/testprogs/usdt_test:tracetest.?:testprobe.?$
BEFORE ./testprogs/usdt_test

NAME usdt probes - attach to probe with semaphore
RUN {{BPFTRACE}} -e 'usdt::tracetest:testprobe { printf("%s\n", str(arg1) ); exit(); }' -p {{BEFORE_PID}}
EXPECT tracetest_testprobe_semaphore: 1
BEFORE ./testprogs/usdt_semaphore_test

NAME usdt probes - file based semaphore activation
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_semaphore_test:tracetest:testprobe { printf("%s\n", str(arg1) ); exit(); }' --usdt-file-activation
EXPECT tracetest_testprobe_semaphore: 1
BEFORE ./testprogs/usdt_semaphore_test

NAME usdt probes - file based semaphore activation no process, kernel usdt semaphore
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_semaphore_test:tracetest:testprobe { exit(); }' --usdt-file-activation
EXPECT Attached 1 probe

NAME usdt probes - file based semaphore activation
PROG usdt:./testprogs/usdt_semaphore_test:tracetest:testprobe { printf("%s\n", str(arg1) ); exit(); }
EXPECT tracetest_testprobe_semaphore: 1
BEFORE ./testprogs/usdt_semaphore_test

NAME usdt probes - file based semaphore activation multi process
RUN {{BPFTRACE}} runtime/scripts/usdt_file_activation_multiprocess.bt --usdt-file-activation
EXPECT found 2 processes
BEFORE ./testprogs/usdt_semaphore_test
BEFORE ./testprogs/usdt_semaphore_test
# See https://github.com/bpftrace/bpftrace/pull/2438
SKIP_IF_ENV_HAS CI=true

NAME usdt probes - list probes by pid in separate mountns
RUN {{BPFTRACE}} -l 'usdt:*' -p {{BEFORE_PID}}
EXPECT_REGEX ^usdt:.*/tmp/bpftrace-unshare-mountns-test/usdt_test:tracetest:testprobe$
BEFORE ./testprogs/mountns_wrapper usdt_test

# TODO(dalehamel): re-enable this test
# This test relies on the latest version of bcc (expected to be released as 0.13.0)
# Once we build against this version with USDT fixes, we should re-enable this test.
NAME usdt probes - attach to fully specified probe by pid in separate mountns
RUN {{BPFTRACE}} -e 'usdt:/tmp/bpftrace-unshare-mountns-test/usdt_test:tracetest:testprobe { printf("here\n" ); exit(); }' -p {{BEFORE_PID}}
EXPECT here
BEFORE ./testprogs/mountns_wrapper usdt_test
REQUIRES bash -c "exit 1"

NAME usdt quoted probe name
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_quoted_probe:test:"\"probe1\"" { printf("%d\n", arg0); exit(); }' -p {{BEFORE_PID}}
EXPECT 1
BEFORE ./testprogs/usdt_quoted_probe

NAME usdt sized arguments
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_sized_args:test:probe2 { printf("%ld\n", arg0); exit(); }' -p {{BEFORE_PID}}
EXPECT 1
BEFORE ./testprogs/usdt_sized_args

NAME usdt constant arguments
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_args:usdt_args:const_* { printf("%lld ", arg0); }' -c ./testprogs/usdt_args
EXPECT -579005069656919568 -579005069656919568 4092785136 -202182160 61936 -3600 240 -16

NAME usdt reg arguments
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_args:usdt_args:reg_* { printf("%lld ", arg0); }' -c ./testprogs/usdt_args
EXPECT -579005069656919568 -579005069656919568 4092785136 -202182160 61936 -3600 240 -16

NAME usdt addr arguments
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_args:usdt_args:addr_* { printf("%lld ", arg0); }' -c ./testprogs/usdt_args
EXPECT -579005069656919568 -579005069656919568 4092785136 -202182160 61936 -3600 240 -16

NAME usdt addr+index arguments
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_args:usdt_args:index_* { printf("%lld ", arg0); }' -c ./testprogs/usdt_args
EXPECT -579005069656919568 -579005069656919568 4092785136 -202182160 61936 -3600 240 -16

# USDT probes can be inlined which creates duplicate identical probes. We must
# attach to all of them
NAME usdt duplicated markers
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_inlined:tracetest:testprobe { printf("%d\n", arg1); @a += 1; if (@a >= 2) {exit();} }' -c ./testprogs/usdt_inlined
EXPECT_REGEX 999\n100
TIMEOUT 1

NAME usdt probes in multiple modules
RUN {{BPFTRACE}} runtime/scripts/usdt_multi_modules.bt
EXPECT Attached 2 probes
TIMEOUT 1

NAME usdt multi arguments
RUN {{BPFTRACE}} -e 'usdt:./testprogs/usdt_multi_args:usdt_multi_args:probe1 { printf("%llx %llx %llx %llx %llx %llx %llx %llx %llx %llx %lld %llx\n", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); exit(); }' -c ./testprogs/usdt_multi_args
EXPECT deadbeef 1 ffffffffffffffff cafebabe 8badf00d feedface 123456789abcdef 0 7fffffffffffffff 5555555555555555 42 aaaaaaaaaaaaaaaa
