|
#!/bin/bash |
|
|
|
PROG=${0##*/} |
|
build_dir="build-ci-debug" |
|
|
|
|
|
red=$(tput setaf 1) |
|
green=$(tput setaf 2) |
|
yellow=$(tput setaf 3) |
|
blue=$(tput setaf 4) |
|
magenta=$(tput setaf 5) |
|
cyan=$(tput setaf 6) |
|
normal=$(tput sgr0) |
|
|
|
|
|
|
|
|
|
|
|
print_full_help() { |
|
cat << EOF |
|
Usage: $PROG [OPTION]... <test_regex> (test_number) |
|
Debug specific ctest program. |
|
|
|
Options: |
|
-h, --help display this help and exit |
|
-g run in gdb mode |
|
|
|
Arguments: |
|
<test_regex> (Mandatory) Supply one regex to the script to filter tests |
|
(test_number) (Optional) Test number to run a specific test |
|
|
|
Example: |
|
$PROG test-tokenizer |
|
$PROG test-tokenizer 3 |
|
EOF |
|
} |
|
|
|
abort() { |
|
echo "Error: $1" >&2 |
|
cat << EOF >&2 |
|
Usage: $PROG [OPTION]... <test_regex> (test_number) |
|
Debug specific ctest program. |
|
Refer to --help for full instructions. |
|
EOF |
|
exit 1 |
|
} |
|
|
|
|
|
|
|
|
|
|
|
check_dependency() { |
|
command -v "$1" >/dev/null 2>&1 || { |
|
abort "$1 is required but not found. Please install it and try again." |
|
} |
|
} |
|
|
|
check_dependency ctest |
|
check_dependency cmake |
|
|
|
|
|
|
|
|
|
|
|
if [ x"$1" = x"-h" ] || [ x"$1" = x"--help" ]; then |
|
print_full_help >&2 |
|
exit 0 |
|
fi |
|
|
|
|
|
gdb_mode=false |
|
while getopts "g" opt; do |
|
case $opt in |
|
g) |
|
gdb_mode=true |
|
echo "gdb_mode Mode Enabled" |
|
;; |
|
esac |
|
done |
|
|
|
|
|
shift $((OPTIND - 1)) |
|
|
|
|
|
if [ -z "${1}" ]; then |
|
abort "Test regex is required" |
|
else |
|
test_suite=${1:-} |
|
fi |
|
|
|
|
|
test_number=${2:-} |
|
|
|
|
|
|
|
|
|
|
|
|
|
repo_root=$(git rev-parse --show-toplevel) |
|
if [ ! -d "$repo_root" ]; then |
|
abort "Not in a Git repository." |
|
fi |
|
|
|
|
|
pushd "$repo_root" |
|
rm -rf "$build_dir" && mkdir "$build_dir" || abort "Failed to make $build_dir" |
|
|
|
|
|
|
|
|
|
|
|
|
|
cmake -B "./$build_dir" -DCMAKE_BUILD_TYPE=Debug -DGGML_CUDA=1 -DLLAMA_CURL=1 || abort "Failed to build environment" |
|
pushd "$build_dir" |
|
make -j || abort "Failed to compile" |
|
popd > /dev/null || exit 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf "\n\nGathering tests that fit REGEX: ${test_suite} ...\n" |
|
pushd "$build_dir" |
|
tests=($(ctest -R ${test_suite} -V -N | grep -E " +Test +#[0-9]+*" | cut -d':' -f2 | awk '{$1=$1};1')) |
|
if [ ${#tests[@]} -eq 0 ]; then |
|
abort "No tests available... check your compilation process..." |
|
fi |
|
popd > /dev/null || exit 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ -z $test_number ]; then |
|
|
|
printf "Which test would you like to debug?\n" |
|
id=0 |
|
for s in "${tests[@]}" |
|
do |
|
echo "Test# ${id}" |
|
echo " $s" |
|
((id++)) |
|
done |
|
|
|
|
|
printf "\nRun test#? " |
|
read test_number |
|
|
|
else |
|
printf "\nUser Already Requested #${test_number}\n" |
|
|
|
fi |
|
|
|
|
|
pushd "$build_dir" |
|
sIFS=$IFS |
|
IFS=$'\n' |
|
test_args=($(ctest -R ${test_suite} -V -N | grep "Test command" | cut -d':' -f3 | awk '{$1=$1};1' )) |
|
IFS=$sIFS |
|
popd > /dev/null || exit 1 |
|
|
|
|
|
single_test_name="${tests[test_number]}" |
|
single_test_command="${test_args[test_number]}" |
|
|
|
|
|
|
|
|
|
|
|
printf "${magenta}Running Test #${test_number}: ${single_test_name}${normal}\n" |
|
printf "${cyan}single_test_command: ${single_test_command}${normal}\n" |
|
|
|
if [ "$gdb_mode" = "true" ]; then |
|
|
|
pushd "$repo_root" || exit 1 |
|
eval "gdb --args ${single_test_command}" |
|
popd > /dev/null || exit 1 |
|
|
|
else |
|
|
|
pushd "$repo_root" || exit 1 |
|
eval "${single_test_command}" |
|
exit_code=$? |
|
popd > /dev/null || exit 1 |
|
|
|
|
|
printf "${blue}Ran Test #${test_number}: ${single_test_name}${normal}\n" |
|
printf "${yellow}Command: ${single_test_command}${normal}\n" |
|
if [ $exit_code -eq 0 ]; then |
|
printf "${green}TEST PASS${normal}\n" |
|
else |
|
printf "${red}TEST FAIL${normal}\n" |
|
fi |
|
|
|
fi |
|
|
|
|
|
popd > /dev/null || exit 1 |
|
|