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}")" \ 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<Path to the llvm build dir, usually Release+Asserts>" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo " Runs all the libFindBadConstructs unit tests" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Runs a single test case. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do_testcase() { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local flags="" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if [ -e "${3}" ]; then 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flags="$(cat "${3}")" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fi 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local output="$("${CLANG_DIR}"/bin/clang -c -Wno-c++11-extensions \ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -Xclang -load -Xclang "${CLANG_DIR}"/lib/libFindBadConstructs.${LIB} \ 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -Xclang -add-plugin -Xclang find-bad-constructs ${flags} ${1} 2>&1)" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local diffout="$(echo "${output}" | diff - "${2}")" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "${diffout}" = "" ]; then 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "PASS: ${1}" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) failed_any_test=yes 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "FAIL: ${1}" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Output of compiler:" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "${output}" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Expected output:" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat "${2}" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Validate input to the script. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [[ -z "${1}" ]]; then 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) usage 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit ${E_BADARGS} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)elif [[ ! -d "${1}" ]]; then 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "${1} is not a directory." 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) usage 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit ${E_BADARGS} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) export CLANG_DIR="${PWD}/${1}" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Using clang directory ${CLANG_DIR}..." 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The golden files assume that the cwd is this directory. To make the script 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # work no matter what the cwd is, explicitly cd to there. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cd "$(dirname "${0}")" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$(uname -s)" = "Linux" ]; then 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) export LIB=so 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif [ "$(uname -s)" = "Darwin" ]; then 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) export LIB=dylib 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)for input in *.cpp; do 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) do_testcase "${input}" "${input%cpp}txt" "${input%cpp}flags" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [[ "${failed_any_test}" ]]; then 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit ${E_FAILEDTEST} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 77