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