1 #!/bin/bash 2 # 3 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 4 # Use of this source code is governed by a BSD-style license that can be 5 # found in the LICENSE file. 6 # 7 # Hacky, primitive testing: This runs the style plugin for a set of input files 8 # and compares the output with golden result files. 9 10 E_BADARGS=65 11 E_FAILEDTEST=1 12 13 failed_any_test= 14 15 # Prints usage information. 16 usage() { 17 echo "Usage: $(basename "${0}")" \ 18 "<path to clang>" \ 19 "<path to plugin>" 20 echo "" 21 echo " Runs all the libFindBadConstructs unit tests" 22 echo "" 23 } 24 25 # Runs a single test case. 26 do_testcase() { 27 local flags="" 28 if [ -e "${3}" ]; then 29 flags="$(cat "${3}")" 30 fi 31 32 if [ "$(uname -s)" = "Darwin" ]; then 33 flags="${flags} -isysroot $(xcrun --show-sdk-path) -stdlib=libstdc++" 34 fi 35 36 local output="$("${CLANG_PATH}" -c -Wno-c++11-extensions \ 37 -Xclang -load -Xclang "${PLUGIN_PATH}" \ 38 -Xclang -add-plugin -Xclang find-bad-constructs ${flags} ${1} 2>&1)" 39 local diffout="$(echo "${output}" | diff - "${2}")" 40 if [ "${diffout}" = "" ]; then 41 echo "PASS: ${1}" 42 else 43 failed_any_test=yes 44 echo "FAIL: ${1}" 45 echo "Output of compiler:" 46 echo "${output}" 47 echo "Expected output:" 48 cat "${2}" 49 echo 50 fi 51 } 52 53 # Validate input to the script. 54 if [[ -z "${1}" ]]; then 55 usage 56 exit ${E_BADARGS} 57 elif [[ -z "${2}" ]]; then 58 usage 59 exit ${E_BADARGS} 60 elif [[ ! -x "${1}" ]]; then 61 echo "${1} is not an executable" 62 usage 63 exit ${E_BADARGS} 64 elif [[ ! -f "${2}" ]]; then 65 echo "${2} could not be found" 66 usage 67 exit ${E_BADARGS} 68 else 69 export CLANG_PATH="${1}" 70 export PLUGIN_PATH="${2}" 71 echo "Using clang ${CLANG_PATH}..." 72 echo "Using plugin ${PLUGIN_PATH}..." 73 74 # The golden files assume that the cwd is this directory. To make the script 75 # work no matter what the cwd is, explicitly cd to there. 76 cd "$(dirname "${0}")" 77 fi 78 79 for input in *.cpp; do 80 do_testcase "${input}" "${input%cpp}txt" "${input%cpp}flags" 81 done 82 83 for input in *.c; do 84 do_testcase "${input}" "${input%c}txt" "${input%c}flags" 85 done 86 87 if [[ "${failed_any_test}" ]]; then 88 exit ${E_FAILEDTEST} 89 fi 90