xref: /aosp_15_r20/external/rappor/test.sh (revision 2abb31345f6c95944768b5222a9a5ed3fc68cc00)
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