run_wasi_tests.sh 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #!/bin/bash
  2. #
  3. # Copyright (C) 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
  4. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  5. #
  6. THIS_DIR=$(cd $(dirname $0) && pwd -P)
  7. readonly MODE=$1
  8. readonly TARGET=$2
  9. readonly TEST_FILTER=$3
  10. readonly WORK_DIR=$PWD
  11. if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
  12. readonly PLATFORM=windows
  13. readonly PYTHON_EXE=python
  14. # see https://github.com/pypa/virtualenv/commit/993ba1316a83b760370f5a3872b3f5ef4dd904c1
  15. readonly VENV_BIN_DIR=Scripts
  16. readonly IWASM_EXE=$(cygpath -m "${WORK_DIR}/../../../../product-mini/platforms/${PLATFORM}/build/RelWithDebInfo/iwasm.exe")
  17. else
  18. readonly PLATFORM=$(uname -s | tr A-Z a-z)
  19. readonly VENV_BIN_DIR=bin
  20. readonly PYTHON_EXE=python3
  21. readonly IWASM_EXE="${WORK_DIR}/../../../../product-mini/platforms/${PLATFORM}/build/iwasm"
  22. fi
  23. readonly WAMR_DIR="${WORK_DIR}/../../../.."
  24. readonly IWASM_CMD="${IWASM_EXE} \
  25. --allow-resolve=google-public-dns-a.google.com \
  26. --addr-pool=::1/128,127.0.0.1/32"
  27. readonly IWASM_CMD_STRESS="${IWASM_CMD} --max-threads=12"
  28. readonly WAMRC_CMD="${WORK_DIR}/../../../../wamr-compiler/build/wamrc"
  29. readonly C_TESTS="tests/c/testsuite/"
  30. readonly RUST_TESTS="tests/rust/testsuite/"
  31. readonly ASSEMBLYSCRIPT_TESTS="tests/assemblyscript/testsuite/"
  32. readonly THREAD_PROPOSAL_TESTS="tests/proposals/wasi-threads/"
  33. readonly THREAD_INTERNAL_TESTS="${WAMR_DIR}/core/iwasm/libraries/lib-wasi-threads/test/"
  34. readonly THREAD_STRESS_TESTS="${WAMR_DIR}/core/iwasm/libraries/lib-wasi-threads/stress-test/"
  35. readonly LIB_SOCKET_TESTS="${WAMR_DIR}/core/iwasm/libraries/lib-socket/test/"
  36. add_env_key_to_test_config_file() {
  37. filepath="tests/$2/testsuite/$3.json"
  38. modified_contents=$(jq ".env.$1 = 1" "$filepath")
  39. echo "$modified_contents" > "$filepath"
  40. }
  41. run_aot_tests () {
  42. local -n tests=$1
  43. local -n excluded_tests=$2
  44. for test_wasm in ${tests[@]}; do
  45. # get the base file name from the filepath
  46. local test_name=${test_wasm##*/}
  47. test_name=${test_name%.wasm}
  48. for excluded_test in "${excluded_tests[@]}"; do
  49. if [[ $excluded_test == "\"$test_name\"" ]]; then
  50. echo "Skipping test $test_name"
  51. continue 2
  52. fi
  53. done
  54. local iwasm="${IWASM_CMD}"
  55. if [[ $test_wasm =~ "stress" ]]; then
  56. iwasm="${IWASM_CMD_STRESS}"
  57. fi
  58. test_aot="${test_wasm%.wasm}.aot"
  59. test_json="${test_wasm%.wasm}.json"
  60. if [ -f ${test_wasm} ]; then
  61. expected=$(jq .exit_code ${test_json})
  62. fi
  63. echo "Compiling $test_wasm to $test_aot"
  64. ${WAMRC_CMD} --enable-multi-thread ${target_option} \
  65. -o ${test_aot} ${test_wasm}
  66. echo "Running $test_aot"
  67. expected=0
  68. if [ -f ${test_json} ]; then
  69. expected=$(jq .exit_code ${test_json})
  70. fi
  71. $PYTHON_EXE ${THIS_DIR}/pipe.py | ${iwasm} $test_aot
  72. ret=${PIPESTATUS[1]}
  73. echo "expected=$expected, actual=$ret"
  74. if [[ $expected != "" ]] && [[ $expected != $ret ]];then
  75. exit_code=1
  76. fi
  77. done
  78. }
  79. if [[ $MODE != "aot" ]];then
  80. $PYTHON_EXE -m venv wasi-env && source wasi-env/${VENV_BIN_DIR}/activate
  81. $PYTHON_EXE -m pip install -r test-runner/requirements.txt
  82. export TEST_RUNTIME_EXE="${IWASM_CMD}"
  83. # Some of the WASI test assertions can be controlled via environment
  84. # variables. The following ones are set on Windows so that the tests pass.
  85. if [ "$PLATFORM" == "windows" ]; then
  86. add_env_key_to_test_config_file NO_DANGLING_FILESYSTEM rust symlink_loop
  87. add_env_key_to_test_config_file NO_DANGLING_FILESYSTEM rust dangling_symlink
  88. add_env_key_to_test_config_file ERRNO_MODE_WINDOWS rust path_open_preopen
  89. add_env_key_to_test_config_file NO_RENAME_DIR_TO_EMPTY_DIR rust path_rename
  90. fi
  91. TEST_OPTIONS="-r adapters/wasm-micro-runtime.py \
  92. -t \
  93. ${C_TESTS} \
  94. ${RUST_TESTS} \
  95. ${ASSEMBLYSCRIPT_TESTS} \
  96. ${THREAD_PROPOSAL_TESTS} \
  97. ${THREAD_INTERNAL_TESTS} \
  98. ${LIB_SOCKET_TESTS}"
  99. if [ -n "$TEST_FILTER" ]; then
  100. TEST_OPTIONS="${TEST_OPTIONS} --exclude-filter ${TEST_FILTER}"
  101. fi
  102. $PYTHON_EXE ${THIS_DIR}/pipe.py | TSAN_OPTIONS=${TSAN_OPTIONS} $PYTHON_EXE test-runner/wasi_test_runner.py $TEST_OPTIONS
  103. ret=${PIPESTATUS[1]}
  104. TEST_RUNTIME_EXE="${IWASM_CMD_STRESS}" TSAN_OPTIONS=${TSAN_OPTIONS} $PYTHON_EXE test-runner/wasi_test_runner.py \
  105. -r adapters/wasm-micro-runtime.py \
  106. -t \
  107. ${THREAD_STRESS_TESTS}
  108. if [ "${ret}" -eq 0 ]; then
  109. ret=${PIPESTATUS[0]}
  110. fi
  111. exit_code=${ret}
  112. deactivate
  113. else
  114. target_option=""
  115. if [[ $TARGET == "X86_32" ]];then
  116. target_option="--target=i386"
  117. fi
  118. exit_code=0
  119. for testsuite in ${THREAD_STRESS_TESTS} ${THREAD_PROPOSAL_TESTS} ${THREAD_INTERNAL_TESTS}; do
  120. tests=$(ls ${testsuite}*.wasm)
  121. tests_array=($tests)
  122. if [ -n "$TEST_FILTER" ]; then
  123. readarray -t excluded_tests_array < <(jq -c \
  124. --slurpfile testsuite_manifest $testsuite/manifest.json \
  125. '.[$testsuite_manifest[0].name] // {} | keys[]' \
  126. $TEST_FILTER)
  127. else
  128. excluded_tests_array=()
  129. fi
  130. run_aot_tests tests_array excluded_tests_array
  131. done
  132. fi
  133. exit ${exit_code}