#!/usr/bin/env bash

#  Copyright 2020-2021 Couchbase, Inc.
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

PROJECT_ROOT="$( cd "$(dirname "$0")/.." >/dev/null 2>&1 ; pwd -P )"

echo "HOSTNAME=${HOSTNAME}"
echo "NODE_NAME=${NODE_NAME}"
echo "CONTAINER_TAG=${CONTAINER_TAG}"
echo "JENKINS_SLAVE_LABELS=${JENKINS_SLAVE_LABELS}"
echo "NODE_LABELS=${NODE_LABELS}"
echo "TEST_DEPLOYMENT_TYPE=${TEST_DEPLOYMENT_TYPE}"

CB_CTEST=${CB_CTEST:-$(which ctest)}
CB_CTEST_EXTRAS=${CB_CTEST_EXTRAS:-""}
CB_SANITIZER=${CB_SANITIZER:-""}

echo "CB_CTEST=${CB_CTEST}"

set -xu

BUILD_DIR="${PROJECT_ROOT}/cmake-build-tests"
if [ "x${CB_SANITIZER}" != "x" ]; then
    BUILD_DIR="${BUILD_DIR}-${CB_SANITIZER}"
fi
if [ "x${CB_SANITIZER}" = "xvalgrind" ]; then
    CB_CTEST_EXTRAS="--test-action memcheck"
    export TEST_USE_WAN_DEVELOPMENT_PROFILE=yes
fi

cd "${BUILD_DIR}"

CB_USE_GOCAVES=${CB_USE_GOCAVES:-""}
GOCAVES_PID=
GOCAVES_CONNECTION_STRING=
if [ "$CB_USE_GOCAVES" = "yes" -o "$CB_USE_GOCAVES" = "1" ]
then
    GOCAVES=
    case "$(uname -sm)" in
        "Darwin x86_64")
            GOCAVES="gocaves-macos"
            ;;

        "Darwin arm64")
            GOCAVES="gocaves-macos-arm64"
            ;;

        "Linux x86_64")
            GOCAVES="gocaves-linux-amd64"
            ;;

        "Linux aarch64")
            GOCAVES="gocaves-linux-arm64"
            ;;
    esac
    echo "GOCAVES=${GOCAVES}"
    if [ "${GOCAVES}x" != "x" ]
    then
        GOCAVES_VERSION="v0.0.1-78"
        echo "GOCAVES_VERSION=${GOCAVES_VERSION}"
        GOCAVES_PATH="${BUILD_DIR}/${GOCAVES}-${GOCAVES_VERSION}"
        if [ ! -e "${GOCAVES_PATH}" ]
        then
            curl -L -o "${GOCAVES_PATH}" https://github.com/couchbaselabs/gocaves/releases/download/${GOCAVES_VERSION}/${GOCAVES}
            chmod u+x "${GOCAVES_PATH}"
        fi
        ${GOCAVES_PATH} -mock-only > gocaves.txt 2>&1 &
        sleep 1
        GOCAVES_PID=$!
        GOCAVES_CONNECTION_STRING=$(grep -o 'couchbase://[^"]\+' gocaves.txt)
        echo "GOCAVES_CONNECTION_STRING=${GOCAVES_CONNECTION_STRING}"
        if [ ! -z "${GOCAVES_CONNECTION_STRING}" ]
        then
            export TEST_CONNECTION_STRING="${GOCAVES_CONNECTION_STRING}"
            export TEST_USE_GOCAVES=1
            trap "kill -9 ${GOCAVES_PID}" SIGINT SIGTERM
        fi
    fi
fi

[ -f /proc/sys/kernel/core_pattern ] && cat /proc/sys/kernel/core_pattern
if [ -e /usr/bin/apport-unpack ]
then
    mkdir -p $HOME/.config/apport
    cat <<EOF >$HOME/.config/apport/settings
[main]
unpackaged=true
EOF
fi

ulimit -c unlimited

export TEST_CONNECTION_STRING="${TEST_CONNECTION_STRING//cluster.crt/${PROJECT_ROOT}/cluster.crt}"
${CB_CTEST} ${CB_CTEST_EXTRAS} --output-on-failure --label-regex 'integration|unit' --output-junit results.xml
STATUS=$?

if [ ! -z "${GOCAVES_PID}" ]
then
    kill -9 ${GOCAVES_PID}
fi

if [ "x${STATUS}" != "x0" ]
then
    if [ -e /usr/bin/coredumpctl ]
    then
        /usr/bin/coredumpctl list --no-pager --json=pretty
        executable="$(coredumpctl --json=pretty list | jq -r .[-1].exe)"
        if [ -f "${executable}" ]
        then
            file "${executable}"
            ldd "${executable}"
        fi
        /usr/bin/coredumpctl -1 info
    elif [ -e /usr/bin/apport-unpack ]
    then
        for crash in /var/crash/*
        do
           if [ -f $crash ]
           then
             echo $crash
             /usr/bin/apport-unpack $crash /tmp/the_crash/
             executable=$(cat /tmp/the_crash/ExecutablePath)
             if [ -f "${executable}" ]
             then
                 file "${executable}"
                 ldd "${executable}"
             fi
             gdb $executable /tmp/the_crash/CoreDump --batch -ex "thread apply all bt"
             rm -rf $crash /tmp/the_crash
           fi
        done
    fi
    for core in /tmp/core.* "${PWD}/{vg,}core*"
    do
        if [ -f $core ]
        then
            echo $core
            executable=$(file $core | ruby -e "print ARGF.read[/execfn: '([^']+)'/, 1]")
            echo $executable
             if [ -f "${executable}" ]
             then
                 file "${executable}"
                 ldd "${executable}"
             fi
            gdb $executable $core --batch -ex "thread apply all bt"
            rm -f $core
        fi
    done
fi

exit $STATUS
