summaryrefslogtreecommitdiffstats
path: root/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/tests/wamr-test-suites/test_wamr.sh
diff options
context:
space:
mode:
Diffstat (limited to 'fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/tests/wamr-test-suites/test_wamr.sh')
-rwxr-xr-xfluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/tests/wamr-test-suites/test_wamr.sh882
1 files changed, 882 insertions, 0 deletions
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/tests/wamr-test-suites/test_wamr.sh b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/tests/wamr-test-suites/test_wamr.sh
new file mode 100755
index 000000000..67868b9c9
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/tests/wamr-test-suites/test_wamr.sh
@@ -0,0 +1,882 @@
+#!/usr/bin/env bash
+
+#
+# Copyright (C) 2019 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+
+function DEBUG() {
+ [[ -n $(env | grep "\<DEBUG\>") ]] && $@
+}
+DEBUG set -xv pipefail
+
+function help()
+{
+ echo "test_wamr.sh [options]"
+ echo "-c clean previous test results, not start test"
+ echo "-s {suite_name} test only one suite (spec|wasi_certification)"
+ echo "-m set compile target of iwasm(x86_64|x86_32|armv7_vfp|thumbv7_vfp|riscv64_lp64d|riscv64_lp64)"
+ echo "-t set compile type of iwasm(classic-interp|fast-interp|jit|aot|fast-jit|multi-tier-jit)"
+ echo "-M enable multi module feature"
+ echo "-p enable multi thread feature"
+ echo "-S enable SIMD feature"
+ echo "-G enable GC feature"
+ echo "-X enable XIP feature"
+ echo "-x test SGX"
+ echo "-w enable WASI threads"
+ echo "-b use the wabt binary release package instead of compiling from the source code"
+ echo "-g build iwasm with debug version"
+ echo "-v enable GC heap verification"
+ echo "-P run the spec test parallelly"
+ echo "-Q enable qemu"
+ echo "-F set the firmware path used by qemu"
+ echo "-C enable code coverage collect"
+}
+
+OPT_PARSED=""
+WABT_BINARY_RELEASE="NO"
+#default type
+TYPE=("classic-interp" "fast-interp" "jit" "aot" "fast-jit" "multi-tier-jit")
+#default target
+TARGET="X86_64"
+ENABLE_WASI_THREADS=0
+ENABLE_MULTI_MODULE=0
+ENABLE_MULTI_THREAD=0
+COLLECT_CODE_COVERAGE=0
+ENABLE_SIMD=0
+ENABLE_GC=0
+ENABLE_XIP=0
+ENABLE_DEBUG_VERSION=0
+ENABLE_GC_HEAP_VERIFY=0
+#unit test case arrary
+TEST_CASE_ARR=()
+SGX_OPT=""
+PLATFORM=$(uname -s | tr A-Z a-z)
+PARALLELISM=0
+ENABLE_QEMU=0
+QEMU_FIRMWARE=""
+WASI_TESTSUITE_COMMIT="aca78d919355ae00af141e6741a439039615b257"
+
+while getopts ":s:cabgvt:m:MCpSXxwPGQF:" opt
+do
+ OPT_PARSED="TRUE"
+ case $opt in
+ s)
+ TEST_CASE_ARR+=($OPTARG)
+ # get next suite if there are multiple vaule in -s
+ eval "nxarg=\${$((OPTIND))}"
+ # just get test cases, loop until the next symbol '-'
+ # IN ====> -s spec wasi unit -t fast-classic
+ # GET ====> spec wasi unit
+ while [[ "${nxarg}" != -* && ${nxarg} ]];
+ do
+ TEST_CASE_ARR+=(${nxarg})
+ OPTIND=$((OPTIND+1))
+ eval "nxarg=\${$((OPTIND))}"
+ done
+ echo "test following cases: ${TEST_CASE_ARR[@]}"
+ ;;
+ c)
+ read -t 5 -p "Are you sure to delete all reports. y/n " cmd
+ if [[ $cmd == "y" && $(ls -A workspace/report) ]];then
+ rm -fr workspace/report/*
+ rm -fr /tmp/*.wasm /tmp/*.wast /tmp/*.aot
+ echo "cleaned all reports and temp files"
+ fi
+ exit 0;;
+ a)
+ TEST_ALL_AOT_RUNTIME="all"
+ echo "test all runtimes in sightglass_aot"
+ ;;
+ b)
+ WABT_BINARY_RELEASE="YES"
+ echo "use a WABT binary release instead of compiling from source code"
+ ;;
+ t)
+ echo "set compile type of wamr " ${OPTARG}
+ if [[ ${OPTARG} != "classic-interp" && ${OPTARG} != "fast-interp" \
+ && ${OPTARG} != "jit" && ${OPTARG} != "aot"
+ && ${OPTARG} != "fast-jit" && ${OPTARG} != "multi-tier-jit" ]]; then
+ echo "*----- please varify a type of compile when using -t! -----*"
+ help
+ exit 1
+ fi
+
+ TYPE=(${OPTARG})
+ ;;
+ m)
+ echo "set compile target of wamr" ${OPTARG}
+ TARGET=${OPTARG^^} # set target to uppercase if input x86_32 or x86_64 --> X86_32 and X86_64
+ ;;
+ w)
+ echo "enable WASI threads"
+ ENABLE_WASI_THREADS=1
+ ;;
+ M)
+ echo "enable multi module feature"
+ ENABLE_MULTI_MODULE=1
+ ;;
+ C)
+ echo "enable code coverage"
+ COLLECT_CODE_COVERAGE=1
+ ;;
+ p)
+ echo "enable multi thread feature"
+ ENABLE_MULTI_THREAD=1
+ ;;
+ S)
+ echo "enable SIMD feature"
+ ENABLE_SIMD=1
+ ;;
+ X)
+ echo "enable XIP feature"
+ ENABLE_XIP=1
+ ;;
+ x)
+ echo "test SGX"
+ SGX_OPT="--sgx"
+ ;;
+ g)
+ echo "enable build iwasm with debug version"
+ ENABLE_DEBUG_VERSION=1
+ ;;
+ v)
+ echo "enable GC heap verification"
+ ENABLE_GC_HEAP_VERIFY=1
+ ;;
+ G)
+ echo "enable GC feature"
+ ENABLE_GC=1
+ ;;
+ P)
+ PARALLELISM=1
+ ;;
+ Q)
+ echo "enable QEMU"
+ ENABLE_QEMU=1
+ ;;
+ F)
+ echo "QEMU firmware" ${OPTARG}
+ QEMU_FIRMWARE=${OPTARG}
+ ;;
+ ?)
+ help
+ exit 1;;
+ esac
+done
+
+# Parameters are not allowed, use options instead
+if [ -z "$OPT_PARSED" ];
+then
+ if [ ! -z "$1" ];
+ then
+ help
+ exit 1
+ fi
+fi
+
+mkdir -p workspace
+cd workspace
+
+readonly WORK_DIR=$PWD
+
+readonly DATE=$(date +%Y-%m-%d_%H:%M:%S)
+readonly REPORT_DIR=${WORK_DIR}/report/${DATE}
+mkdir -p ${REPORT_DIR}
+
+readonly WAMR_DIR=${WORK_DIR}/../../..
+
+if [[ ${SGX_OPT} == "--sgx" ]];then
+ readonly IWASM_LINUX_ROOT_DIR="${WAMR_DIR}/product-mini/platforms/linux-sgx"
+ readonly IWASM_CMD="${WAMR_DIR}/product-mini/platforms/linux-sgx/enclave-sample/iwasm"
+else
+ readonly IWASM_LINUX_ROOT_DIR="${WAMR_DIR}/product-mini/platforms/${PLATFORM}"
+ readonly IWASM_CMD="${WAMR_DIR}/product-mini/platforms/${PLATFORM}/build/iwasm"
+fi
+
+readonly WAMRC_CMD="${WAMR_DIR}/wamr-compiler/build/wamrc"
+
+readonly CLASSIC_INTERP_COMPILE_FLAGS="\
+ -DWAMR_BUILD_TARGET=${TARGET} \
+ -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_INTERP=0 \
+ -DWAMR_BUILD_JIT=0 -DWAMR_BUILD_AOT=0 \
+ -DWAMR_BUILD_SPEC_TEST=1 \
+ -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE}"
+
+readonly FAST_INTERP_COMPILE_FLAGS="\
+ -DWAMR_BUILD_TARGET=${TARGET} \
+ -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_INTERP=1 \
+ -DWAMR_BUILD_JIT=0 -DWAMR_BUILD_AOT=0 \
+ -DWAMR_BUILD_SPEC_TEST=1 \
+ -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE}"
+
+# jit: report linking error if set COLLECT_CODE_COVERAGE,
+# now we don't collect code coverage of jit type
+readonly ORC_EAGER_JIT_COMPILE_FLAGS="\
+ -DWAMR_BUILD_TARGET=${TARGET} \
+ -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_FAST_INTERP=0 \
+ -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_AOT=1 \
+ -DWAMR_BUILD_LAZY_JIT=0 \
+ -DWAMR_BUILD_SPEC_TEST=1 \
+ -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE}"
+
+readonly ORC_LAZY_JIT_COMPILE_FLAGS="\
+ -DWAMR_BUILD_TARGET=${TARGET} \
+ -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_FAST_INTERP=0 \
+ -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_AOT=1 \
+ -DWAMR_BUILD_LAZY_JIT=1 \
+ -DWAMR_BUILD_SPEC_TEST=1 \
+ -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE}"
+
+readonly AOT_COMPILE_FLAGS="\
+ -DWAMR_BUILD_TARGET=${TARGET} \
+ -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_FAST_INTERP=0 \
+ -DWAMR_BUILD_JIT=0 -DWAMR_BUILD_AOT=1 \
+ -DWAMR_BUILD_SPEC_TEST=1 \
+ -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE}"
+
+readonly FAST_JIT_COMPILE_FLAGS="\
+ -DWAMR_BUILD_TARGET=${TARGET} \
+ -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_INTERP=0 \
+ -DWAMR_BUILD_JIT=0 -DWAMR_BUILD_AOT=0 \
+ -DWAMR_BUILD_FAST_JIT=1 \
+ -DWAMR_BUILD_SPEC_TEST=1 \
+ -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE}"
+
+readonly MULTI_TIER_JIT_COMPILE_FLAGS="\
+ -DWAMR_BUILD_TARGET=${TARGET} \
+ -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_INTERP=0 \
+ -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_JIT=1 \
+ -DWAMR_BUILD_SPEC_TEST=1 \
+ -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE}"
+
+readonly COMPILE_FLAGS=(
+ "${CLASSIC_INTERP_COMPILE_FLAGS}"
+ "${FAST_INTERP_COMPILE_FLAGS}"
+ "${ORC_EAGER_JIT_COMPILE_FLAGS}"
+ "${ORC_LAZY_JIT_COMPILE_FLAGS}"
+ "${AOT_COMPILE_FLAGS}"
+ "${FAST_JIT_COMPILE_FLAGS}"
+ "${MULTI_TIER_JIT_COMPILE_FLAGS}"
+ )
+
+function unit_test()
+{
+ echo "Now start unit tests"
+
+ cd ${WORK_DIR}
+ rm -fr unittest-build && mkdir unittest-build
+ cd unittest-build
+
+ echo "Build unit test"
+ touch ${REPORT_DIR}/unit_test_report.txt
+ cmake ${WORK_DIR}/../../unit -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE}
+ make -j
+ make test | tee -a ${REPORT_DIR}/unit_test_report.txt
+
+ echo "Finish unit tests"
+}
+
+function sightglass_test()
+{
+ echo "Now start sightglass benchmark tests"
+
+ cd ${WORK_DIR}/../sightglass/benchmarks
+
+ # build iwasm first
+ if [[ $1 == "classic-interp" || $1 == "fast-interp" ]];then
+ ./test_interp.sh ${SGX_OPT}
+ cp report.txt ${REPORT_DIR}/sightglass_$1_test_report.txt
+ fi
+
+ if [[ $1 == "aot" ]];then
+ ./test_aot.sh ${SGX_OPT}
+ cp report.txt ${REPORT_DIR}/sightglass_aot_test_report.txt
+ fi
+
+ if [[ $1 == "jit" ]];then
+ [[ $TEST_ALL_AOT_RUNTIME ]] && ./test_aot.sh ${TEST_ALL_AOT_RUNTIME} ${SGX_OPT} \
+ || ./test_aot.sh jit ${SGX_OPT}
+ cp report.txt ${REPORT_DIR}/sightglass_jit_test_report.txt
+ fi
+
+ echo "Finish sightglass benchmark tests"
+}
+
+# TODO: with iwasm only
+function spec_test()
+{
+ echo "Now start spec tests"
+ touch ${REPORT_DIR}/spec_test_report.txt
+
+ cd ${WORK_DIR}
+ if [ ! -d "spec" ];then
+ echo "spec not exist, clone it from github"
+ git clone -b master --single-branch https://github.com/WebAssembly/spec
+ fi
+
+ pushd spec
+
+ # restore and clean everything
+ git reset --hard HEAD
+
+ # update basic test cases
+ echo "update spec test cases"
+ git fetch origin main
+ # restore from XX_ignore_cases.patch
+ # resotre branch
+ git checkout -B main
+ # [spec] Update note on module initialization trapping (#1493)
+ git reset --hard 044d0d2e77bdcbe891f7e0b9dd2ac01d56435f0b
+ git apply ../../spec-test-script/ignore_cases.patch
+ if [[ ${ENABLE_SIMD} == 1 ]]; then
+ git apply ../../spec-test-script/simd_ignore_cases.patch
+ fi
+
+ # udpate thread cases
+ if [ ${ENABLE_MULTI_THREAD} == 1 ]; then
+ echo "checkout spec for threads proposal"
+ if [[ -z $(git remote -v | grep "\<threads\>") ]]; then
+ git remote add threads https://github.com/WebAssembly/threads
+ fi
+
+ # fetch spec for threads proposal
+ git fetch threads
+ # Fix error in Web embedding desc for atomic.notify (#185)
+ git reset --hard 85b562cd6805947876ec5e8b975ab0127c55a0a2
+ git checkout threads/main
+
+ git apply ../../spec-test-script/thread_proposal_ignore_cases.patch
+ git apply ../../spec-test-script/thread_proposal_fix_atomic_case.patch
+ fi
+
+ # update GC cases
+ if [[ ${ENABLE_GC} == 1 ]]; then
+ echo "checkout spec for GC proposal"
+
+ popd
+ rm -fr spec
+ # check spec test cases for GC
+ git clone -b main --single-branch https://github.com/WebAssembly/gc.git spec
+ pushd spec
+
+ git restore . && git clean -ffd .
+ # Sync constant expression descriptions
+ git reset --hard 62beb94ddd41987517781732f17f213d8b866dcc
+ git apply ../../spec-test-script/gc_ignore_cases.patch
+
+ echo "compile the reference intepreter"
+ pushd interpreter
+ make opt
+ popd
+ fi
+
+ popd
+ echo $(pwd)
+
+ if [ ${WABT_BINARY_RELEASE} == "YES" ]; then
+ echo "download a binary release and install"
+ local WAT2WASM=${WORK_DIR}/wabt/out/gcc/Release/wat2wasm
+ if [ ! -f ${WAT2WASM} ]; then
+ case ${PLATFORM} in
+ linux)
+ WABT_PLATFORM=ubuntu
+ ;;
+ darwin)
+ WABT_PLATFORM=macos
+ ;;
+ *)
+ echo "wabt platform for ${PLATFORM} in unknown"
+ exit 1
+ ;;
+ esac
+ if [ ! -f /tmp/wabt-1.0.31-${WABT_PLATFORM}.tar.gz ]; then
+ wget \
+ https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-${WABT_PLATFORM}.tar.gz \
+ -P /tmp
+ fi
+
+ cd /tmp \
+ && tar zxf wabt-1.0.31-${WABT_PLATFORM}.tar.gz \
+ && mkdir -p ${WORK_DIR}/wabt/out/gcc/Release/ \
+ && install wabt-1.0.31/bin/wa* ${WORK_DIR}/wabt/out/gcc/Release/ \
+ && cd -
+ fi
+ else
+ echo "download source code and compile and install"
+ if [ ! -d "wabt" ];then
+ echo "wabt not exist, clone it from github"
+ git clone --recursive https://github.com/WebAssembly/wabt
+ fi
+ echo "upate wabt"
+ cd wabt
+ git pull
+ git reset --hard origin/main
+ cd ..
+ make -C wabt gcc-release -j 4
+ fi
+
+ ln -sf ${WORK_DIR}/../spec-test-script/all.py .
+ ln -sf ${WORK_DIR}/../spec-test-script/runtest.py .
+
+ local ARGS_FOR_SPEC_TEST=""
+
+ # multi-module only enable in interp mode
+ if [[ 1 == ${ENABLE_MULTI_MODULE} ]]; then
+ if [[ $1 == 'classic-interp' || $1 == 'fast-interp' ]]; then
+ ARGS_FOR_SPEC_TEST+="-M "
+ fi
+ fi
+
+ # sgx only enable in interp mode and aot mode
+ if [[ ${SGX_OPT} == "--sgx" ]];then
+ if [[ $1 == 'classic-interp' || $1 == 'fast-interp' || $1 == 'aot' ]]; then
+ ARGS_FOR_SPEC_TEST+="-x "
+ fi
+ fi
+
+ # simd only enable in jit mode and aot mode
+ if [[ ${ENABLE_SIMD} == 1 ]]; then
+ if [[ $1 == 'jit' || $1 == 'aot' ]]; then
+ ARGS_FOR_SPEC_TEST+="-S "
+ fi
+ fi
+
+ if [[ ${ENABLE_MULTI_THREAD} == 1 ]]; then
+ ARGS_FOR_SPEC_TEST+="-p "
+ fi
+
+ if [[ ${ENABLE_XIP} == 1 ]]; then
+ ARGS_FOR_SPEC_TEST+="-X "
+ fi
+
+ # set the current running target
+ ARGS_FOR_SPEC_TEST+="-m ${TARGET} "
+
+ # require warmc only in aot mode
+ if [[ $1 == 'aot' ]]; then
+ ARGS_FOR_SPEC_TEST+="-t "
+ fi
+
+ if [[ ${PARALLELISM} == 1 ]]; then
+ ARGS_FOR_SPEC_TEST+="--parl "
+ fi
+
+ if [[ ${ENABLE_GC} == 1 ]]; then
+ ARGS_FOR_SPEC_TEST+="--gc "
+ fi
+
+ if [[ ${ENABLE_QEMU} == 1 ]]; then
+ ARGS_FOR_SPEC_TEST+="--qemu "
+ ARGS_FOR_SPEC_TEST+="--qemu-firmware ${QEMU_FIRMWARE} "
+ fi
+
+ # set log directory
+ ARGS_FOR_SPEC_TEST+="--log ${REPORT_DIR}"
+
+ cd ${WORK_DIR}
+ echo "python3 ./all.py ${ARGS_FOR_SPEC_TEST} | tee -a ${REPORT_DIR}/spec_test_report.txt"
+ python3 ./all.py ${ARGS_FOR_SPEC_TEST} | tee -a ${REPORT_DIR}/spec_test_report.txt
+ if [[ ${PIPESTATUS[0]} -ne 0 ]];then
+ echo -e "\nspec tests FAILED" | tee -a ${REPORT_DIR}/spec_test_report.txt
+ exit 1
+ fi
+ cd -
+
+ echo -e "\nFinish spec tests" | tee -a ${REPORT_DIR}/spec_test_report.txt
+}
+
+function wasi_test()
+{
+ echo "Now start wasi tests"
+ touch ${REPORT_DIR}/wasi_test_report.txt
+
+ cd ${WORK_DIR}/../../wasi
+ [[ $1 != "aot" ]] && \
+ python wasi_test.py --interpreter ${IWASM_CMD} ${SGX_OPT}\
+ | tee ${REPORT_DIR}/wasi_test_report.txt \
+ || \
+ python wasi_test.py --aot --aot-compiler ${WAMRC_CMD} ${SGX_OPT}\
+ --interpreter ${IWASM_CMD} \
+ | tee ${REPORT_DIR}/wasi_test_report.txt
+ echo "Finish wasi tests"
+}
+
+function wasi_certification_test()
+{
+ echo "Now start wasi certification tests"
+
+ cd ${WORK_DIR}
+ if [ ! -d "wasi-testsuite" ]; then
+ echo "wasi not exist, clone it from github"
+ git clone -b prod/testsuite-all \
+ --single-branch https://github.com/WebAssembly/wasi-testsuite.git
+ fi
+ cd wasi-testsuite
+ git reset --hard ${WASI_TESTSUITE_COMMIT}
+
+ bash ../../wasi-test-script/run_wasi_tests.sh $1 $TARGET \
+ | tee -a ${REPORT_DIR}/wasi_test_report.txt
+ ret=${PIPESTATUS[0]}
+
+ if [[ ${ret} -ne 0 ]];then
+ echo -e "\nwasi tests FAILED" | tee -a ${REPORT_DIR}/wasi_test_report.txt
+ exit 1
+ fi
+ echo -e "\nFinish wasi tests" | tee -a ${REPORT_DIR}/wasi_test_report.txt
+}
+
+function polybench_test()
+{
+ echo "Now start polybench tests"
+
+ cd ${WORK_DIR}/../polybench
+ if [[ $1 == "aot" || $1 == "jit" ]];then
+ ./build.sh AOT ${SGX_OPT}
+ ./test_aot.sh $1 ${SGX_OPT}
+ else
+ ./build.sh
+ ./test_interp.sh ${SGX_OPT}
+ fi
+ cp report.txt ${REPORT_DIR}/polybench_$1_test_report.txt
+
+ echo "Finish polybench tests"
+}
+
+function libsodium_test()
+{
+ echo "Now start libsodium tests"
+
+ cd ${WORK_DIR}/../libsodium
+ if [[ $1 == "aot" || $1 == "jit" ]];then
+ ./build.sh ${SGX_OPT}
+ ./test_aot.sh $1 ${SGX_OPT}
+ else
+ ./test_interp.sh ${SGX_OPT}
+ fi
+ cp report.txt ${REPORT_DIR}/libsodium_$1_test_report.txt
+
+ echo "Finish libsodium tests"
+}
+
+function malformed_test()
+{
+ # build iwasm firstly
+ cd ${WORK_DIR}/../../malformed
+ ./malformed_test.py --run ${IWASM_CMD} | tee ${REPORT_DIR}/malfomed_$1_test_report.txt
+}
+
+function collect_standalone()
+{
+ if [[ ${COLLECT_CODE_COVERAGE} == 1 ]]; then
+ pushd ${WORK_DIR} > /dev/null 2>&1
+
+ CODE_COV_FILE=""
+ if [[ -z "${CODE_COV_FILE}" ]]; then
+ CODE_COV_FILE="${WORK_DIR}/wamr.lcov"
+ else
+ CODE_COV_FILE="${CODE_COV_FILE}"
+ fi
+
+ STANDALONE_DIR=${WORK_DIR}/../../standalone
+
+ echo "Collect code coverage of standalone dump-call-stack"
+ ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/dump-call-stack/build"
+ echo "Collect code coverage of standalone dump-mem-profiling"
+ ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/dump-mem-profiling/build"
+ echo "Collect code coverage of standalone dump-perf-profiling"
+ ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/dump-perf-profiling/build"
+ if [[ $1 == "aot" ]]; then
+ echo "Collect code coverage of standalone pad-test"
+ ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/pad-test/build"
+ fi
+ echo "Collect code coverage of standalone test-invoke-native"
+ ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/test-invoke-native/build"
+ echo "Collect code coverage of standalone test-running-modes"
+ ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/test-running-modes/build"
+ echo "Collect code coverage of standalone test-running-modes/c-embed"
+ ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/test-running-modes/c-embed/build"
+ echo "Collect code coverage of standalone test-ts2"
+ ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/test-ts2/build"
+
+ popd > /dev/null 2>&1
+ fi
+}
+
+function standalone_test()
+{
+ if [[ ${COLLECT_CODE_COVERAGE} == 1 ]]; then
+ export COLLECT_CODE_COVERAGE=1
+ fi
+
+ cd ${WORK_DIR}/../../standalone
+
+ args="--$1"
+
+ [[ ${SGX_OPT} == "--sgx" ]] && args="$args --sgx" || args="$args --no-sgx"
+
+ [[ ${ENABLE_MULTI_THREAD} == 1 ]] && args="$args --thread" || args="$args --no-thread"
+
+ [[ ${ENABLE_SIMD} == 1 ]] && args="$args --simd" || args="$args --no-simd"
+
+ args="$args ${TARGET}"
+
+ ./standalone.sh $args | tee ${REPORT_DIR}/standalone_$1_test_report.txt
+
+ collect_standalone "$1"
+}
+
+function build_iwasm_with_cfg()
+{
+ echo "Build iwasm with compile flags with " $* " for spec test" \
+ | tee -a ${REPORT_DIR}/spec_test_report.txt
+
+ if [[ ${SGX_OPT} == "--sgx" ]];then
+ cd ${WAMR_DIR}/product-mini/platforms/linux-sgx \
+ && if [ -d build ]; then rm -rf build/*; else mkdir build; fi \
+ && cd build \
+ && cmake $* .. \
+ && make -j 4
+ cd ${WAMR_DIR}/product-mini/platforms/linux-sgx/enclave-sample \
+ && make clean \
+ && make SPEC_TEST=1
+ else
+ cd ${WAMR_DIR}/product-mini/platforms/${PLATFORM} \
+ && if [ -d build ]; then rm -rf build/*; else mkdir build; fi \
+ && cd build \
+ && cmake $* .. \
+ && make -j 4
+ fi
+
+ if [ "$?" != 0 ];then
+ echo -e "build iwasm failed"
+ exit 1
+ fi
+}
+
+function build_wamrc()
+{
+ if [[ $TARGET == "ARMV7_VFP" || $TARGET == "THUMBV7_VFP"
+ || $TARGET == "RISCV32" || $TARGET == "RISCV32_ILP32" || $TARGET == "RISCV32_ILP32D"
+ || $TARGET == "RISCV64" || $TARGET == "RISCV64_LP64D" || $TARGET == "RISCV64_LP64" ]];then
+ echo "suppose wamrc is already built"
+ return
+ fi
+
+ echo "Build wamrc for spec test under aot compile type"
+ cd ${WAMR_DIR}/wamr-compiler \
+ && ./build_llvm.sh \
+ && if [ -d build ]; then rm -r build/*; else mkdir build; fi \
+ && cd build \
+ && cmake .. -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE} \
+ && make -j 4
+}
+
+### Need to add a test suite?
+### The function name should be ${suite_name}_test
+# function xxx_test()
+# {
+#
+# }
+
+function collect_coverage()
+{
+ if [[ ${COLLECT_CODE_COVERAGE} == 1 ]]; then
+ ln -sf ${WORK_DIR}/../spec-test-script/collect_coverage.sh ${WORK_DIR}
+
+ CODE_COV_FILE=""
+ if [[ -z "${CODE_COV_FILE}" ]]; then
+ CODE_COV_FILE="${WORK_DIR}/wamr.lcov"
+ else
+ CODE_COV_FILE="${CODE_COV_FILE}"
+ fi
+
+ pushd ${WORK_DIR} > /dev/null 2>&1
+ echo "Collect code coverage of iwasm"
+ ./collect_coverage.sh ${CODE_COV_FILE} ${IWASM_LINUX_ROOT_DIR}/build
+ if [[ $1 == "llvm-aot" ]]; then
+ echo "Collect code coverage of wamrc"
+ ./collect_coverage.sh ${CODE_COV_FILE} ${WAMR_DIR}/wamr-compiler/build
+ fi
+ for suite in "${TEST_CASE_ARR[@]}"; do
+ if [[ ${suite} = "unit" ]]; then
+ echo "Collect code coverage of unit test"
+ ./collect_coverage.sh ${CODE_COV_FILE} ${WORK_DIR}/unittest-build
+ break
+ fi
+ done
+ popd > /dev/null 2>&1
+ else
+ echo "code coverage isn't collected"
+ fi
+}
+
+function trigger()
+{
+ local EXTRA_COMPILE_FLAGS=""
+ # default enabled features
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_BULK_MEMORY=1"
+
+ if [[ ${ENABLE_MULTI_MODULE} == 1 ]];then
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_MULTI_MODULE=1"
+ else
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_MULTI_MODULE=0"
+ fi
+
+ if [[ ${ENABLE_MULTI_THREAD} == 1 ]];then
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_LIB_PTHREAD=1"
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_REF_TYPES=0"
+ else
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_REF_TYPES=1"
+ fi
+
+ if [[ ${ENABLE_SIMD} == 1 ]]; then
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SIMD=1"
+ else
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SIMD=0"
+ fi
+
+ if [[ ${ENABLE_GC} == 1 ]]; then
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_GC=1"
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_REF_TYPES=1"
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_BULK_MEMORY=1"
+ fi
+
+ if [[ ${ENABLE_DEBUG_VERSION} == 1 ]]; then
+ EXTRA_COMPILE_FLAGS+=" -DCMAKE_BUILD_TYPE=Debug"
+ fi
+
+ if [[ ${ENABLE_GC_HEAP_VERIFY} == 1 ]]; then
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_GC_HEAP_VERIFY=1"
+ fi
+
+ if [[ ${ENABLE_WASI_THREADS} == 1 ]]; then
+ EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_LIB_WASI_THREADS=1"
+ fi
+
+ for t in "${TYPE[@]}"; do
+ case $t in
+ "classic-interp")
+ if [[ ${ENABLE_SIMD} == 1 ]]; then
+ echo "does not support SIMD in interp mode, bypass"
+ continue
+ fi
+
+ echo "work in classic-interp mode"
+ # classic-interp
+ BUILD_FLAGS="$CLASSIC_INTERP_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
+ if [[ ${ENABLE_QEMU} == 0 ]]; then
+ build_iwasm_with_cfg $BUILD_FLAGS
+ fi
+ for suite in "${TEST_CASE_ARR[@]}"; do
+ $suite"_test" classic-interp
+ done
+ collect_coverage classic-interp
+ ;;
+
+ "fast-interp")
+ if [[ ${ENABLE_SIMD} == 1 ]]; then
+ echo "does not support SIMD in interp mode, bypass"
+ continue
+ fi
+
+ echo "work in fast-interp mode"
+ # fast-interp
+ BUILD_FLAGS="$FAST_INTERP_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
+ if [[ ${ENABLE_QEMU} == 0 ]]; then
+ build_iwasm_with_cfg $BUILD_FLAGS
+ fi
+ for suite in "${TEST_CASE_ARR[@]}"; do
+ $suite"_test" fast-interp
+ done
+ collect_coverage fast-interp
+ ;;
+
+ "jit")
+ if [[ ${TARGET} == "X86_32" ]]; then
+ echo "does not support an X86_32 target in JIT mode, bypass"
+ continue
+ fi
+
+ echo "work in orc jit eager compilation mode"
+ BUILD_FLAGS="$ORC_EAGER_JIT_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
+ build_iwasm_with_cfg $BUILD_FLAGS
+ for suite in "${TEST_CASE_ARR[@]}"; do
+ $suite"_test" jit
+ done
+ collect_coverage llvm-jit
+
+ echo "work in orc jit lazy compilation mode"
+ BUILD_FLAGS="$ORC_EAGER_JIT_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
+ build_iwasm_with_cfg $BUILD_FLAGS
+ for suite in "${TEST_CASE_ARR[@]}"; do
+ $suite"_test" jit
+ done
+ collect_coverage llvm-jit
+ ;;
+
+ "aot")
+ echo "work in aot mode"
+ # aot
+ BUILD_FLAGS="$AOT_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
+ if [[ ${ENABLE_QEMU} == 0 ]]; then
+ build_iwasm_with_cfg $BUILD_FLAGS
+ fi
+ build_wamrc
+ for suite in "${TEST_CASE_ARR[@]}"; do
+ $suite"_test" aot
+ done
+ collect_coverage llvm-aot
+ ;;
+
+ "fast-jit")
+ echo "work in fast-jit mode"
+ # fast-jit
+ BUILD_FLAGS="$FAST_JIT_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
+ build_iwasm_with_cfg $BUILD_FLAGS
+ for suite in "${TEST_CASE_ARR[@]}"; do
+ $suite"_test" fast-jit
+ done
+ collect_coverage fast-jit
+ ;;
+
+ "multi-tier-jit")
+ echo "work in multi-tier-jit mode"
+ # multi-tier-jit
+ BUILD_FLAGS="$MULTI_TIER_JIT_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
+ build_iwasm_with_cfg $BUILD_FLAGS
+ for suite in "${TEST_CASE_ARR[@]}"; do
+ $suite"_test" multi-tier-jit
+ done
+ collect_coverage multi-tier-jit
+ ;;
+
+ *)
+ echo "unexpected mode, do nothing"
+ ;;
+ esac
+ done
+}
+
+# if collect code coverage, ignore -s, test all test cases.
+if [[ $TEST_CASE_ARR ]];then
+ trigger || (echo "TEST FAILED"; exit 1)
+else
+ # test all suite, ignore polybench and libsodium because of long time cost
+ TEST_CASE_ARR=("spec")
+ : '
+ if [[ $COLLECT_CODE_COVERAGE == 1 ]];then
+ # add polybench if collecting code coverage data
+ TEST_CASE_ARR+=("polybench")
+ # add libsodium if needed, which takes long time to run
+ TEST_CASE_ARR+=("libsodium")
+ fi
+ '
+ trigger || (echo "TEST FAILED"; exit 1)
+ # Add more suites here
+fi
+
+echo -e "Test finish. Reports are under ${REPORT_DIR}"
+DEBUG set +xv pipefail
+echo "TEST SUCCESSFUL"
+exit 0