blob: beb6163f7bf8e01ce6db9648e5676a19e59c2113 [file] [log] [blame]
#!/bin/bash
###############################################################################
# Copyright 2017 Google LLC
#
# 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.
################################################################################
#
# Usage
#
# COVERAGE_CPUS=32 tools/coverage.sh [/path/to/report-directory/] [targets]
#
# COVERAGE_CPUS defaults to 2, and the default destination is a temp
# dir.
set -eu
genhtml=$(command -v genhtml)
if [[ -z "${genhtml}" ]]; then
echo "Install 'genhtml' (contained in the 'lcov' package)"
exit 1
fi
destdir="$1"
if [[ -z "${destdir}" ]]; then
destdir=$(mktemp -d /tmp/gerritcov.XXXXXX)
fi
targets="$2"
if [[ -z "${targets}" ]]; then
targets="apps/... java/..."
fi
echo "Running 'bazel coverage'; this may take a while"
# coverage is expensive to run; use --jobs=2 to avoid overloading the
# machine.
bazel coverage -k --jobs="${COVERAGE_CPUS:-2}" -- "$targets"
# The coverage data contains filenames relative to the Java root, and
# genhtml has no logic to search these elsewhere. Workaround this
# limitation by running genhtml in a directory with the files in the
# right place. Also -inexplicably- genhtml wants to have the source
# files relative to the output directory.
rm -rf "${destdir}" || true
mkdir -p "${destdir}"
for ROOT in java apps/paymentmethodtoken; do
rsync -a "${ROOT}/src/main/java/" "${ROOT}/src/test/java/" "${destdir}/"
done
base=$(bazel info bazel-testlogs)
find "${base}" -name 'coverage.dat' -exec sh -c '
for ff do
f=$(printf '%s' "${ff#"$base"/}" | sed "s|/|_|g")
cp "$ff" "${destdir}/$f"
done
' find-sh {} +
cd "${destdir}"
find -name '*coverage.dat' -size 0 -exec rm -f {} +
genhtml -o . --ignore-errors source ./*coverage.dat
printf "coverage report at file://%s/index.html" "${destdir}"