• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/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.
22#     * make NATIVE_COVERAGE=true NATIVE_COVERAGE_PATHS='*'
23# 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.
29# 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
36if [ "$CLANG_COVERAGE" == "true" ]; then
37  echo "CLANG_COVERAGE is set.  Use development/scripts/acov-llvm.py instead."
38  exit 0
39fi
40
41ANDROID_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
56if [ "$1" = "--clean" ]; then
57  echo "Clearing gcda and gcno files from the local build."
58  clearGcdaFiles
59  clearGcnoFiles
60  exit 0
61fi
62
63if [ "$1" = "--prep" ]; then
64  echo "Clearing gcda files from the local build."
65  clearGcdaFiles
66  exit 0
67fi
68
69adb root
70
71if [ "$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
91  exit 0
92fi
93
94which lcov >/dev/null 2>/dev/null
95if [ $? -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
101DIR=$(mktemp -d covreport-XXXXXX)
102
103# 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 -
109
110  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
118echo "Generating coverage report at $DIR"
119genhtml -q -o $DIR $DIR/$FILE
120xdg-open $DIR/index.html >/dev/null
121