blob: 0ad9836883a99e23a7569c66ad59ddbc8e865f3e [file] [log] [blame]
Dan Albert98e2c642014-09-19 14:40:57 -07001#!/bin/sh
2# Copyright (C) 2014 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16#
17# acov is a tool for gathering coverage information from a device and generating
18# a report from that information. To use:
19#
20# 1. sudo apt-get install lcov
21# 2. Build application/library with coverage information.
Roland Levillain0fb77072020-06-10 12:53:49 +010022# * make NATIVE_COVERAGE=true NATIVE_COVERAGE_PATHS='*'
Oliver Nguyenf7421ae2019-10-02 12:06:04 -070023# 3. Push the new binaries to the device with adb sync.
24# (Optional): Run `acov --clean-device`. This will reset coverage for everything
25# on the device.
26# 4. Run tests.
27# (Optional): Run `acov --flush`. This will dump coverage from all processes
28# running on the device.
Dan Albert98e2c642014-09-19 14:40:57 -070029# 5. Run `acov`.
30#
31# acov will pull all coverage information from the device, push it to the right
32# directories, run lcov, and display the coverage report (currently by opening
33# it in your browser).
34#
35
Pirama Arumuga Nainarc41549f2021-03-25 16:31:17 -070036if [ "$CLANG_COVERAGE" == "true" ]; then
37 echo "CLANG_COVERAGE is set. Use development/scripts/acov-llvm.py instead."
38 exit 0
39fi
40
Oliver Nguyenf7421ae2019-10-02 12:06:04 -070041ANDROID_OUT=${OUT_DIR:-out}
42FLUSH_SLEEP=${FLUSH_SLEEP:-60}
43
44function clearGcdaFiles() {
45 if [ -d "$ANDROID_OUT" ]; then
46 find $ANDROID_OUT -name '*.gcda' -delete
47 fi
48}
49
50function clearGcnoFiles() {
51 if [ -d "$ANDROID_OUT" ]; then
52 find $ANDROID_OUT -name '*.gcno' -delete
53 fi
54}
55
Dan Albertcf347cc2015-01-24 13:40:42 -080056if [ "$1" = "--clean" ]; then
Oliver Nguyenf7421ae2019-10-02 12:06:04 -070057 echo "Clearing gcda and gcno files from the local build."
58 clearGcdaFiles
59 clearGcnoFiles
Dan Albertcf347cc2015-01-24 13:40:42 -080060 exit 0
61fi
62
63if [ "$1" = "--prep" ]; then
Oliver Nguyenf7421ae2019-10-02 12:06:04 -070064 echo "Clearing gcda files from the local build."
65 clearGcdaFiles
66 exit 0
67fi
Dan Albertf1d27e22015-04-14 13:46:57 -070068
Oliver Nguyenf7421ae2019-10-02 12:06:04 -070069adb root
Dan Albertf1d27e22015-04-14 13:46:57 -070070
Oliver Nguyenf7421ae2019-10-02 12:06:04 -070071if [ "$1" = "--clean-device" ]; then
72 echo "Resetting coverage on the device..."
73 adb shell kill -37 -1
74 echo "Waiting $FLUSH_SLEEP seconds for coverage to be written..."
75 sleep $FLUSH_SLEEP
76 adb shell rm -rf /data/misc/trace/*
77 exit 0
78fi
79
80if [ "$1" = "--flush" ]; then
81 shift
82 if [ -z $@ ]; then
83 echo "Flushing coverage for all processes on the device..."
84 adb shell kill -37 -1
85 else
86 echo "Flushing coverage for [$@] on the device..."
87 adb shell kill -37 $(adb shell pidof $@)
88 fi
89 echo "Waiting $FLUSH_SLEEP seconds for coverage to be written..."
90 sleep $FLUSH_SLEEP
Dan Albertcf347cc2015-01-24 13:40:42 -080091 exit 0
92fi
93
Dan Albert7d133d22014-09-25 11:23:30 -070094which lcov >/dev/null 2>/dev/null
Dan Albert98e2c642014-09-19 14:40:57 -070095if [ $? -ne 0 ]; then
96 echo 'lcov not found: running `sudo apt-get install lcov`'
97 sudo apt-get install lcov
98fi
99
100cd $ANDROID_BUILD_TOP
Dan Albert98e2c642014-09-19 14:40:57 -0700101DIR=$(mktemp -d covreport-XXXXXX)
Dan Albert72324d82015-01-24 13:47:03 -0800102
Oliver Nguyenf7421ae2019-10-02 12:06:04 -0700103# Build a coverage report for each euid that has reported coverage.
104COVERAGE_REPORTS=
105for USER_ID in $(adb shell ls /data/misc/trace)
106do
107 FILE=cov-$USER_ID.info
108 adb shell tar -czf - -C /data/misc/trace/$USER_ID/proc/self/cwd $ANDROID_OUT | tar zxvf -
Dan Albert72324d82015-01-24 13:47:03 -0800109
Oliver Nguyenf7421ae2019-10-02 12:06:04 -0700110 lcov -c -d $ANDROID_OUT -o $DIR/$FILE --gcov-tool=llvm-gcov $@
111 COVERAGE_REPORTS="-a $DIR/$FILE $COVERAGE_REPORTS"
112
113 clearGcdaFiles
114done
115
116FILE=merged.info
117lcov $COVERAGE_REPORTS -o $DIR/$FILE
Dan Albert98e2c642014-09-19 14:40:57 -0700118echo "Generating coverage report at $DIR"
119genhtml -q -o $DIR $DIR/$FILE
120xdg-open $DIR/index.html >/dev/null