#!/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. # Quiet by default set +x echo echo === Vulkan Validation Layers Tests === echo Running test script: build-android/test_APK.sh echo # # Parse parameters # function printUsage { echo "Supported parameters are:" echo " -p|--platform (optional)" echo " -f|--filter (optional)" echo " -s|--serial (optional)" echo " -a|--abi (optional)" echo echo "i.e. ${0##*/} -p -f -s " 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 ;; -a|--abi) abi="$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 if [[ $abi ]]; then echo abi = "${abi}"; fi set -e echo echo Setting up... # # 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 echo echo Installing ./bin/VulkanLayerValidationTests.apk... # Install the current build if [[ -z $abi ]] then adb $serialFlag install -r bin/VulkanLayerValidationTests.apk else adb $serialFlag install --abi $abi -r bin/VulkanLayerValidationTests.apk fi echo echo Launching tests... # 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 echo VulkanLayerValidationTests PASSED! echo 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 echo VulkanLayerValidationTests FAILED! echo 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 echo VulkanLayerValidationTests CRASHED! echo 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 echo echo Fetching test output and filtered logcat text... # Avoid characters that are illegal in Windows filenames, so these # files can be archived to a Windows host system for later reference today=$(date +%Y%m%d-%H%M%S) outFile="VulkanLayerValidationTests.$platform.$today.out.txt" errFile="VulkanLayerValidationTests.$platform.$today.err.txt" logFile="VulkanLayerValidationTests.$platform.$today.logcat.txt" adb $serialFlag pull /sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt $outFile adb $serialFlag pull /sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt $errFile adb $serialFlag logcat -d | grep VulkanLayerValidationTests > $logFile if [ -f $outFile ]; then echo $outFile size $(wc -c < $outFile) fi if [ -f $errFile ]; then echo $errFile size $(wc -c < $errFile) fi if [ -f $logFile ]; then echo $logFile size $(wc -c < $logFile) fi if [ $exitCode -ne 0 ] then echo echo VulkanLayerValidationTests result status is unsuccessful. Dumping test output file: echo ========================================================================================= cat $outFile echo ========================================================================================= echo echo echo Dumping logcat text, filtered by ''"VulkanLayerValidationTests"'': echo ========================================================================================= cat $logFile echo ========================================================================================= fi exit $exitCode