1*2abb3134SXin Li#!/bin/bash 2*2abb3134SXin Li# 3*2abb3134SXin Li# Copyright 2014 Google Inc. All rights reserved. 4*2abb3134SXin Li# 5*2abb3134SXin Li# Licensed under the Apache License, Version 2.0 (the "License"); 6*2abb3134SXin Li# you may not use this file except in compliance with the License. 7*2abb3134SXin Li# You may obtain a copy of the License at 8*2abb3134SXin Li# 9*2abb3134SXin Li# http://www.apache.org/licenses/LICENSE-2.0 10*2abb3134SXin Li# 11*2abb3134SXin Li# Unless required by applicable law or agreed to in writing, software 12*2abb3134SXin Li# distributed under the License is distributed on an "AS IS" BASIS, 13*2abb3134SXin Li# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*2abb3134SXin Li# See the License for the specific language governing permissions and 15*2abb3134SXin Li# limitations under the License. 16*2abb3134SXin Li 17*2abb3134SXin Li# Test automation script. 18*2abb3134SXin Li# 19*2abb3134SXin Li# Usage: 20*2abb3134SXin Li# test.sh [function name] 21*2abb3134SXin Li# 22*2abb3134SXin Li# Examples: 23*2abb3134SXin Li# $ ./test.sh py-unit # run Python unit tests 24*2abb3134SXin Li# $ ./test.sh all # all tests 25*2abb3134SXin Li# $ ./test.sh lint # run lint checks 26*2abb3134SXin Li# If no function is provided all of the unit tests will be run. 27*2abb3134SXin Li 28*2abb3134SXin Liset -o nounset 29*2abb3134SXin Liset -o pipefail 30*2abb3134SXin Liset -o errexit 31*2abb3134SXin Li 32*2abb3134SXin Li. util.sh 33*2abb3134SXin Li 34*2abb3134SXin Lireadonly THIS_DIR=$(dirname $0) 35*2abb3134SXin Lireadonly REPO_ROOT=$THIS_DIR 36*2abb3134SXin Lireadonly CLIENT_DIR=$REPO_ROOT/client/python 37*2abb3134SXin Li 38*2abb3134SXin Li# 39*2abb3134SXin Li# Fully Automated Tests 40*2abb3134SXin Li# 41*2abb3134SXin Li 42*2abb3134SXin Li# Run all Python unit tests. 43*2abb3134SXin Li# 44*2abb3134SXin Li# Or pass a particular test to run with the correct PYTHONPATH, e.g. 45*2abb3134SXin Li# 46*2abb3134SXin Li# $ ./test.sh py-unit tests/fastrand_test.py 47*2abb3134SXin Li# 48*2abb3134SXin Li# TODO: Separate out deterministic tests from statistical tests (which may 49*2abb3134SXin Li# rarely fail) 50*2abb3134SXin Lipy-unit() { 51*2abb3134SXin Li export PYTHONPATH=$CLIENT_DIR # to find client library 52*2abb3134SXin Li 53*2abb3134SXin Li if test $# -gt 0; then 54*2abb3134SXin Li "$@" 55*2abb3134SXin Li else 56*2abb3134SXin Li set +o errexit 57*2abb3134SXin Li 58*2abb3134SXin Li # -e: exit at first failure 59*2abb3134SXin Li find $REPO_ROOT -name \*_test.py | sh -x -e 60*2abb3134SXin Li fi 61*2abb3134SXin Li 62*2abb3134SXin Li local exit_code=$? 63*2abb3134SXin Li 64*2abb3134SXin Li if test $exit_code -eq 0; then 65*2abb3134SXin Li echo 'ALL TESTS PASSED' 66*2abb3134SXin Li else 67*2abb3134SXin Li echo 'FAIL' 68*2abb3134SXin Li exit 1 69*2abb3134SXin Li fi 70*2abb3134SXin Li set -o errexit 71*2abb3134SXin Li} 72*2abb3134SXin Li 73*2abb3134SXin Li# All tests 74*2abb3134SXin Liall() { 75*2abb3134SXin Li banner "Running Python unit tests" 76*2abb3134SXin Li py-unit 77*2abb3134SXin Li echo 78*2abb3134SXin Li 79*2abb3134SXin Li banner "Running R unit tests" 80*2abb3134SXin Li r-unit 81*2abb3134SXin Li} 82*2abb3134SXin Li 83*2abb3134SXin Li# 84*2abb3134SXin Li# Lint 85*2abb3134SXin Li# 86*2abb3134SXin Lilint() { 87*2abb3134SXin Li banner "Linting Python source files" 88*2abb3134SXin Li py-lint 89*2abb3134SXin Li echo 90*2abb3134SXin Li 91*2abb3134SXin Li banner "Linting Documentation files" 92*2abb3134SXin Li doc-lint 93*2abb3134SXin Li} 94*2abb3134SXin Li 95*2abb3134SXin Lipython-lint() { 96*2abb3134SXin Li # E111: indent not a multiple of 4. We are following the Google/Chrome 97*2abb3134SXin Li # style and using 2 space indents. 98*2abb3134SXin Li if pep8 --ignore=E111 "$@"; then 99*2abb3134SXin Li echo 100*2abb3134SXin Li echo 'LINT PASSED' 101*2abb3134SXin Li else 102*2abb3134SXin Li echo 103*2abb3134SXin Li echo 'LINT FAILED' 104*2abb3134SXin Li exit 1 105*2abb3134SXin Li fi 106*2abb3134SXin Li} 107*2abb3134SXin Li 108*2abb3134SXin Lipy-lint() { 109*2abb3134SXin Li which pep8 >/dev/null || die "pep8 not installed ('sudo apt-get install pep8' on Ubuntu)" 110*2abb3134SXin Li 111*2abb3134SXin Li # - Skip _tmp dir, because we are downloading cpplint.py there, and it has 112*2abb3134SXin Li # pep8 lint errors 113*2abb3134SXin Li # - Exclude setup.py, because it's a config file and uses "invalid" 'name = 114*2abb3134SXin Li # 1' style (spaces around =). 115*2abb3134SXin Li find $REPO_ROOT \ 116*2abb3134SXin Li \( -name _tmp -a -prune \) -o \ 117*2abb3134SXin Li \( -name \*.py -a -print \) \ 118*2abb3134SXin Li | grep -v /setup.py \ 119*2abb3134SXin Li | xargs --verbose -- $0 python-lint 120*2abb3134SXin Li} 121*2abb3134SXin Li 122*2abb3134SXin Lir-unit() { 123*2abb3134SXin Li set -o xtrace # show tests we're running 124*2abb3134SXin Li 125*2abb3134SXin Li # This one needs to be run from the root dir 126*2abb3134SXin Li tests/compare_dist_test.R 127*2abb3134SXin Li 128*2abb3134SXin Li tests/gen_counts_test.R 129*2abb3134SXin Li 130*2abb3134SXin Li tests/gen_true_values_test.R 131*2abb3134SXin Li 132*2abb3134SXin Li analysis/R/decode_test.R 133*2abb3134SXin Li 134*2abb3134SXin Li analysis/test/run_tests.R 135*2abb3134SXin Li} 136*2abb3134SXin Li 137*2abb3134SXin Lidoc-lint() { 138*2abb3134SXin Li which tidy >/dev/null || die "tidy not found" 139*2abb3134SXin Li for doc in _tmp/report.html _tmp/doc/*.html; do 140*2abb3134SXin Li echo $doc 141*2abb3134SXin Li # -e: show only errors and warnings 142*2abb3134SXin Li # -q: quiet 143*2abb3134SXin Li tidy -e -q $doc || true 144*2abb3134SXin Li done 145*2abb3134SXin Li} 146*2abb3134SXin Li 147*2abb3134SXin Li# This isn't a strict check, but can help. 148*2abb3134SXin Li# TODO: Add words to whitelist. 149*2abb3134SXin Lispell-all() { 150*2abb3134SXin Li which spell >/dev/null || die "spell not found" 151*2abb3134SXin Li spell README.md doc/*.md | sort | uniq 152*2abb3134SXin Li} 153*2abb3134SXin Li 154*2abb3134SXin Li# 155*2abb3134SXin Li# Smoke Tests. These can be manually run. 156*2abb3134SXin Li# 157*2abb3134SXin Li 158*2abb3134SXin Ligen-true-values() { 159*2abb3134SXin Li local num_unique_values=10 160*2abb3134SXin Li local num_clients=10 161*2abb3134SXin Li local values_per_client=2 162*2abb3134SXin Li local num_cohorts=4 163*2abb3134SXin Li local out=_tmp/reports.csv 164*2abb3134SXin Li 165*2abb3134SXin Li tests/gen_true_values.R \ 166*2abb3134SXin Li exp $num_unique_values $num_clients $values_per_client $num_cohorts $out 167*2abb3134SXin Li wc -l $out 168*2abb3134SXin Li cat $out 169*2abb3134SXin Li} 170*2abb3134SXin Li 171*2abb3134SXin Liif test $# -eq 0 ; then 172*2abb3134SXin Li all 173*2abb3134SXin Lielse 174*2abb3134SXin Li "$@" 175*2abb3134SXin Lifi 176