xref: /aosp_15_r20/external/vulkan-validation-layers/build-android/test_APK.sh (revision b7893ccf7851cd6a48cc5a1e965257d8a5cdcc70)
1*b7893ccfSSadaf Ebrahimi#!/bin/bash
2*b7893ccfSSadaf Ebrahimi
3*b7893ccfSSadaf Ebrahimi# Copyright 2017 The Android Open Source Project
4*b7893ccfSSadaf Ebrahimi#
5*b7893ccfSSadaf Ebrahimi# Licensed under the Apache License, Version 2.0 (the "License");
6*b7893ccfSSadaf Ebrahimi# you may not use this file except in compliance with the License.
7*b7893ccfSSadaf Ebrahimi# You may obtain a copy of the License at
8*b7893ccfSSadaf Ebrahimi#
9*b7893ccfSSadaf Ebrahimi#      http://www.apache.org/licenses/LICENSE-2.0
10*b7893ccfSSadaf Ebrahimi#
11*b7893ccfSSadaf Ebrahimi# Unless required by applicable law or agreed to in writing, software
12*b7893ccfSSadaf Ebrahimi# distributed under the License is distributed on an "AS IS" BASIS,
13*b7893ccfSSadaf Ebrahimi# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*b7893ccfSSadaf Ebrahimi# See the License for the specific language governing permissions and
15*b7893ccfSSadaf Ebrahimi# limitations under the License.
16*b7893ccfSSadaf Ebrahimi
17*b7893ccfSSadaf Ebrahimi# Quiet by default
18*b7893ccfSSadaf Ebrahimiset +x
19*b7893ccfSSadaf Ebrahimi
20*b7893ccfSSadaf Ebrahimiecho
21*b7893ccfSSadaf Ebrahimiecho === Vulkan Validation Layers Tests ===
22*b7893ccfSSadaf Ebrahimiecho Running test script: build-android/test_APK.sh
23*b7893ccfSSadaf Ebrahimiecho
24*b7893ccfSSadaf Ebrahimi
25*b7893ccfSSadaf Ebrahimi#
26*b7893ccfSSadaf Ebrahimi# Parse parameters
27*b7893ccfSSadaf Ebrahimi#
28*b7893ccfSSadaf Ebrahimi
29*b7893ccfSSadaf Ebrahimifunction printUsage {
30*b7893ccfSSadaf Ebrahimi   echo "Supported parameters are:"
31*b7893ccfSSadaf Ebrahimi   echo "    -p|--platform <platform> (optional)"
32*b7893ccfSSadaf Ebrahimi   echo "    -f|--filter <gtest filter list> (optional)"
33*b7893ccfSSadaf Ebrahimi   echo "    -s|--serial <target device serial number> (optional)"
34*b7893ccfSSadaf Ebrahimi   echo "    -a|--abi <target abi> (optional)"
35*b7893ccfSSadaf Ebrahimi   echo
36*b7893ccfSSadaf Ebrahimi   echo "i.e. ${0##*/} -p <platform> -f <test filter> -s <serial number>"
37*b7893ccfSSadaf Ebrahimi   exit 1
38*b7893ccfSSadaf Ebrahimi}
39*b7893ccfSSadaf Ebrahimi
40*b7893ccfSSadaf Ebrahimiif [[ $(($# % 2)) -ne 0 ]]
41*b7893ccfSSadaf Ebrahimithen
42*b7893ccfSSadaf Ebrahimi    echo Parameters must be provided in pairs.
43*b7893ccfSSadaf Ebrahimi    echo parameter count = $#
44*b7893ccfSSadaf Ebrahimi    echo
45*b7893ccfSSadaf Ebrahimi    printUsage
46*b7893ccfSSadaf Ebrahimi    exit 1
47*b7893ccfSSadaf Ebrahimifi
48*b7893ccfSSadaf Ebrahimi
49*b7893ccfSSadaf Ebrahimiwhile [[ $# -gt 0 ]]
50*b7893ccfSSadaf Ebrahimido
51*b7893ccfSSadaf Ebrahimi    case $1 in
52*b7893ccfSSadaf Ebrahimi        -p|--platform)
53*b7893ccfSSadaf Ebrahimi            platform="$2"
54*b7893ccfSSadaf Ebrahimi            shift 2
55*b7893ccfSSadaf Ebrahimi            ;;
56*b7893ccfSSadaf Ebrahimi        -f|--filter)
57*b7893ccfSSadaf Ebrahimi            filter="$2"
58*b7893ccfSSadaf Ebrahimi            shift 2
59*b7893ccfSSadaf Ebrahimi            ;;
60*b7893ccfSSadaf Ebrahimi        -s|--serial)
61*b7893ccfSSadaf Ebrahimi            serial="$2"
62*b7893ccfSSadaf Ebrahimi            shift 2
63*b7893ccfSSadaf Ebrahimi            ;;
64*b7893ccfSSadaf Ebrahimi        -a|--abi)
65*b7893ccfSSadaf Ebrahimi            abi="$2"
66*b7893ccfSSadaf Ebrahimi            shift 2
67*b7893ccfSSadaf Ebrahimi            ;;
68*b7893ccfSSadaf Ebrahimi        -*)
69*b7893ccfSSadaf Ebrahimi            # unknown option
70*b7893ccfSSadaf Ebrahimi            echo Unknown option: $1
71*b7893ccfSSadaf Ebrahimi            echo
72*b7893ccfSSadaf Ebrahimi            printUsage
73*b7893ccfSSadaf Ebrahimi            exit 1
74*b7893ccfSSadaf Ebrahimi            ;;
75*b7893ccfSSadaf Ebrahimi    esac
76*b7893ccfSSadaf Ebrahimidone
77*b7893ccfSSadaf Ebrahimi
78*b7893ccfSSadaf Ebrahimiif [[ $serial ]]; then
79*b7893ccfSSadaf Ebrahimi    serialFlag="-s $serial"
80*b7893ccfSSadaf Ebrahimi    if [[ $(adb devices) != *"$serial"* ]]
81*b7893ccfSSadaf Ebrahimi    then
82*b7893ccfSSadaf Ebrahimi        echo Device not found: "${serial}"
83*b7893ccfSSadaf Ebrahimi        echo
84*b7893ccfSSadaf Ebrahimi        printUsage
85*b7893ccfSSadaf Ebrahimi        exit 1
86*b7893ccfSSadaf Ebrahimi    fi
87*b7893ccfSSadaf Ebrahimielse
88*b7893ccfSSadaf Ebrahimi    echo Using device $(adb get-serialno)
89*b7893ccfSSadaf Ebrahimifi
90*b7893ccfSSadaf Ebrahimi
91*b7893ccfSSadaf Ebrahimiif [[ -z $platform ]]
92*b7893ccfSSadaf Ebrahimithen
93*b7893ccfSSadaf Ebrahimi    echo No platform specified.
94*b7893ccfSSadaf Ebrahimi    platform="UnspecifiedPlatform"
95*b7893ccfSSadaf Ebrahimifi
96*b7893ccfSSadaf Ebrahimi
97*b7893ccfSSadaf Ebrahimiif [[ -z $filter ]]
98*b7893ccfSSadaf Ebrahimithen
99*b7893ccfSSadaf Ebrahimi    echo No filter specified, running all tests.
100*b7893ccfSSadaf Ebrahimi    filter="*"
101*b7893ccfSSadaf Ebrahimifi
102*b7893ccfSSadaf Ebrahimi
103*b7893ccfSSadaf Ebrahimiif [[ $platform ]]; then echo platform = "${platform}"; fi
104*b7893ccfSSadaf Ebrahimiif [[ $filter ]]; then echo filter = "${filter}"; fi
105*b7893ccfSSadaf Ebrahimiif [[ $serial ]]; then echo serial = "${serial}"; fi
106*b7893ccfSSadaf Ebrahimiif [[ $abi ]]; then echo abi = "${abi}"; fi
107*b7893ccfSSadaf Ebrahimi
108*b7893ccfSSadaf Ebrahimiset -e
109*b7893ccfSSadaf Ebrahimi
110*b7893ccfSSadaf Ebrahimiecho
111*b7893ccfSSadaf Ebrahimiecho Setting up...
112*b7893ccfSSadaf Ebrahimi
113*b7893ccfSSadaf Ebrahimi#
114*b7893ccfSSadaf Ebrahimi# Start up
115*b7893ccfSSadaf Ebrahimi#
116*b7893ccfSSadaf Ebrahimi
117*b7893ccfSSadaf Ebrahimi# Wake up the device
118*b7893ccfSSadaf Ebrahimiadb $serialFlag shell input keyevent "KEYCODE_MENU"
119*b7893ccfSSadaf Ebrahimiadb $serialFlag shell input keyevent "KEYCODE_HOME"
120*b7893ccfSSadaf Ebrahimi
121*b7893ccfSSadaf Ebrahimi# Grab our Android test mutex
122*b7893ccfSSadaf Ebrahimi# Wait for any existing test runs on the devices
123*b7893ccfSSadaf Ebrahimi
124*b7893ccfSSadaf Ebrahimi# Blow away the lock if tests run too long, avoiding infinite loop
125*b7893ccfSSadaf Ebrahimilock_seconds=1200                                # Duration in seconds.
126*b7893ccfSSadaf Ebrahimilock_end_time=$(( $(date +%s) + lock_seconds ))  # Calculate end time.
127*b7893ccfSSadaf Ebrahimi
128*b7893ccfSSadaf Ebrahimiuntil mkdir /var/tmp/VkLayerValidationTests.$serial.lock
129*b7893ccfSSadaf Ebrahimido
130*b7893ccfSSadaf Ebrahimi    sleep 5
131*b7893ccfSSadaf Ebrahimi    echo "Waiting for existing Android test to complete on $serial"
132*b7893ccfSSadaf Ebrahimi
133*b7893ccfSSadaf Ebrahimi    if [ $(date +%s) -gt $lock_end_time ]
134*b7893ccfSSadaf Ebrahimi    then
135*b7893ccfSSadaf Ebrahimi        echo "Lock timeout reached: $lock_seconds seconds"
136*b7893ccfSSadaf Ebrahimi        echo "Deleting /var/tmp/VkLayerValidationTests.$serial.lock"
137*b7893ccfSSadaf Ebrahimi        rm -r /var/tmp/VkLayerValidationTests.$serial.lock
138*b7893ccfSSadaf Ebrahimi    fi
139*b7893ccfSSadaf Ebrahimidone
140*b7893ccfSSadaf Ebrahimi
141*b7893ccfSSadaf Ebrahimi# Clean up our lock on any exit condition
142*b7893ccfSSadaf Ebrahimifunction finish {
143*b7893ccfSSadaf Ebrahimi   rm -r /var/tmp/VkLayerValidationTests.$serial.lock
144*b7893ccfSSadaf Ebrahimi}
145*b7893ccfSSadaf Ebrahimitrap finish EXIT
146*b7893ccfSSadaf Ebrahimi
147*b7893ccfSSadaf Ebrahimi# Clear the log
148*b7893ccfSSadaf Ebrahimiadb $serialFlag logcat -c
149*b7893ccfSSadaf Ebrahimi
150*b7893ccfSSadaf Ebrahimi# Ensure any previous activity has stopped, otherwise it won't run tests
151*b7893ccfSSadaf Ebrahimiadb $serialFlag shell am force-stop com.example.VulkanLayerValidationTests
152*b7893ccfSSadaf Ebrahimi
153*b7893ccfSSadaf Ebrahimi# Remove any existing APK that may have been installed from another host
154*b7893ccfSSadaf Ebrahimi# Disable exit on error in case the APK is not present
155*b7893ccfSSadaf Ebrahimiset +e
156*b7893ccfSSadaf Ebrahimiadb $serialFlag shell pm list packages | grep com.example.VulkanLayerValidationTests
157*b7893ccfSSadaf Ebrahimiif [ $? -eq 0 ]
158*b7893ccfSSadaf Ebrahimithen
159*b7893ccfSSadaf Ebrahimi    adb $serialFlag uninstall com.example.VulkanLayerValidationTests
160*b7893ccfSSadaf Ebrahimifi
161*b7893ccfSSadaf Ebrahimi# Re-enable exit on error
162*b7893ccfSSadaf Ebrahimiset -e
163*b7893ccfSSadaf Ebrahimi
164*b7893ccfSSadaf Ebrahimiecho
165*b7893ccfSSadaf Ebrahimiecho Installing ./bin/VulkanLayerValidationTests.apk...
166*b7893ccfSSadaf Ebrahimi
167*b7893ccfSSadaf Ebrahimi# Install the current build
168*b7893ccfSSadaf Ebrahimiif [[ -z $abi ]]
169*b7893ccfSSadaf Ebrahimithen
170*b7893ccfSSadaf Ebrahimi  adb $serialFlag install -r bin/VulkanLayerValidationTests.apk
171*b7893ccfSSadaf Ebrahimielse
172*b7893ccfSSadaf Ebrahimi  adb $serialFlag install --abi $abi -r bin/VulkanLayerValidationTests.apk
173*b7893ccfSSadaf Ebrahimifi
174*b7893ccfSSadaf Ebrahimi
175*b7893ccfSSadaf Ebrahimiecho
176*b7893ccfSSadaf Ebrahimiecho Launching tests...
177*b7893ccfSSadaf Ebrahimi
178*b7893ccfSSadaf Ebrahimi# Kick off the tests with known expection list
179*b7893ccfSSadaf Ebrahimiadb $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}"
180*b7893ccfSSadaf Ebrahimi
181*b7893ccfSSadaf Ebrahimi#
182*b7893ccfSSadaf Ebrahimi# Scrape the log until we get pass/fail/crash
183*b7893ccfSSadaf Ebrahimi#
184*b7893ccfSSadaf Ebrahimi
185*b7893ccfSSadaf Ebrahimi# The following loop will give tests 20 minutes to pass/fail/crash
186*b7893ccfSSadaf Ebrahimiseconds=1200                          # Duration in seconds.
187*b7893ccfSSadaf EbrahimiendTime=$(( $(date +%s) + seconds ))  # Calculate end time.
188*b7893ccfSSadaf Ebrahimi
189*b7893ccfSSadaf EbrahimiexitCode=-1;
190*b7893ccfSSadaf Ebrahimi
191*b7893ccfSSadaf Ebrahimi# Disable exit on error, we expect grep to fail multiple times in this loop
192*b7893ccfSSadaf Ebrahimiset +e
193*b7893ccfSSadaf Ebrahimi
194*b7893ccfSSadaf Ebrahimiwhile [ $(date +%s) -lt $endTime ]; do  # Loop until interval has elapsed.
195*b7893ccfSSadaf Ebrahimi
196*b7893ccfSSadaf Ebrahimi    # The following line is printed from android_main on success
197*b7893ccfSSadaf Ebrahimi    adb $serialFlag logcat -d | grep "==== Tests PASSED ===="
198*b7893ccfSSadaf Ebrahimi    if [ $? -eq 0 ]
199*b7893ccfSSadaf Ebrahimi    then
200*b7893ccfSSadaf Ebrahimi        echo
201*b7893ccfSSadaf Ebrahimi        echo VulkanLayerValidationTests PASSED!
202*b7893ccfSSadaf Ebrahimi        echo
203*b7893ccfSSadaf Ebrahimi        exitCode=0
204*b7893ccfSSadaf Ebrahimi        break
205*b7893ccfSSadaf Ebrahimi    fi
206*b7893ccfSSadaf Ebrahimi
207*b7893ccfSSadaf Ebrahimi    # The following line is printed from android_main on failure
208*b7893ccfSSadaf Ebrahimi    adb $serialFlag logcat -d | grep "==== Tests FAILED ===="
209*b7893ccfSSadaf Ebrahimi    if [ $? -eq 0 ]
210*b7893ccfSSadaf Ebrahimi    then
211*b7893ccfSSadaf Ebrahimi        echo
212*b7893ccfSSadaf Ebrahimi        echo VulkanLayerValidationTests FAILED!
213*b7893ccfSSadaf Ebrahimi        echo
214*b7893ccfSSadaf Ebrahimi        exitCode=1
215*b7893ccfSSadaf Ebrahimi        break
216*b7893ccfSSadaf Ebrahimi    fi
217*b7893ccfSSadaf Ebrahimi
218*b7893ccfSSadaf Ebrahimi    # developer.android.com recommends searching for the following string to detect native crash
219*b7893ccfSSadaf Ebrahimi    adb $serialFlag logcat -d | grep "\*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\* \*\*\*"
220*b7893ccfSSadaf Ebrahimi    if [ $? -eq 0 ]
221*b7893ccfSSadaf Ebrahimi    then
222*b7893ccfSSadaf Ebrahimi        exitCode=2
223*b7893ccfSSadaf Ebrahimi        echo
224*b7893ccfSSadaf Ebrahimi        echo VulkanLayerValidationTests CRASHED!
225*b7893ccfSSadaf Ebrahimi        echo
226*b7893ccfSSadaf Ebrahimi        break
227*b7893ccfSSadaf Ebrahimi    fi
228*b7893ccfSSadaf Ebrahimi
229*b7893ccfSSadaf Ebrahimi    sleep 5
230*b7893ccfSSadaf Ebrahimi
231*b7893ccfSSadaf Ebrahimidone
232*b7893ccfSSadaf Ebrahimi
233*b7893ccfSSadaf Ebrahimi# Re-enable exit on error
234*b7893ccfSSadaf Ebrahimiset -e
235*b7893ccfSSadaf Ebrahimi
236*b7893ccfSSadaf Ebrahimiif [ $exitCode -eq -1 ]
237*b7893ccfSSadaf Ebrahimithen
238*b7893ccfSSadaf Ebrahimi    echo "VulkanLayerValidationTests hasn't completed in $seconds seconds. Script exiting."
239*b7893ccfSSadaf Ebrahimifi
240*b7893ccfSSadaf Ebrahimi
241*b7893ccfSSadaf Ebrahimi#
242*b7893ccfSSadaf Ebrahimi# Cleanup
243*b7893ccfSSadaf Ebrahimi#
244*b7893ccfSSadaf Ebrahimi
245*b7893ccfSSadaf Ebrahimi# Return to home screen to clear any error pop-ups
246*b7893ccfSSadaf Ebrahimiadb $serialFlag shell input keyevent "KEYCODE_HOME"
247*b7893ccfSSadaf Ebrahimi
248*b7893ccfSSadaf Ebrahimi# Stop the activity
249*b7893ccfSSadaf Ebrahimiadb $serialFlag shell am force-stop com.example.VulkanLayerValidationTests
250*b7893ccfSSadaf Ebrahimi
251*b7893ccfSSadaf Ebrahimiecho
252*b7893ccfSSadaf Ebrahimiecho Fetching test output and filtered logcat text...
253*b7893ccfSSadaf Ebrahimi
254*b7893ccfSSadaf Ebrahimi# Avoid characters that are illegal in Windows filenames, so these
255*b7893ccfSSadaf Ebrahimi# files can be archived to a Windows host system for later reference
256*b7893ccfSSadaf Ebrahimitoday=$(date +%Y%m%d-%H%M%S)
257*b7893ccfSSadaf EbrahimioutFile="VulkanLayerValidationTests.$platform.$today.out.txt"
258*b7893ccfSSadaf EbrahimierrFile="VulkanLayerValidationTests.$platform.$today.err.txt"
259*b7893ccfSSadaf EbrahimilogFile="VulkanLayerValidationTests.$platform.$today.logcat.txt"
260*b7893ccfSSadaf Ebrahimiadb $serialFlag pull /sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt $outFile
261*b7893ccfSSadaf Ebrahimiadb $serialFlag pull /sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt $errFile
262*b7893ccfSSadaf Ebrahimiadb $serialFlag logcat -d | grep VulkanLayerValidationTests > $logFile
263*b7893ccfSSadaf Ebrahimi
264*b7893ccfSSadaf Ebrahimiif [ -f $outFile ]; then
265*b7893ccfSSadaf Ebrahimi    echo $outFile size $(wc -c < $outFile)
266*b7893ccfSSadaf Ebrahimifi
267*b7893ccfSSadaf Ebrahimi
268*b7893ccfSSadaf Ebrahimiif [ -f $errFile ]; then
269*b7893ccfSSadaf Ebrahimi    echo $errFile size $(wc -c < $errFile)
270*b7893ccfSSadaf Ebrahimifi
271*b7893ccfSSadaf Ebrahimi
272*b7893ccfSSadaf Ebrahimiif [ -f $logFile ]; then
273*b7893ccfSSadaf Ebrahimi    echo $logFile size $(wc -c < $logFile)
274*b7893ccfSSadaf Ebrahimifi
275*b7893ccfSSadaf Ebrahimi
276*b7893ccfSSadaf Ebrahimiif [ $exitCode -ne 0 ]
277*b7893ccfSSadaf Ebrahimithen
278*b7893ccfSSadaf Ebrahimi    echo
279*b7893ccfSSadaf Ebrahimi    echo VulkanLayerValidationTests result status is unsuccessful.  Dumping test output file:
280*b7893ccfSSadaf Ebrahimi    echo =========================================================================================
281*b7893ccfSSadaf Ebrahimi    cat $outFile
282*b7893ccfSSadaf Ebrahimi    echo =========================================================================================
283*b7893ccfSSadaf Ebrahimi    echo
284*b7893ccfSSadaf Ebrahimi    echo
285*b7893ccfSSadaf Ebrahimi    echo Dumping logcat text, filtered by ''"VulkanLayerValidationTests"'':
286*b7893ccfSSadaf Ebrahimi    echo =========================================================================================
287*b7893ccfSSadaf Ebrahimi    cat $logFile
288*b7893ccfSSadaf Ebrahimi    echo =========================================================================================
289*b7893ccfSSadaf Ebrahimifi
290*b7893ccfSSadaf Ebrahimi
291*b7893ccfSSadaf Ebrahimiexit $exitCode
292