# https://github.com/iovisor/bpftrace/pull/566#issuecomment-487295113
NAME codegen_struct_save_nested
PROG struct Foo { int m; struct { int x; int y; } bar; int n; } BEGIN { @foo = (struct Foo *)0; @bar = @foo->bar; @x = @foo->bar.x; printf("_%s_\n", "done"); exit(); }
EXPECT _done_
TIMEOUT 1

NAME logical_and_or_different_sizes
PROG struct Foo { int m; } uprobe:./testprogs/simple_struct:func { $foo = (struct Foo*)arg0; printf("%d %d %d %d %d\n", $foo->m, $foo->m && 0, 1 && $foo->m, $foo->m || 0, 0 || $foo->m); exit(); }
AFTER ./testprogs/simple_struct
EXPECT 2 0 1 1 1
TIMEOUT 5

# https://github.com/iovisor/bpftrace/issues/759
# Update test once https://github.com/iovisor/bpftrace/pull/781 lands
# NAME ntop_map_printf
# RUN {{BPFTRACE}} -e 'union ip { char v4[4]; char v6[16]; } uprobe:./testprogs/ntop:test_ntop { @a = ntop(2, ((union ip*)arg0)->v4); printf("v4: %s; ", @a); @b = ntop(10, ((union ip*)arg1)->v6); exit() } END { printf("v6: %s", @b); clear(@a); clear(@b) }'
# AFTER ./testprogs/ntop
# EXPECT v4: 127.0.0.1; v6: ffee:ffee:ddcc:ddcc:bbaa:bbaa:c0a8:1
# TIMEOUT 1

NAME modulo_operator
PROG BEGIN { @x = 4; printf("%d\n", @x % 2); exit() }
EXPECT 0
TIMEOUT 5

NAME c_array_indexing
RUN {{BPFTRACE}} -e 'struct Foo { int a; uint8_t b[10]; } uprobe:testprogs/uprobe_test:function2 { $foo = (struct Foo *)arg0; printf("%c %c %c %c %c\n", $foo->b[0], $foo->b[1], $foo->b[2], $foo->b[3], $foo->b[4]) }' -c ./testprogs/uprobe_test
EXPECT h e l l o
TIMEOUT 5

# https://github.com/iovisor/bpftrace/issues/1773
NAME single_arg_wildcard_listing
RUN {{BPFTRACE}} -l "*do_nanosleep*"
EXPECT kprobe:do_nanosleep
TIMEOUT 1

NAME single_arg_wildcard_listing_tracepoint
RUN {{BPFTRACE}} -l "*sched_switch*"
EXPECT tracepoint:sched:sched_switch
TIMEOUT 1

# https://github.com/iovisor/bpftrace/issues/1952
NAME async_id_invalid_probe_expansion
PROG kprobe:zzzzz { probe; printf("asdf\n") } BEGIN { printf("_%s_\n", "success"); exit() }
EXPECT _success_
TIMEOUT 1

NAME strncmp_n_longer_than_buffer
PROG BEGIN { printf("_%d_\n", strncmp("wow", comm, 17)); exit() }
EXPECT _1_
TIMEOUT 1

NAME strncmp_checks_for_nul
PROG BEGIN { printf("_%d_\n", strncmp("one", "one ", 4)); exit() }
EXPECT _1_
TIMEOUT 1

NAME string compare with empty
PROG BEGIN { if ("hello" == "") { printf("equal"); } else { printf("not equal"); } exit(); }
EXPECT not equal
TIMEOUT 3

NAME string compare with prefix
PROG BEGIN { if ("hello" == "hell") { printf("equal"); } else { printf("not equal"); } exit(); }
EXPECT not equal
TIMEOUT 3

NAME strncmp with prefix
PROG BEGIN { if (strncmp("hello", "hell", 5) == 0) { printf("equal"); } else { printf("not equal"); } exit(); }
EXPECT not equal
TIMEOUT 3

# The issue this test catches is the verifier doesn't allow multiple ALU ops on ctx pointer.
# ctx+const is ok, but ctx+const+const is not ok.
NAME access ctx struct field twice
PROG tracepoint:sched:sched_wakeup { if (args.comm == "asdf") { print(args.comm) } exit(); }
EXPECT Attaching 1 probe
TIMEOUT 1

# https://github.com/iovisor/bpftrace/issues/2135
NAME address_probe_invalid_expansion
RUN {{BPFTRACE}} -e "uprobe:./testprogs/uprobe_test:0x$(nm ./testprogs/uprobe_test | awk '$3 == "function1" {print $1}') { @[probe] = count(); exit() }"
EXPECT Attaching 1 probe
TIMEOUT 1
