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