#!/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 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 "\") ]]; 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