#!/usr/bin/env bash

# This is the Unix equivalent of build-and-run-test.cmd
# It is invoked by each test's bash script. The reason it's called corerun is that
# the unix CoreCLR tests don't have a custom runner override environment variable.
# See issue https://github.com/dotnet/coreclr/issues/9007

export TestExecutable=$1
export TestFileName=${TestExecutable%.*}

source "$CoreRT_TestRoot/coredump_handling.sh"

if [[ $CoreRT_EnableCoreDumps == 1 ]]; then
    set_up_core_dump_generation
fi

cp $CoreRT_TestRoot/CoreCLR/Test.csproj .

__msbuild_dir=${CoreRT_TestRoot}/../Tools
echo ${__msbuild_dir}/msbuild.sh /m /p:IlcPath=${CoreRT_ToolchainDir} /p:Configuration=${CoreRT_BuildType} Test.csproj
${__msbuild_dir}/msbuild.sh /m /p:IlcPath=${CoreRT_ToolchainDir} /p:Configuration=${CoreRT_BuildType} Test.csproj

if [[ $CoreRT_EnableCoreDumps == 1 ]]; then
    # Handle any core files generated when running the test IL through the toolchain.
    inspect_and_delete_core_files $CoreRT_ToolchainDir/corerun "$CoreRT_ToolchainDir"
fi

# Remove the test executable from the arg list so it isn't passed to test execution
shift

testExtRepo=$( dirname ${CoreRT_TestRoot} )/tests_downloaded/CoreCLR/
nativeArtifactRepo=${testExtRepo}native/
dirSuffix=$(dirname ${PWD#$testExtRepo})/
nativeDir=${nativeArtifactRepo}tests/src/${dirSuffix}

# In OSX we copy the native component to the directory where the exectuable resides.
# However, in Linux dlopen doesn't seem to look for current directory to resolve the dynamic library.
# So instead we point LD_LIBRARY_PATH to the directory where the native component is.
if [ -e ${nativeDir} ]; then
    if [ "${CoreRT_BuildOS}" == "OSX" ]; then
        echo "Copying native component from :"${nativeDir}
        cp ${nativeDir}*.dylib  native/ 2>/dev/null
    fi
    if [ "${CoreRT_BuildOS}" == "Linux" ]; then
        LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${nativeDir}
        export LD_LIBRARY_PATH
    fi
fi

if [[ ! -f native/${TestFileName} ]]; then
    echo "ERROR: Native binary not found. Unable to run test."
    exit -1
fi

pushd native/
./${TestFileName} "$@"
testScriptExitCode=$?
popd

if [[ $CoreRT_EnableCoreDumps == 1 ]]; then
    # Handle any core files generated when running the test.
    inspect_and_delete_core_files native/$TestFileName "$CoreRT_ToolchainDir"
fi

# Clean up test binary artifacts to save space
rm -r native 2>/dev/null

exit $testScriptExitCode
