summaryrefslogtreecommitdiff
path: root/build-android
diff options
context:
space:
mode:
authorCody Northrop <cnorthrop@google.com>2017-04-11 11:05:44 -0600
committerCody Northrop <cnorthrop@google.com>2017-04-18 10:47:32 -0600
commit4b1fdeb53926874ca8dc18c4c5ad0c7aa2a08eef (patch)
treefec42f030edd1c20408bf94e6d8259e476964498 /build-android
parent18877cbc5b5283834f4f126d030ceed9dbe51e8d (diff)
android: Add test_APK script for layer validation
This is a script we've been using internally for a while, no reason not to make it public. It installs our layer validation tests, runs them, and gathers output. Improvements are welcome! Usage: ./test_APK.sh -s <serial number> -p <plaform name> -f <gtest_filter>
Diffstat (limited to 'build-android')
-rwxr-xr-xbuild-android/test_APK.sh239
1 files changed, 239 insertions, 0 deletions
diff --git a/build-android/test_APK.sh b/build-android/test_APK.sh
new file mode 100755
index 00000000..801b16fa
--- /dev/null
+++ b/build-android/test_APK.sh
@@ -0,0 +1,239 @@
+#!/bin/bash
+
+# Copyright 2017 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.
+
+#
+# Parse parameters
+#
+
+function printUsage {
+ echo "Supported parameters are:"
+ echo " -p|--platform <platform> (optional)"
+ echo " -f|--filter <gtest filter list> (optional)"
+ echo " -s|--serial <target device serial number> (optional)"
+ echo
+ echo "i.e. ${0##*/} -p <platform> -f <test filter> -s <serial number>"
+ exit 1
+}
+
+if [[ $(($# % 2)) -ne 0 ]]
+then
+ echo Parameters must be provided in pairs.
+ echo parameter count = $#
+ echo
+ printUsage
+ exit 1
+fi
+
+while [[ $# -gt 0 ]]
+do
+ case $1 in
+ -p|--platform)
+ platform="$2"
+ shift 2
+ ;;
+ -f|--filter)
+ filter="$2"
+ shift 2
+ ;;
+ -s|--serial)
+ serial="$2"
+ shift 2
+ ;;
+ -*)
+ # unknown option
+ echo Unknown option: $1
+ echo
+ printUsage
+ exit 1
+ ;;
+ esac
+done
+
+if [[ $serial ]]; then
+ serialFlag="-s $serial"
+ if [[ $(adb devices) != *"$serial"* ]]
+ then
+ echo Device not found: "${serial}"
+ echo
+ printUsage
+ exit 1
+ fi
+else
+ echo Using device $(adb get-serialno)
+fi
+
+if [[ -z $platform ]]
+then
+ echo No platform specified.
+ platform="UnspecifiedPlatform"
+fi
+
+if [[ -z $filter ]]
+then
+ echo No filter specified, running all tests.
+ filter="*"
+fi
+
+if [[ $platform ]]; then echo platform = "${platform}"; fi
+if [[ $filter ]]; then echo filter = "${filter}"; fi
+if [[ $serial ]]; then echo serial = "${serial}"; fi
+
+set -ev
+
+#
+# Start up
+#
+
+# Wake up the device
+adb $serialFlag shell input keyevent "KEYCODE_MENU"
+adb $serialFlag shell input keyevent "KEYCODE_HOME"
+
+# Grab our Android test mutex
+# Wait for any existing test runs on the devices
+
+# Blow away the lock if tests run too long, avoiding infinite loop
+lock_seconds=1200 # Duration in seconds.
+lock_end_time=$(( $(date +%s) + lock_seconds )) # Calculate end time.
+
+until mkdir /var/tmp/VkLayerValidationTests.$serial.lock
+do
+ sleep 5
+ echo "Waiting for existing Android test to complete on $serial"
+
+ if [ $(date +%s) -gt $lock_end_time ]
+ then
+ echo "Lock timeout reached: $lock_seconds seconds"
+ echo "Deleting /var/tmp/VkLayerValidationTests.$serial.lock"
+ rm -r /var/tmp/VkLayerValidationTests.$serial.lock
+ fi
+done
+
+# Clean up our lock on any exit condition
+function finish {
+ rm -r /var/tmp/VkLayerValidationTests.$serial.lock
+}
+trap finish EXIT
+
+# Clear the log
+adb $serialFlag logcat -c
+
+# Ensure any previous activity has stopped, otherwise it won't run tests
+adb $serialFlag shell am force-stop com.example.VulkanLayerValidationTests
+
+# Remove any existing APK that may have been installed from another host
+# Disable exit on error in case the APK is not present
+set +e
+adb $serialFlag shell pm list packages | grep com.example.VulkanLayerValidationTests
+if [ $? -eq 0 ]
+then
+ adb $serialFlag uninstall com.example.VulkanLayerValidationTests
+fi
+# Re-enable exit on error
+set -e
+
+# Install the current build
+adb $serialFlag install -r bin/VulkanLayerValidationTests.apk
+
+# Kick off the tests with known expection list
+adb $serialFlag shell am start -a android.intent.action.MAIN -c android-intent.category.LAUNCH -n com.example.VulkanLayerValidationTests/android.app.NativeActivity --es args --gtest_filter="${filter}"
+
+#
+# Scrape the log until we get pass/fail/crash
+#
+
+# The following loop will give tests 20 minutes to pass/fail/crash
+seconds=1200 # Duration in seconds.
+endTime=$(( $(date +%s) + seconds )) # Calculate end time.
+
+exitCode=-1;
+
+# Disable exit on error, we expect grep to fail multiple times in this loop
+set +e
+
+while [ $(date +%s) -lt $endTime ]; do # Loop until interval has elapsed.
+
+ # The following line is printed from android_main on success
+ adb $serialFlag logcat -d | grep "==== Tests PASSED ===="
+ if [ $? -eq 0 ]
+ then
+ echo VulkanLayerValidationTests PASSED!
+ exitCode=0
+ break
+ fi
+
+ # The following line is printed from android_main on failure
+ adb $serialFlag logcat -d | grep "==== Tests FAILED ===="
+ if [ $? -eq 0 ]
+ then
+ echo VulkanLayerValidationTests FAILED!
+ exitCode=1
+ break
+ fi
+
+ # developer.android.com recommends searching for the following string to detect native crash
+ adb $serialFlag logcat -d | grep "\*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\*"
+ if [ $? -eq 0 ]
+ then
+ exitCode=2
+ echo VulkanLayerValidationTests CRASHED!
+ break
+ fi
+
+ sleep 5
+
+done
+
+# Re-enable exit on error
+set -e
+
+if [ $exitCode -eq -1 ]
+then
+ echo "VulkanLayerValidationTests hasn't completed in $seconds seconds. Script exiting."
+fi
+
+#
+# Cleanup
+#
+
+# Return to home screen to clear any error pop-ups
+adb $serialFlag shell input keyevent "KEYCODE_HOME"
+
+# Stop the activity
+adb $serialFlag shell am force-stop com.example.VulkanLayerValidationTests
+
+today=$(date +%Y-%m-%d.%H:%M:%S)
+outFile="VulkanLayerValidationTests.$platform.$today.out.txt"
+errFile="VulkanLayerValidationTests.$platform.$today.err.txt"
+adb $serialFlag pull /sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt VulkanLayerValidationTests.$platform.$today.out.txt
+adb $serialFlag pull /sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt VulkanLayerValidationTests.$platform.$today.err.txt
+
+if [ -f $outFile ]; then
+ echo $outFile size $(wc -c < $outFile)
+fi
+
+if [ -f $errFile ]; then
+ echo $errFile size $(wc -c < $errFile)
+fi
+
+echo
+echo ===== Dumping logcat of VulkanLayerValidationTests =====
+echo If the test is crashing, be sure to inspect full log for complete stack trace.
+echo "adb $serialFlag logcat -d | grep VulkanLayerValidationTests"
+echo ========================================================
+echo
+adb $serialFlag logcat -d | grep VulkanLayerValidationTests
+
+exit $exitCode