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