From fb0b0d5a2bb89a6a7d5137e0c610e2c5105c26d3 Mon Sep 17 00:00:00 2001 From: Jordan Kiley Date: Wed, 13 Mar 2019 12:58:24 -0700 Subject: [PATCH] [ios] Generate iOS code coverage for metrics (#14015) --- ci.template | 1 + circle.yml | 4 +++ .../xcshareddata/xcschemes/CI.xcscheme | 11 ++++++ platform/ios/scripts/ios-code-coverage.sh | 31 ++++++++++++++++ scripts/code-coverage.sh | 35 +++++++++++++++++++ 5 files changed, 82 insertions(+) create mode 100755 platform/ios/scripts/ios-code-coverage.sh create mode 100755 scripts/code-coverage.sh diff --git a/ci.template b/ci.template index 5a94771a7..77a204dba 100644 --- a/ci.template +++ b/ci.template @@ -160,6 +160,7 @@ "Effect": "Allow", "Resource": [ "arn:aws:s3:::mapbox-loading-dock/raw/mobile.binarysize/*", + "arn:aws:s3:::mapbox-loading-dock/raw/mobile.codecoverage/*" "arn:aws:s3:::mapbox-loading-dock/raw/mobile_staging.docs_coverage/*" ] } diff --git a/circle.yml b/circle.yml index e48f6adbd..6bd4c9d72 100644 --- a/circle.yml +++ b/circle.yml @@ -929,6 +929,10 @@ jobs: - run: name: Build and run SDK unit tests with thread and undefined behavior sanitizers command: make ios-sanitize + - run: + name: Get iOS code coverage + command: | + platform/ios/scripts/ios-code-coverage.sh CI - save-dependencies - collect-xcode-build-logs - upload-xcode-build-logs diff --git a/platform/ios/ios.xcodeproj/xcshareddata/xcschemes/CI.xcscheme b/platform/ios/ios.xcodeproj/xcshareddata/xcschemes/CI.xcscheme index 6b018e133..7d59c4ede 100644 --- a/platform/ios/ios.xcodeproj/xcshareddata/xcschemes/CI.xcscheme +++ b/platform/ios/ios.xcodeproj/xcshareddata/xcschemes/CI.xcscheme @@ -54,7 +54,18 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + codeCoverageEnabled = "YES" + onlyGenerateCoverageForSpecifiedTargets = "YES" shouldUseLaunchSchemeArgsEnv = "NO"> + + + + diff --git a/platform/ios/scripts/ios-code-coverage.sh b/platform/ios/scripts/ios-code-coverage.sh new file mode 100755 index 000000000..8b8adb423 --- /dev/null +++ b/platform/ios/scripts/ios-code-coverage.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +# +# Get code coverage report, then convert it to JSON. +# The coverage reports end up in different locations based on whether coverage +# is generated via CI or locally. +# +cov_result=""; +if [ -f build/ios/Logs/Test/*.xcresult/*_Test/*.xccovreport ]; then + cov_result=build/ios/Logs/Test/*.xcresult/*_Test/*.xccovreport +elif [ -f build/ios/ios/Logs/Test/*.xcresult/*_Test/*.xccovreport ]; then + cov_result=build/ios/ios/Logs/Test/*.xcresult/*_Test/*.xccovreport +else + echo "Coverage file does not exist. Please run tests before executing" + exit 1 +fi + +xcrun xccov view $cov_result --json > output.json + +# +# Convert the line coverage for the dynamic target to a percentage. Currently, +# only CI tests are included when calculated code coverage. +# +percentage=`node -e "console.log(require('./output.json').lineCoverage)"` +cov=$(printf "%.2f" $(echo "$percentage*100" | bc -l)) + +# Generate a formatted JSON file and upload it to S3. +./././scripts/code-coverage.sh $cov "iOS" "$1" diff --git a/scripts/code-coverage.sh b/scripts/code-coverage.sh new file mode 100755 index 000000000..d6866f61b --- /dev/null +++ b/scripts/code-coverage.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +# +# This script takes three values: $1 should be a decimal value reflecting the +# percentage of lines covered, with a maximum value of 100.0, $2 is +# the platform the percentage pertains to (iOS or Android), and $3 is the +# test scheme being run (on iOS, this is currently CI). +# + +# Check that platform input values are valid. + +if [[ ! $2 = "iOS" && ! $2 = "Android" ]]; then + echo "$2 does not match either 'iOS' or 'Android'. Platform must be specified for coverage report." + exit 1 +fi + +# Create a formatted JSON file that contains the current coverage. + +current_date=$(TZ=UTC date +"%Y-%m-%d") +file_name=$2_coverage.json +cat < $file_name + {"code_coverage":$1,"platform":"$2","sdk":"Maps","scheme":"$3","created_at":"$current_date"} +EOF +gzip -f $file_name + +if [ -z `which aws` ]; then + brew install awscli +fi + +aws s3 cp $file_name.gz s3://mapbox-loading-dock/raw/mobile.codecoverage/$current_date/ +echo $ +