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