#!/bin/sh
# Copyright (C) 2014 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#
# acov is a tool for gathering coverage information from a device and generating
# a report from that information. To use:
#
# 1. sudo apt-get install lcov
# 2. Build application/library with coverage information.
#     * make NATIVE_COVERAGE=true NATIVE_COVERAGE_PATHS='*'
# 3. Push the new binaries to the device with adb sync.
# (Optional): Run `acov --clean-device`. This will reset coverage for everything
#      on the device.
# 4. Run tests.
# (Optional): Run `acov --flush`. This will dump coverage from all processes
#      running on the device.
# 5. Run `acov`.
#
# acov will pull all coverage information from the device, push it to the right
# directories, run lcov, and display the coverage report (currently by opening
# it in your browser).
#

ANDROID_OUT=${OUT_DIR:-out}
FLUSH_SLEEP=${FLUSH_SLEEP:-60}

function clearGcdaFiles() {
  if [ -d "$ANDROID_OUT" ]; then
    find $ANDROID_OUT -name '*.gcda' -delete
  fi
}

function clearGcnoFiles() {
  if [ -d "$ANDROID_OUT" ]; then
    find $ANDROID_OUT -name '*.gcno' -delete
  fi
}

if [ "$1" = "--clean" ]; then
  echo "Clearing gcda and gcno files from the local build."
  clearGcdaFiles
  clearGcnoFiles
  exit 0
fi

if [ "$1" = "--prep" ]; then
  echo "Clearing gcda files from the local build."
  clearGcdaFiles
  exit 0
fi

adb root

if [ "$1" = "--clean-device" ]; then
  echo "Resetting coverage on the device..."
  adb shell kill -37 -1
  echo "Waiting $FLUSH_SLEEP seconds for coverage to be written..."
  sleep $FLUSH_SLEEP
  adb shell rm -rf /data/misc/trace/*
  exit 0
fi

if [ "$1" = "--flush" ]; then
  shift
  if [ -z $@ ]; then
    echo "Flushing coverage for all processes on the device..."
    adb shell kill -37 -1
  else
    echo "Flushing coverage for [$@] on the device..."
    adb shell kill -37 $(adb shell pidof $@)
  fi
  echo "Waiting $FLUSH_SLEEP seconds for coverage to be written..."
  sleep $FLUSH_SLEEP
  exit 0
fi

which lcov >/dev/null 2>/dev/null
if [ $? -ne 0 ]; then
  echo 'lcov not found: running `sudo apt-get install lcov`'
  sudo apt-get install lcov
fi

cd $ANDROID_BUILD_TOP
DIR=$(mktemp -d covreport-XXXXXX)

# Build a coverage report for each euid that has reported coverage.
COVERAGE_REPORTS=
for USER_ID in $(adb shell ls /data/misc/trace)
do
  FILE=cov-$USER_ID.info
  adb shell tar -czf - -C /data/misc/trace/$USER_ID/proc/self/cwd $ANDROID_OUT | tar zxvf -

  lcov -c -d $ANDROID_OUT -o $DIR/$FILE --gcov-tool=llvm-gcov $@
  COVERAGE_REPORTS="-a $DIR/$FILE $COVERAGE_REPORTS"

  clearGcdaFiles
done

FILE=merged.info
lcov $COVERAGE_REPORTS -o $DIR/$FILE
echo "Generating coverage report at $DIR"
genhtml -q -o $DIR $DIR/$FILE
xdg-open $DIR/index.html >/dev/null
