1*795d594fSAndroid Build Coastguard Worker#! /bin/bash 2*795d594fSAndroid Build Coastguard Worker# 3*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2019 The Android Open Source Project 4*795d594fSAndroid Build Coastguard Worker# 5*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*795d594fSAndroid Build Coastguard Worker# 9*795d594fSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*795d594fSAndroid Build Coastguard Worker# 11*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*795d594fSAndroid Build Coastguard Worker# limitations under the License. 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Workerset -e 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker. "$(dirname $0)/buildbot-utils.sh" 20*795d594fSAndroid Build Coastguard Worker 21*795d594fSAndroid Build Coastguard Workerif [[ $1 = -h ]]; then 22*795d594fSAndroid Build Coastguard Worker cat <<EOF 23*795d594fSAndroid Build Coastguard WorkerUsage: $0 [<gtest>...] [--] [<gtest-option>...] 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard WorkerScript to run gtests located in the ART (Testing) APEX. 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard WorkerIf called with arguments, only those tests are run, as specified by their 28*795d594fSAndroid Build Coastguard Workerabsolute paths (starting with /apex). All gtests are run otherwise. 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard WorkerOptions after \`--\` are passed verbatim to each gtest binary. 31*795d594fSAndroid Build Coastguard WorkerEOF 32*795d594fSAndroid Build Coastguard Worker exit 33*795d594fSAndroid Build Coastguard Workerfi 34*795d594fSAndroid Build Coastguard Worker 35*795d594fSAndroid Build Coastguard Workerif [[ -z "$ART_TEST_CHROOT" ]]; then 36*795d594fSAndroid Build Coastguard Worker echo 'ART_TEST_CHROOT environment variable is empty; please set it before running this script.' 37*795d594fSAndroid Build Coastguard Worker exit 1 38*795d594fSAndroid Build Coastguard Workerfi 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Workeradb="${ADB:-adb}" 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Workerandroid_i18n_root=/apex/com.android.i18n 43*795d594fSAndroid Build Coastguard Workerandroid_art_root=/apex/com.android.art 44*795d594fSAndroid Build Coastguard Workerandroid_tzdata_root=/apex/com.android.tzdata 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Workerif [[ $1 = -j* ]]; then 47*795d594fSAndroid Build Coastguard Worker # TODO(b/129930445): Implement support for parallel execution. 48*795d594fSAndroid Build Coastguard Worker shift 49*795d594fSAndroid Build Coastguard Workerfi 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Workertests=() 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Workerwhile [[ $# -gt 0 ]]; do 54*795d594fSAndroid Build Coastguard Worker if [[ "$1" == "--" ]]; then 55*795d594fSAndroid Build Coastguard Worker shift 56*795d594fSAndroid Build Coastguard Worker break 57*795d594fSAndroid Build Coastguard Worker fi 58*795d594fSAndroid Build Coastguard Worker tests+=("$1") 59*795d594fSAndroid Build Coastguard Worker shift 60*795d594fSAndroid Build Coastguard Workerdone 61*795d594fSAndroid Build Coastguard Worker 62*795d594fSAndroid Build Coastguard Workeroptions="$@" 63*795d594fSAndroid Build Coastguard Worker 64*795d594fSAndroid Build Coastguard Workerrun_in_chroot() { 65*795d594fSAndroid Build Coastguard Worker if [ -n "$ART_TEST_ON_VM" ]; then 66*795d594fSAndroid Build Coastguard Worker $ART_SSH_CMD $ART_CHROOT_CMD env ANDROID_ROOT=/system $@ 67*795d594fSAndroid Build Coastguard Worker else 68*795d594fSAndroid Build Coastguard Worker "$adb" shell chroot "$ART_TEST_CHROOT" $@ 69*795d594fSAndroid Build Coastguard Worker fi 70*795d594fSAndroid Build Coastguard Worker} 71*795d594fSAndroid Build Coastguard Worker 72*795d594fSAndroid Build Coastguard Workerif [[ ${#tests[@]} -eq 0 ]]; then 73*795d594fSAndroid Build Coastguard Worker # Search for executables under the `bin/art` directory of the ART APEX. 74*795d594fSAndroid Build Coastguard Worker readarray -t tests <<<$(run_in_chroot \ 75*795d594fSAndroid Build Coastguard Worker find "$android_art_root/bin/art" -type f -perm /ugo+x | sort) 76*795d594fSAndroid Build Coastguard Workerfi 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Workermaybe_get_fake_dex2oatbootclasspath() { 79*795d594fSAndroid Build Coastguard Worker if [ -n "$ART_TEST_ON_VM" ]; then 80*795d594fSAndroid Build Coastguard Worker return 81*795d594fSAndroid Build Coastguard Worker fi 82*795d594fSAndroid Build Coastguard Worker dex2oatbootclasspath=$("$adb" shell echo \$DEX2OATBOOTCLASSPATH) 83*795d594fSAndroid Build Coastguard Worker if [ -n "$dex2oatbootclasspath" ]; then 84*795d594fSAndroid Build Coastguard Worker # The device has a real DEX2OATBOOTCLASSPATH. 85*795d594fSAndroid Build Coastguard Worker # This is the usual case. 86*795d594fSAndroid Build Coastguard Worker return 87*795d594fSAndroid Build Coastguard Worker fi 88*795d594fSAndroid Build Coastguard Worker bootclasspath=$("$adb" shell echo \$BOOTCLASSPATH) 89*795d594fSAndroid Build Coastguard Worker # Construct a fake DEX2OATBOOTCLASSPATH from the elements in BOOTCLASSPATH except the last one. 90*795d594fSAndroid Build Coastguard Worker # BOOTCLASSPATH cannot be used by the runtime in chroot anyway, so it doesn't hurt to construct a 91*795d594fSAndroid Build Coastguard Worker # fake DEX2OATBOOTCLASSPATH just to make the runtime happy. 92*795d594fSAndroid Build Coastguard Worker # This is only needed on old Android platforms such as Android P. 93*795d594fSAndroid Build Coastguard Worker echo "DEX2OATBOOTCLASSPATH=${bootclasspath%:*}" 94*795d594fSAndroid Build Coastguard Worker} 95*795d594fSAndroid Build Coastguard Worker 96*795d594fSAndroid Build Coastguard Workerfailing_tests=() 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Workerfor t in ${tests[@]}; do 99*795d594fSAndroid Build Coastguard Worker echo "$t" 100*795d594fSAndroid Build Coastguard Worker run_in_chroot \ 101*795d594fSAndroid Build Coastguard Worker env ANDROID_ART_ROOT="$android_art_root" \ 102*795d594fSAndroid Build Coastguard Worker ANDROID_I18N_ROOT="$android_i18n_root" \ 103*795d594fSAndroid Build Coastguard Worker ANDROID_TZDATA_ROOT="$android_tzdata_root" \ 104*795d594fSAndroid Build Coastguard Worker ART_TEST_ON_VM="$ART_TEST_ON_VM" \ 105*795d594fSAndroid Build Coastguard Worker $(maybe_get_fake_dex2oatbootclasspath) \ 106*795d594fSAndroid Build Coastguard Worker $t $options \ 107*795d594fSAndroid Build Coastguard Worker || failing_tests+=("$t") 108*795d594fSAndroid Build Coastguard Workerdone 109*795d594fSAndroid Build Coastguard Worker 110*795d594fSAndroid Build Coastguard Workerif [[ -n "$failing_tests" ]]; then 111*795d594fSAndroid Build Coastguard Worker for t in "${failing_tests[@]}"; do 112*795d594fSAndroid Build Coastguard Worker echo "Failed test: $t" 113*795d594fSAndroid Build Coastguard Worker done 114*795d594fSAndroid Build Coastguard Worker exit 1 115*795d594fSAndroid Build Coastguard Workerfi 116