15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/bin/bash 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2011 The Chromium Authors. All rights reserved. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Hacky, primitive testing: This runs the style plugin for a set of input files 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# and compares the output with golden result files. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)E_BADARGS=65 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)E_FAILEDTEST=1 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)failed_any_test= 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Prints usage information. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)usage() { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Usage: $(basename "${0}")" \ 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "<path to clang>" \ 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "<path to plugin>" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo " Runs all the libFindBadConstructs unit tests" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Runs a single test case. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do_testcase() { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local flags="" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if [ -e "${3}" ]; then 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flags="$(cat "${3}")" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fi 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if [ "$(uname -s)" = "Darwin" ]; then 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch flags="${flags} -isysroot $(xcrun --show-sdk-path) -stdlib=libstdc++" 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch fi 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci local output="$("${CLANG_PATH}" -c -Wno-c++11-extensions \ 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci -Xclang -load -Xclang "${PLUGIN_PATH}" \ 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -Xclang -add-plugin -Xclang find-bad-constructs ${flags} ${1} 2>&1)" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local diffout="$(echo "${output}" | diff - "${2}")" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "${diffout}" = "" ]; then 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "PASS: ${1}" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) failed_any_test=yes 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "FAIL: ${1}" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Output of compiler:" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "${output}" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Expected output:" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat "${2}" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Validate input to the script. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [[ -z "${1}" ]]; then 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) usage 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit ${E_BADARGS} 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccielif [[ -z "${2}" ]]; then 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci exit ${E_BADARGS} 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccielif [[ ! -x "${1}" ]]; then 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci echo "${1} is not an executable" 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci exit ${E_BADARGS} 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccielif [[ ! -f "${2}" ]]; then 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci echo "${2} could not be found" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) usage 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit ${E_BADARGS} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci export CLANG_PATH="${1}" 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci export PLUGIN_PATH="${2}" 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci echo "Using clang ${CLANG_PATH}..." 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci echo "Using plugin ${PLUGIN_PATH}..." 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The golden files assume that the cwd is this directory. To make the script 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # work no matter what the cwd is, explicitly cd to there. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cd "$(dirname "${0}")" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)for input in *.cpp; do 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) do_testcase "${input}" "${input%cpp}txt" "${input%cpp}flags" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochfor input in *.c; do 84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch do_testcase "${input}" "${input%c}txt" "${input%c}flags" 85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochdone 86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [[ "${failed_any_test}" ]]; then 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit ${E_FAILEDTEST} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 90