xref: /aosp_15_r20/art/tools/run-gtests.sh (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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