test.sh revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1986b8f798272d3ae2898617c8fb089156a5941c0Ian Romanick#!/bin/bash
2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#
3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick# Copyright 2014 The Chromium Authors. All rights reserved.
4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick# Use of this source code is governed by a BSD-style license that can be
5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick# found in the LICENSE file.
6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#
7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick# Hacky, primitive testing: This runs the style plugin for a set of input files
8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick# and compares the output with golden result files.
9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan RomanickE_BADARGS=65
11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan RomanickE_FAILEDTEST=1
12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickfailed_any_test=
14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick# Prints usage information.
16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickusage() {
17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  echo "Usage: $(basename "${0}")" \
18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    "<path to clang>" \
19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    "<path to plugin>"
20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  echo ""
21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  echo "  Runs all the libBlinkGCPlugin unit tests"
22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  echo ""
23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
25e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick# Runs a single test case.
26e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanickdo_testcase() {
27e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick  local flags=""
28e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick  if [ -e "${3}" ]; then
290044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick    flags="$(cat "${3}")"
3078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick  fi
310044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick  local output="$("${CLANG_PATH}" -c -Wno-c++11-extensions \
32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -Xclang -load -Xclang "${PLUGIN_PATH}" \
33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -Xclang -add-plugin -Xclang blink-gc-plugin ${flags} ${1} 2>&1)"
34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  local json="${input%cpp}graph.json"
35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  if [ -f "$json" ]; then
36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    output="$(python ../process-graph.py -c ${json} 2>&1)"
37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  fi
38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  local diffout="$(echo "${output}" | diff - "${2}")"
390044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick  if [ "${diffout}" = "" ]; then
40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    echo "PASS: ${1}"
41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  else
42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    failed_any_test=yes
4378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    echo "FAIL: ${1}"
4478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    echo "Output of compiler:"
4544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    echo "${output}"
4644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    echo "Expected output:"
4744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    cat "${2}"
4844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    echo
4944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke  fi
5044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke}
5144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
5244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke# Validate input to the script.
5344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunkeif [[ -z "${1}" ]]; then
5444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke  usage
55fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke  exit ${E_BADARGS}
5644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunkeelif [[ -z "${2}" ]]; then
5744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke  usage
58a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  exit ${E_BADARGS}
5944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunkeelif [[ ! -x "${1}" ]]; then
60d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick  echo "${1} is not an executable"
61d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick  usage
62d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick  exit ${E_BADARGS}
63a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickelif [[ ! -f "${2}" ]]; then
64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  echo "${2} could not be found"
65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  usage
66fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke  exit ${E_BADARGS}
67fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeelse
68fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke  export CLANG_PATH="${1}"
69fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke  export PLUGIN_PATH="${2}"
70fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke  echo "Using clang ${CLANG_PATH}..."
71fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke  echo "Using plugin ${PLUGIN_PATH}..."
72fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
73fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke  # The golden files assume that the cwd is this directory. To make the script
74fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke  # work no matter what the cwd is, explicitly cd to there.
75fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke  cd "$(dirname "${0}")"
76fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkefi
77fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
78fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkefor input in *.cpp; do
79fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke  do_testcase "${input}" "${input%cpp}txt" "${input%cpp}flags"
80fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkedone
81fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
82fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeif [[ "${failed_any_test}" ]]; then
83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick  exit ${E_FAILEDTEST}
84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickfi
85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick