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