#!/bin/bash
# perf trace BTF general tests (exclusive)
# SPDX-License-Identifier: GPL-2.0

err=0

# shellcheck source=lib/probe.sh
. "$(dirname $0)"/lib/probe.sh

file1=$(mktemp /tmp/file1_XXXX)
file2=$(echo $file1 | sed 's/file1/file2/g')

buffer="buffer content"
perf_config_tmp=$(mktemp /tmp/.perfconfig_XXXXX)

trap cleanup EXIT TERM INT HUP

check_vmlinux() {
  echo "Checking if vmlinux BTF exists"
  if [ ! -f /sys/kernel/btf/vmlinux ]
  then
    echo "Skipped due to missing vmlinux BTF"
    return 2
  fi
  return 0
}

trace_test_string() {
  echo "Testing perf trace's string augmentation"
  output="$(perf trace --sort-events -e renameat* --max-events=1 -- mv ${file1} ${file2} 2>&1)"
  if ! echo "$output" | grep -q -E "^mv/[0-9]+ renameat(2)?\(.*, \"${file1}\", .*, \"${file2}\", .*\) += +[0-9]+$"
  then
    printf "String augmentation test failed, output:\n$output\n"
    err=1
  fi
}

trace_test_buffer() {
  echo "Testing perf trace's buffer augmentation"
  # echo will insert a newline (\10) at the end of the buffer
  output="$(perf trace --sort-events -e write --max-events=1 -- echo "${buffer}" 2>&1)"
  if ! echo "$output" | grep -q -E "^echo/[0-9]+ write\([0-9]+, ${buffer}.*, [0-9]+\) += +[0-9]+$"
  then
    printf "Buffer augmentation test failed, output:\n$output\n"
    err=1
  fi
}

trace_test_struct_btf() {
  echo "Testing perf trace's struct augmentation"
  output="$(perf trace --sort-events -e clock_nanosleep --force-btf --max-events=1 -- sleep 1 2>&1)"
  if ! echo "$output" | grep -q -E "^sleep/[0-9]+ clock_nanosleep\(0, 0, \{1,.*\}, 0x[0-9a-f]+\) += +[0-9]+$"
  then
	printf "BTF struct augmentation test failed, output:\n$output\n"
    err=1
  fi
}

cleanup() {
  rm -rf ${file1} ${file2} ${perf_config_tmp}
}

trap_cleanup() {
  echo "Unexpected signal in ${FUNCNAME[1]}"
  cleanup
  exit 1
}

# don't overwrite user's perf config
trace_config() {
  export PERF_CONFIG=${perf_config_tmp}
  perf config trace.show_arg_names=false trace.show_duration=false \
    trace.show_timestamp=false trace.args_alignment=0
}

skip_if_no_perf_trace || exit 2
check_vmlinux || exit 2
[ "$(id -u)" = 0 ] || exit 2

trace_config

trace_test_string

if [ $err = 0 ]; then
  trace_test_buffer
fi

if [ $err = 0 ]; then
  trace_test_struct_btf
fi

cleanup

exit $err
