1#!/bin/sh
2
3# A shell script to generate a coverage report for opt/net/wifi
4
5if [[ ! ($# == 1) ]]; then
6  echo "$0: usage: coverage.sh OUTPUT_DIR"
7  exit 1
8fi
9
10if [ -z $ANDROID_BUILD_TOP ]; then
11  echo "You need to source and lunch before you can use this script"
12  exit 1
13fi
14
15# Make the output directory and get its full name
16OUTPUT_DIR="$1"
17mkdir -p $OUTPUT_DIR || exit 1
18OUTPUT_DIR="`(cd $OUTPUT_DIR && pwd)`"
19BUILD_OUT_DIR=$OUTPUT_DIR/out
20echo "Output dir: $OUTPUT_DIR"
21
22cd "$(dirname $0)" #cd to directory containing this script
23
24echo "Checking jacoco patterns"
25class_patterns_from_filenames () {
26  sed -e 's/[.]java$//' -e 's@/@.@g' |
27    while read x; do
28      printf '            "%s",\n' "$x"
29      printf '            "%s$*",\n' "$x"
30      printf '            "%s.**",\n' "$x"
31    done
32}
33
34generate_new_bp () (
35  sed -n -e p -e '/include_filter:/q' < Android.bp
36  (cd ../../service/java && find * -name \*.java) |
37    LC_ALL=C sort |
38    class_patterns_from_filenames
39  tail -n 3 Android.bp
40)
41
42generate_new_bp > $OUTPUT_DIR/bp
43
44diff -u Android.bp $OUTPUT_DIR/bp || {
45  mv $OUTPUT_DIR/bp Android.bp
46  echo "Android.bp has been updated. Please review and check in the new version"
47  exit 1
48}
49rm -f $OUTPUT_DIR/bp
50
51REMOTE_COVERAGE_OUTPUT_FILE=/data/data/com.android.server.wifi.test/files/coverage.ec
52COVERAGE_OUTPUT_FILE=$OUTPUT_DIR/wifi_coverage.ec
53
54# Note - the $VARs in the following are expanded by the here-file redirection!
55echo "Building for coverage report"
56bash <<END_OF_BUILD_SCRIPT || { exit 1; }
57  cd $ANDROID_BUILD_TOP
58  source build/make/envsetup.sh
59  lunch ${TARGET_PRODUCT}-${TARGET_BUILD_VARIANT}
60  export OUT_DIR=${BUILD_OUT_DIR}
61  export EMMA_INSTRUMENT=true
62  export EMMA_INSTRUMENT_FRAMEWORK=false
63  export EMMA_INSTRUMENT_STATIC=true
64  export ANDROID_COMPILE_WITH_JACK=false
65  export SKIP_BOOT_JARS_CHECK=true
66  m FrameworksWifiTests jacoco-cli
67END_OF_BUILD_SCRIPT
68
69APK_NAME="$(find $BUILD_OUT_DIR/target/product -name FrameworksWifiTests.apk | \
70              grep -v /symbols/)"
71REPORTER_JAR="$(find $BUILD_OUT_DIR/host -name jacoco-cli.jar)"
72
73echo "Running tests and generating coverage report"
74
75set -e # fail early
76set -x # print commands
77test -f "$APK_NAME"
78test -f "$REPORTER_JAR"
79
80adb root
81adb wait-for-device
82
83adb shell rm -f $REMOTE_COVERAGE_OUTPUT_FILE
84
85adb install -r -g "$APK_NAME"
86
87adb shell am instrument -e coverage true --no-hidden-api-checks \
88  -w 'com.android.server.wifi.test/com.android.server.wifi.CustomTestRunner'
89
90adb pull $REMOTE_COVERAGE_OUTPUT_FILE $COVERAGE_OUTPUT_FILE
91
92java -jar $REPORTER_JAR \
93  report \
94  --html $OUTPUT_DIR \
95  --classfiles $BUILD_OUT_DIR/target/common/obj/APPS/FrameworksWifiTests_intermediates/jacoco-report-classes.jar \
96  --sourcefiles $ANDROID_BUILD_TOP/frameworks/opt/net/wifi/service/java \
97  --name wifi-coverage \
98  $COVERAGE_OUTPUT_FILE
99set +x
100
101echo Created report at file://$OUTPUT_DIR/index.html
102
103