xref: /aosp_15_r20/development/scripts/acov (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker#!/bin/sh
2*90c8c64dSAndroid Build Coastguard Worker# Copyright (C) 2014 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker#
4*90c8c64dSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker#
8*90c8c64dSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker#
10*90c8c64dSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker# limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker
16*90c8c64dSAndroid Build Coastguard Worker#
17*90c8c64dSAndroid Build Coastguard Worker# acov is a tool for gathering coverage information from a device and generating
18*90c8c64dSAndroid Build Coastguard Worker# a report from that information. To use:
19*90c8c64dSAndroid Build Coastguard Worker#
20*90c8c64dSAndroid Build Coastguard Worker# 1. sudo apt-get install lcov
21*90c8c64dSAndroid Build Coastguard Worker# 2. Build application/library with coverage information.
22*90c8c64dSAndroid Build Coastguard Worker#     * make NATIVE_COVERAGE=true NATIVE_COVERAGE_PATHS='*'
23*90c8c64dSAndroid Build Coastguard Worker# 3. Push the new binaries to the device with adb sync.
24*90c8c64dSAndroid Build Coastguard Worker# (Optional): Run `acov --clean-device`. This will reset coverage for everything
25*90c8c64dSAndroid Build Coastguard Worker#      on the device.
26*90c8c64dSAndroid Build Coastguard Worker# 4. Run tests.
27*90c8c64dSAndroid Build Coastguard Worker# (Optional): Run `acov --flush`. This will dump coverage from all processes
28*90c8c64dSAndroid Build Coastguard Worker#      running on the device.
29*90c8c64dSAndroid Build Coastguard Worker# 5. Run `acov`.
30*90c8c64dSAndroid Build Coastguard Worker#
31*90c8c64dSAndroid Build Coastguard Worker# acov will pull all coverage information from the device, push it to the right
32*90c8c64dSAndroid Build Coastguard Worker# directories, run lcov, and display the coverage report (currently by opening
33*90c8c64dSAndroid Build Coastguard Worker# it in your browser).
34*90c8c64dSAndroid Build Coastguard Worker#
35*90c8c64dSAndroid Build Coastguard Worker
36*90c8c64dSAndroid Build Coastguard Workerif [ "$CLANG_COVERAGE" == "true" ]; then
37*90c8c64dSAndroid Build Coastguard Worker  echo "CLANG_COVERAGE is set.  Use development/scripts/acov-llvm.py instead."
38*90c8c64dSAndroid Build Coastguard Worker  exit 0
39*90c8c64dSAndroid Build Coastguard Workerfi
40*90c8c64dSAndroid Build Coastguard Worker
41*90c8c64dSAndroid Build Coastguard WorkerANDROID_OUT=${OUT_DIR:-out}
42*90c8c64dSAndroid Build Coastguard WorkerFLUSH_SLEEP=${FLUSH_SLEEP:-60}
43*90c8c64dSAndroid Build Coastguard Worker
44*90c8c64dSAndroid Build Coastguard Workerfunction clearGcdaFiles() {
45*90c8c64dSAndroid Build Coastguard Worker  if [ -d "$ANDROID_OUT" ]; then
46*90c8c64dSAndroid Build Coastguard Worker    find $ANDROID_OUT -name '*.gcda' -delete
47*90c8c64dSAndroid Build Coastguard Worker  fi
48*90c8c64dSAndroid Build Coastguard Worker}
49*90c8c64dSAndroid Build Coastguard Worker
50*90c8c64dSAndroid Build Coastguard Workerfunction clearGcnoFiles() {
51*90c8c64dSAndroid Build Coastguard Worker  if [ -d "$ANDROID_OUT" ]; then
52*90c8c64dSAndroid Build Coastguard Worker    find $ANDROID_OUT -name '*.gcno' -delete
53*90c8c64dSAndroid Build Coastguard Worker  fi
54*90c8c64dSAndroid Build Coastguard Worker}
55*90c8c64dSAndroid Build Coastguard Worker
56*90c8c64dSAndroid Build Coastguard Workerif [ "$1" = "--clean" ]; then
57*90c8c64dSAndroid Build Coastguard Worker  echo "Clearing gcda and gcno files from the local build."
58*90c8c64dSAndroid Build Coastguard Worker  clearGcdaFiles
59*90c8c64dSAndroid Build Coastguard Worker  clearGcnoFiles
60*90c8c64dSAndroid Build Coastguard Worker  exit 0
61*90c8c64dSAndroid Build Coastguard Workerfi
62*90c8c64dSAndroid Build Coastguard Worker
63*90c8c64dSAndroid Build Coastguard Workerif [ "$1" = "--prep" ]; then
64*90c8c64dSAndroid Build Coastguard Worker  echo "Clearing gcda files from the local build."
65*90c8c64dSAndroid Build Coastguard Worker  clearGcdaFiles
66*90c8c64dSAndroid Build Coastguard Worker  exit 0
67*90c8c64dSAndroid Build Coastguard Workerfi
68*90c8c64dSAndroid Build Coastguard Worker
69*90c8c64dSAndroid Build Coastguard Workeradb root
70*90c8c64dSAndroid Build Coastguard Worker
71*90c8c64dSAndroid Build Coastguard Workerif [ "$1" = "--clean-device" ]; then
72*90c8c64dSAndroid Build Coastguard Worker  echo "Resetting coverage on the device..."
73*90c8c64dSAndroid Build Coastguard Worker  adb shell kill -37 -1
74*90c8c64dSAndroid Build Coastguard Worker  echo "Waiting $FLUSH_SLEEP seconds for coverage to be written..."
75*90c8c64dSAndroid Build Coastguard Worker  sleep $FLUSH_SLEEP
76*90c8c64dSAndroid Build Coastguard Worker  adb shell rm -rf /data/misc/trace/*
77*90c8c64dSAndroid Build Coastguard Worker  exit 0
78*90c8c64dSAndroid Build Coastguard Workerfi
79*90c8c64dSAndroid Build Coastguard Worker
80*90c8c64dSAndroid Build Coastguard Workerif [ "$1" = "--flush" ]; then
81*90c8c64dSAndroid Build Coastguard Worker  shift
82*90c8c64dSAndroid Build Coastguard Worker  if [ -z $@ ]; then
83*90c8c64dSAndroid Build Coastguard Worker    echo "Flushing coverage for all processes on the device..."
84*90c8c64dSAndroid Build Coastguard Worker    adb shell kill -37 -1
85*90c8c64dSAndroid Build Coastguard Worker  else
86*90c8c64dSAndroid Build Coastguard Worker    echo "Flushing coverage for [$@] on the device..."
87*90c8c64dSAndroid Build Coastguard Worker    adb shell kill -37 $(adb shell pidof $@)
88*90c8c64dSAndroid Build Coastguard Worker  fi
89*90c8c64dSAndroid Build Coastguard Worker  echo "Waiting $FLUSH_SLEEP seconds for coverage to be written..."
90*90c8c64dSAndroid Build Coastguard Worker  sleep $FLUSH_SLEEP
91*90c8c64dSAndroid Build Coastguard Worker  exit 0
92*90c8c64dSAndroid Build Coastguard Workerfi
93*90c8c64dSAndroid Build Coastguard Worker
94*90c8c64dSAndroid Build Coastguard Workerwhich lcov >/dev/null 2>/dev/null
95*90c8c64dSAndroid Build Coastguard Workerif [ $? -ne 0 ]; then
96*90c8c64dSAndroid Build Coastguard Worker  echo 'lcov not found: running `sudo apt-get install lcov`'
97*90c8c64dSAndroid Build Coastguard Worker  sudo apt-get install lcov
98*90c8c64dSAndroid Build Coastguard Workerfi
99*90c8c64dSAndroid Build Coastguard Worker
100*90c8c64dSAndroid Build Coastguard Workercd $ANDROID_BUILD_TOP
101*90c8c64dSAndroid Build Coastguard WorkerDIR=$(mktemp -d covreport-XXXXXX)
102*90c8c64dSAndroid Build Coastguard Worker
103*90c8c64dSAndroid Build Coastguard Worker# Build a coverage report for each euid that has reported coverage.
104*90c8c64dSAndroid Build Coastguard WorkerCOVERAGE_REPORTS=
105*90c8c64dSAndroid Build Coastguard Workerfor USER_ID in $(adb shell ls /data/misc/trace)
106*90c8c64dSAndroid Build Coastguard Workerdo
107*90c8c64dSAndroid Build Coastguard Worker  FILE=cov-$USER_ID.info
108*90c8c64dSAndroid Build Coastguard Worker  adb shell tar -czf - -C /data/misc/trace/$USER_ID/proc/self/cwd $ANDROID_OUT | tar zxvf -
109*90c8c64dSAndroid Build Coastguard Worker
110*90c8c64dSAndroid Build Coastguard Worker  lcov -c -d $ANDROID_OUT -o $DIR/$FILE --gcov-tool=llvm-gcov $@
111*90c8c64dSAndroid Build Coastguard Worker  COVERAGE_REPORTS="-a $DIR/$FILE $COVERAGE_REPORTS"
112*90c8c64dSAndroid Build Coastguard Worker
113*90c8c64dSAndroid Build Coastguard Worker  clearGcdaFiles
114*90c8c64dSAndroid Build Coastguard Workerdone
115*90c8c64dSAndroid Build Coastguard Worker
116*90c8c64dSAndroid Build Coastguard WorkerFILE=merged.info
117*90c8c64dSAndroid Build Coastguard Workerlcov $COVERAGE_REPORTS -o $DIR/$FILE
118*90c8c64dSAndroid Build Coastguard Workerecho "Generating coverage report at $DIR"
119*90c8c64dSAndroid Build Coastguard Workergenhtml -q -o $DIR $DIR/$FILE
120*90c8c64dSAndroid Build Coastguard Workerxdg-open $DIR/index.html >/dev/null
121