xref: /aosp_15_r20/external/libwebm/infra/run_unit_tests.sh (revision 103e46e4cd4b6efcf6001f23fa8665fb110abf8d)
1*103e46e4SHarish Mahendrakar#!/bin/bash
2*103e46e4SHarish Mahendrakar# Copyright (c) 2021, Google Inc. All rights reserved.
3*103e46e4SHarish Mahendrakar#
4*103e46e4SHarish Mahendrakar# Redistribution and use in source and binary forms, with or without
5*103e46e4SHarish Mahendrakar# modification, are permitted provided that the following conditions are
6*103e46e4SHarish Mahendrakar# met:
7*103e46e4SHarish Mahendrakar#
8*103e46e4SHarish Mahendrakar#   * Redistributions of source code must retain the above copyright
9*103e46e4SHarish Mahendrakar#     notice, this list of conditions and the following disclaimer.
10*103e46e4SHarish Mahendrakar#
11*103e46e4SHarish Mahendrakar#   * Redistributions in binary form must reproduce the above copyright
12*103e46e4SHarish Mahendrakar#     notice, this list of conditions and the following disclaimer in
13*103e46e4SHarish Mahendrakar#     the documentation and/or other materials provided with the
14*103e46e4SHarish Mahendrakar#     distribution.
15*103e46e4SHarish Mahendrakar#
16*103e46e4SHarish Mahendrakar#   * Neither the name of Google nor the names of its contributors may
17*103e46e4SHarish Mahendrakar#     be used to endorse or promote products derived from this software
18*103e46e4SHarish Mahendrakar#     without specific prior written permission.
19*103e46e4SHarish Mahendrakar#
20*103e46e4SHarish Mahendrakar# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*103e46e4SHarish Mahendrakar# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*103e46e4SHarish Mahendrakar# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*103e46e4SHarish Mahendrakar# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24*103e46e4SHarish Mahendrakar# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*103e46e4SHarish Mahendrakar# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26*103e46e4SHarish Mahendrakar# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*103e46e4SHarish Mahendrakar# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*103e46e4SHarish Mahendrakar# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*103e46e4SHarish Mahendrakar# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30*103e46e4SHarish Mahendrakar# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*103e46e4SHarish Mahendrakar
32*103e46e4SHarish Mahendrakarset -xeo pipefail
33*103e46e4SHarish Mahendrakarshopt -s inherit_errexit
34*103e46e4SHarish Mahendrakar
35*103e46e4SHarish Mahendrakarreadonly GOOGLETEST_REPO="https://github.com/google/googletest.git"
36*103e46e4SHarish MahendrakarLIBWEBM_ROOT="$(realpath "$(dirname "$0")/..")"
37*103e46e4SHarish Mahendrakarreadonly LIBWEBM_ROOT
38*103e46e4SHarish Mahendrakarreadonly WORKSPACE=${WORKSPACE:-"$(mktemp -d -t webm.XXX)"}
39*103e46e4SHarish Mahendrakar
40*103e46e4SHarish Mahendrakar# shellcheck source=infra/common.sh
41*103e46e4SHarish Mahendrakarsource "${LIBWEBM_ROOT}/infra/common.sh"
42*103e46e4SHarish Mahendrakar
43*103e46e4SHarish Mahendrakarusage() {
44*103e46e4SHarish Mahendrakar  cat << EOF
45*103e46e4SHarish MahendrakarUsage: $(basename "$0") TARGET
46*103e46e4SHarish MahendrakarOptions:
47*103e46e4SHarish MahendrakarTARGET supported targets: (x86-asan, x86-ubsan, x86_64-asan, x86_64-ubsan,
48*103e46e4SHarish Mahendrakar       x86_64-valgrind)
49*103e46e4SHarish MahendrakarGlobal variables:
50*103e46e4SHarish MahendrakarWORKSPACE directory where the build is done
51*103e46e4SHarish MahendrakarEOF
52*103e46e4SHarish Mahendrakar}
53*103e46e4SHarish Mahendrakar
54*103e46e4SHarish Mahendrakar#######################################
55*103e46e4SHarish Mahendrakar# Run valgrind
56*103e46e4SHarish Mahendrakar#######################################
57*103e46e4SHarish Mahendrakarrun_valgrind() {
58*103e46e4SHarish Mahendrakar  valgrind \
59*103e46e4SHarish Mahendrakar    --leak-check=full \
60*103e46e4SHarish Mahendrakar    --show-reachable=yes \
61*103e46e4SHarish Mahendrakar    --track-origins=yes \
62*103e46e4SHarish Mahendrakar    --error-exitcode=1 \
63*103e46e4SHarish Mahendrakar    "$@"
64*103e46e4SHarish Mahendrakar}
65*103e46e4SHarish Mahendrakar
66*103e46e4SHarish Mahendrakar#######################################
67*103e46e4SHarish Mahendrakar# Ensure GoogleTest repository is setup
68*103e46e4SHarish Mahendrakar#
69*103e46e4SHarish Mahendrakar# Globals:
70*103e46e4SHarish Mahendrakar#  GOOGLETEST_REPO googletest repository url
71*103e46e4SHarish Mahendrakar#  WORKSPACE directory where the build is done
72*103e46e4SHarish Mahendrakar#######################################
73*103e46e4SHarish Mahendrakarensure_googletest() {
74*103e46e4SHarish Mahendrakar  local googletest_dir
75*103e46e4SHarish Mahendrakar  googletest_dir="${WORKSPACE}/googletest"
76*103e46e4SHarish Mahendrakar
77*103e46e4SHarish Mahendrakar  if [[ ! -d "${googletest_dir}" ]] || ! git -C "${googletest_dir}" pull; then
78*103e46e4SHarish Mahendrakar    rm -rf "${googletest_dir}"
79*103e46e4SHarish Mahendrakar    git clone --depth 1 "${GOOGLETEST_REPO}" "${googletest_dir}"
80*103e46e4SHarish Mahendrakar  fi
81*103e46e4SHarish Mahendrakar
82*103e46e4SHarish Mahendrakar  opts+=("-DGTEST_SRC_DIR=${googletest_dir}")
83*103e46e4SHarish Mahendrakar}
84*103e46e4SHarish Mahendrakar
85*103e46e4SHarish Mahendrakar#######################################
86*103e46e4SHarish Mahendrakar# Symbolizes and dumps warnings in the address sanitizer log
87*103e46e4SHarish Mahendrakar# Globals:
88*103e46e4SHarish Mahendrakar#  BUILD_DIR directory where the build is done
89*103e46e4SHarish Mahendrakar#  SANITIZER_LOG path to sanitizer log file
90*103e46e4SHarish Mahendrakar#######################################
91*103e46e4SHarish Mahendrakardump_sanitizer_log() {
92*103e46e4SHarish Mahendrakar  if [[ "$#" -ne 1 ]]; then
93*103e46e4SHarish Mahendrakar    return 1
94*103e46e4SHarish Mahendrakar  fi
95*103e46e4SHarish Mahendrakar
96*103e46e4SHarish Mahendrakar  if command -v asan_symbolize; then
97*103e46e4SHarish Mahendrakar    asan_symbolize_tool="asan_symbolize"
98*103e46e4SHarish Mahendrakar  else
99*103e46e4SHarish Mahendrakar    asan_symbolize_tool="asan_symbolize.py"
100*103e46e4SHarish Mahendrakar  fi
101*103e46e4SHarish Mahendrakar
102*103e46e4SHarish Mahendrakar  local target
103*103e46e4SHarish Mahendrakar  target="$1"
104*103e46e4SHarish Mahendrakar  case "${target}" in
105*103e46e4SHarish Mahendrakar    *-asan)
106*103e46e4SHarish Mahendrakar      asanlog_symbolized="${BUILD_DIR}/asan_log.asanlog_symbolized"
107*103e46e4SHarish Mahendrakar      grep -v 'Invalid VP9' "${SANITIZER_LOG}" > "${SANITIZER_LOG}.2" || true
108*103e46e4SHarish Mahendrakar      "${asan_symbolize_tool}" "${BUILD_DIR}" < "${SANITIZER_LOG}.2" \
109*103e46e4SHarish Mahendrakar        | c++filt > "${asanlog_symbolized}"
110*103e46e4SHarish Mahendrakar      if [[ -s "${asanlog_symbolized}" ]]; then
111*103e46e4SHarish Mahendrakar        cat "${asanlog_symbolized}"
112*103e46e4SHarish Mahendrakar        return 1
113*103e46e4SHarish Mahendrakar      fi
114*103e46e4SHarish Mahendrakar      ;;
115*103e46e4SHarish Mahendrakar    *) ;;  # No other sanitizer options are required
116*103e46e4SHarish Mahendrakar      # TODO(b/185520494): Handle ubsan warning output inspection
117*103e46e4SHarish Mahendrakar  esac
118*103e46e4SHarish Mahendrakar}
119*103e46e4SHarish Mahendrakar
120*103e46e4SHarish Mahendrakar################################################################################
121*103e46e4SHarish Mahendrakarecho "Unit testing libwebm in ${WORKSPACE}"
122*103e46e4SHarish Mahendrakar
123*103e46e4SHarish Mahendrakarif [[ ! -d "${WORKSPACE}" ]]; then
124*103e46e4SHarish Mahendrakar  log_err "${WORKSPACE} directory does not exist"
125*103e46e4SHarish Mahendrakar  exit 1
126*103e46e4SHarish Mahendrakarfi
127*103e46e4SHarish Mahendrakar
128*103e46e4SHarish MahendrakarTARGET=${1:? "$(
129*103e46e4SHarish Mahendrakar  echo
130*103e46e4SHarish Mahendrakar  usage
131*103e46e4SHarish Mahendrakar)"}
132*103e46e4SHarish Mahendrakarreadonly BUILD_DIR="${WORKSPACE}/tests-${TARGET}"
133*103e46e4SHarish Mahendrakarreadonly SANITIZER_LOG="${BUILD_DIR}/sanitizer_log"
134*103e46e4SHarish Mahendrakar
135*103e46e4SHarish Mahendrakar# Create a fresh build directory.
136*103e46e4SHarish Mahendrakartrap 'dump_sanitizer_log ${TARGET}; cleanup' EXIT
137*103e46e4SHarish Mahendrakarmake_build_dir "${BUILD_DIR}"
138*103e46e4SHarish Mahendrakar
139*103e46e4SHarish Mahendrakarcase "${TARGET}" in
140*103e46e4SHarish Mahendrakar  x86-*) CXX='clang++ -m32' ;;
141*103e46e4SHarish Mahendrakar  x86_64-*) CXX=clang++ ;;
142*103e46e4SHarish Mahendrakar  *)
143*103e46e4SHarish Mahendrakar    log_err "${TARGET} should have x86 or x86_64 prefix."
144*103e46e4SHarish Mahendrakar    usage
145*103e46e4SHarish Mahendrakar    exit 1
146*103e46e4SHarish Mahendrakar    ;;
147*103e46e4SHarish Mahendrakaresac
148*103e46e4SHarish Mahendrakar# cmake (3.4.3) will only accept the -m32 variants when used via the CXX env
149*103e46e4SHarish Mahendrakar# var.
150*103e46e4SHarish Mahendrakarexport CXX
151*103e46e4SHarish Mahendrakaropts+=("-DCMAKE_BUILD_TYPE=Debug" "-DENABLE_TESTS=ON")
152*103e46e4SHarish Mahendrakarcase "${TARGET}" in
153*103e46e4SHarish Mahendrakar  *-asan) opts+=("-DCMAKE_CXX_FLAGS=-fsanitize=address") ;;
154*103e46e4SHarish Mahendrakar  *-ubsan)
155*103e46e4SHarish Mahendrakar    opts+=("-DCMAKE_CXX_FLAGS=-fsanitize=integer")
156*103e46e4SHarish Mahendrakar    if [[ "${TARGET}" == "x86-ubsan" ]]; then
157*103e46e4SHarish Mahendrakar      # clang fails to find symbols when -fsanitize=integer is set in x86 arch.
158*103e46e4SHarish Mahendrakar      # https://bugs.llvm.org/show_bug.cgi?id=17693
159*103e46e4SHarish Mahendrakar      opts+=("-DCMAKE_CXX_FLAGS=-rtlib=compiler-rt")
160*103e46e4SHarish Mahendrakar      opts+=("-DCMAKE_EXE_LINKER_FLAGS=-lgcc_s")
161*103e46e4SHarish Mahendrakar    fi
162*103e46e4SHarish Mahendrakar    ;;
163*103e46e4SHarish Mahendrakar  *) ;;  # No additional flags needed.
164*103e46e4SHarish Mahendrakaresac
165*103e46e4SHarish Mahendrakar
166*103e46e4SHarish Mahendrakarensure_googletest
167*103e46e4SHarish Mahendrakar# Using pushd instead of -S/-B for backward compatibility with CMake < 3.13.x
168*103e46e4SHarish Mahendrakarpushd "${BUILD_DIR}"
169*103e46e4SHarish Mahendrakarcmake "${LIBWEBM_ROOT}" "${opts[@]}"
170*103e46e4SHarish Mahendrakarmake -j 4
171*103e46e4SHarish Mahendrakarpopd
172*103e46e4SHarish Mahendrakar
173*103e46e4SHarish Mahendrakarfind_tests="$(find "${BUILD_DIR}" -name '*_tests')"
174*103e46e4SHarish MahendrakarUNIT_TESTS=()
175*103e46e4SHarish Mahendrakarwhile IFS='' read -r line; do
176*103e46e4SHarish Mahendrakar  UNIT_TESTS+=("${line}")
177*103e46e4SHarish Mahendrakardone < <(echo "${find_tests}")
178*103e46e4SHarish Mahendrakar
179*103e46e4SHarish Mahendrakarexport LIBWEBM_TEST_DATA_PATH="${LIBWEBM_ROOT}/testing/testdata"
180*103e46e4SHarish Mahendrakarcase "${TARGET}" in
181*103e46e4SHarish Mahendrakar  *-asan | *-ubsan)
182*103e46e4SHarish Mahendrakar    rm -f "${SANITIZER_LOG}"
183*103e46e4SHarish Mahendrakar    for test in "${UNIT_TESTS[@]}"; do
184*103e46e4SHarish Mahendrakar      "${test}" \
185*103e46e4SHarish Mahendrakar        --gtest_output="xml:${BUILD_DIR}/$(basename "${test}")_detail.xml" \
186*103e46e4SHarish Mahendrakar        3<&1 1>&2 2>&3 | tee -a "${SANITIZER_LOG}"
187*103e46e4SHarish Mahendrakar    done
188*103e46e4SHarish Mahendrakar    ;;
189*103e46e4SHarish Mahendrakar  *-valgrind)
190*103e46e4SHarish Mahendrakar    for test in "${UNIT_TESTS[@]}"; do
191*103e46e4SHarish Mahendrakar      run_valgrind --error-exitcode=1 "${test}" \
192*103e46e4SHarish Mahendrakar        --gtest_output="xml:${BUILD_DIR}/$(basename "${test}")_detail.xml"
193*103e46e4SHarish Mahendrakar    done
194*103e46e4SHarish Mahendrakar    ;;
195*103e46e4SHarish Mahendrakar  *)
196*103e46e4SHarish Mahendrakar    log_err "Unrecognized TARGET:${TARGET}."
197*103e46e4SHarish Mahendrakar    usage
198*103e46e4SHarish Mahendrakar    exit 1
199*103e46e4SHarish Mahendrakar    ;;
200*103e46e4SHarish Mahendrakaresac
201