| #!/bin/bash |
| # |
| # Copyright 2014 Google Inc. All rights reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| # Test automation script. |
| # |
| # Usage: |
| # test.sh [function name] |
| # |
| # Examples: |
| # $ ./test.sh py-unit # run Python unit tests |
| # $ ./test.sh all # all tests |
| # $ ./test.sh lint # run lint checks |
| # If no function is provided all of the unit tests will be run. |
| |
| set -o nounset |
| set -o pipefail |
| set -o errexit |
| |
| . util.sh |
| |
| readonly THIS_DIR=$(dirname $0) |
| readonly REPO_ROOT=$THIS_DIR |
| readonly CLIENT_DIR=$REPO_ROOT/client/python |
| |
| # |
| # Fully Automated Tests |
| # |
| |
| # Run all Python unit tests. |
| # |
| # Or pass a particular test to run with the correct PYTHONPATH, e.g. |
| # |
| # $ ./test.sh py-unit tests/fastrand_test.py |
| # |
| # TODO: Separate out deterministic tests from statistical tests (which may |
| # rarely fail) |
| py-unit() { |
| export PYTHONPATH=$CLIENT_DIR # to find client library |
| |
| if test $# -gt 0; then |
| "$@" |
| else |
| set +o errexit |
| |
| # -e: exit at first failure |
| find $REPO_ROOT -name \*_test.py | sh -x -e |
| fi |
| |
| local exit_code=$? |
| |
| if test $exit_code -eq 0; then |
| echo 'ALL TESTS PASSED' |
| else |
| echo 'FAIL' |
| exit 1 |
| fi |
| set -o errexit |
| } |
| |
| # All tests |
| all() { |
| banner "Running Python unit tests" |
| py-unit |
| echo |
| |
| banner "Running R unit tests" |
| r-unit |
| } |
| |
| # |
| # Lint |
| # |
| lint() { |
| banner "Linting Python source files" |
| py-lint |
| echo |
| |
| banner "Linting Documentation files" |
| doc-lint |
| } |
| |
| python-lint() { |
| # E111: indent not a multiple of 4. We are following the Google/Chrome |
| # style and using 2 space indents. |
| if pep8 --ignore=E111 "$@"; then |
| echo |
| echo 'LINT PASSED' |
| else |
| echo |
| echo 'LINT FAILED' |
| exit 1 |
| fi |
| } |
| |
| py-lint() { |
| which pep8 >/dev/null || die "pep8 not installed ('sudo apt-get install pep8' on Ubuntu)" |
| |
| # - Skip _tmp dir, because we are downloading cpplint.py there, and it has |
| # pep8 lint errors |
| # - Exclude setup.py, because it's a config file and uses "invalid" 'name = |
| # 1' style (spaces around =). |
| find $REPO_ROOT \ |
| \( -name _tmp -a -prune \) -o \ |
| \( -name \*.py -a -print \) \ |
| | grep -v /setup.py \ |
| | xargs --verbose -- $0 python-lint |
| } |
| |
| r-unit() { |
| set -o xtrace # show tests we're running |
| |
| # This one needs to be run from the root dir |
| tests/compare_dist_test.R |
| |
| tests/gen_counts_test.R |
| |
| tests/gen_true_values_test.R |
| |
| analysis/R/decode_test.R |
| |
| analysis/test/run_tests.R |
| } |
| |
| doc-lint() { |
| which tidy >/dev/null || die "tidy not found" |
| for doc in _tmp/report.html _tmp/doc/*.html; do |
| echo $doc |
| # -e: show only errors and warnings |
| # -q: quiet |
| tidy -e -q $doc || true |
| done |
| } |
| |
| # This isn't a strict check, but can help. |
| # TODO: Add words to whitelist. |
| spell-all() { |
| which spell >/dev/null || die "spell not found" |
| spell README.md doc/*.md | sort | uniq |
| } |
| |
| # |
| # Smoke Tests. These can be manually run. |
| # |
| |
| gen-true-values() { |
| local num_unique_values=10 |
| local num_clients=10 |
| local values_per_client=2 |
| local num_cohorts=4 |
| local out=_tmp/reports.csv |
| |
| tests/gen_true_values.R \ |
| exp $num_unique_values $num_clients $values_per_client $num_cohorts $out |
| wc -l $out |
| cat $out |
| } |
| |
| if test $# -eq 0 ; then |
| all |
| else |
| "$@" |
| fi |