xref: /aosp_15_r20/art/test/testrunner/env.py (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker# Copyright 2017, The Android Open Source Project
2*795d594fSAndroid Build Coastguard Worker#
3*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*795d594fSAndroid Build Coastguard Worker#
7*795d594fSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*795d594fSAndroid Build Coastguard Worker#
9*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*795d594fSAndroid Build Coastguard Worker# limitations under the License.
14*795d594fSAndroid Build Coastguard Worker
15*795d594fSAndroid Build Coastguard Workerimport os
16*795d594fSAndroid Build Coastguard Workerimport re
17*795d594fSAndroid Build Coastguard Workerimport tempfile
18*795d594fSAndroid Build Coastguard Workerimport subprocess
19*795d594fSAndroid Build Coastguard Worker
20*795d594fSAndroid Build Coastguard Worker_env = dict(os.environ)
21*795d594fSAndroid Build Coastguard Worker
22*795d594fSAndroid Build Coastguard Worker# Check if we are running from the build system.
23*795d594fSAndroid Build Coastguard WorkerART_TEST_RUN_FROM_SOONG = os.environ.get("ART_TEST_RUN_FROM_SOONG")
24*795d594fSAndroid Build Coastguard Worker
25*795d594fSAndroid Build Coastguard Workerif not ART_TEST_RUN_FROM_SOONG:
26*795d594fSAndroid Build Coastguard Worker  # begin import $ANDROID_BUILD_TOP/art/tools/build/var_cache.py
27*795d594fSAndroid Build Coastguard Worker  _THIS_DIR = os.path.dirname(os.path.realpath(__file__))
28*795d594fSAndroid Build Coastguard Worker  _TOP = os.path.join(_THIS_DIR, "../../..")
29*795d594fSAndroid Build Coastguard Worker  _VAR_CACHE_DIR = os.path.join(_TOP, "art/tools/build/")
30*795d594fSAndroid Build Coastguard Worker
31*795d594fSAndroid Build Coastguard Worker  import sys
32*795d594fSAndroid Build Coastguard Worker  sys.path.append(_VAR_CACHE_DIR)
33*795d594fSAndroid Build Coastguard Worker  import var_cache  # type: ignore
34*795d594fSAndroid Build Coastguard Worker  # end import var_cache.py
35*795d594fSAndroid Build Coastguard Worker
36*795d594fSAndroid Build Coastguard Workerdef _getEnvBoolean(var, default):
37*795d594fSAndroid Build Coastguard Worker  val = _env.get(var)
38*795d594fSAndroid Build Coastguard Worker  if val:
39*795d594fSAndroid Build Coastguard Worker    if val == "True" or val == "true":
40*795d594fSAndroid Build Coastguard Worker      return True
41*795d594fSAndroid Build Coastguard Worker    if val == "False" or val == "false":
42*795d594fSAndroid Build Coastguard Worker      return False
43*795d594fSAndroid Build Coastguard Worker  return default
44*795d594fSAndroid Build Coastguard Worker
45*795d594fSAndroid Build Coastguard Workerdef _get_build_var(var_name):
46*795d594fSAndroid Build Coastguard Worker  if ART_TEST_RUN_FROM_SOONG:
47*795d594fSAndroid Build Coastguard Worker    return _env.get(var_name)
48*795d594fSAndroid Build Coastguard Worker  return var_cache.get_build_var(var_name)
49*795d594fSAndroid Build Coastguard Worker
50*795d594fSAndroid Build Coastguard Workerdef _get_build_var_boolean(var, default):
51*795d594fSAndroid Build Coastguard Worker  val = _get_build_var(var)
52*795d594fSAndroid Build Coastguard Worker  if val:
53*795d594fSAndroid Build Coastguard Worker    if val == "True" or val == "true":
54*795d594fSAndroid Build Coastguard Worker      return True
55*795d594fSAndroid Build Coastguard Worker    if val == "False" or val == "false":
56*795d594fSAndroid Build Coastguard Worker      return False
57*795d594fSAndroid Build Coastguard Worker  return default
58*795d594fSAndroid Build Coastguard Worker
59*795d594fSAndroid Build Coastguard Workerdef get_env(key):
60*795d594fSAndroid Build Coastguard Worker  return _env.get(key)
61*795d594fSAndroid Build Coastguard Worker
62*795d594fSAndroid Build Coastguard Workerdef _get_android_build_top():
63*795d594fSAndroid Build Coastguard Worker  path_to_top = _env.get('ANDROID_BUILD_TOP')
64*795d594fSAndroid Build Coastguard Worker  if not path_to_top:
65*795d594fSAndroid Build Coastguard Worker    # nothing set. try to guess it based on the relative path of this env.py file.
66*795d594fSAndroid Build Coastguard Worker    this_file_path = os.path.realpath(__file__)
67*795d594fSAndroid Build Coastguard Worker    path_to_top = os.path.join(os.path.dirname(this_file_path), '../../../')
68*795d594fSAndroid Build Coastguard Worker    path_to_top = os.path.realpath(path_to_top)
69*795d594fSAndroid Build Coastguard Worker
70*795d594fSAndroid Build Coastguard Worker  if not os.path.exists(os.path.join(path_to_top, 'build/envsetup.sh')):
71*795d594fSAndroid Build Coastguard Worker    if not ART_TEST_RUN_FROM_SOONG:
72*795d594fSAndroid Build Coastguard Worker      raise AssertionError("env.py must be located inside an android source tree")
73*795d594fSAndroid Build Coastguard Worker
74*795d594fSAndroid Build Coastguard Worker  return path_to_top
75*795d594fSAndroid Build Coastguard Worker
76*795d594fSAndroid Build Coastguard WorkerANDROID_BUILD_TOP = _get_android_build_top()
77*795d594fSAndroid Build Coastguard Worker
78*795d594fSAndroid Build Coastguard Worker# Directory used to store files build by the run-test script.
79*795d594fSAndroid Build Coastguard WorkerART_TEST_RUN_TEST_BUILD_PATH = _env.get('ART_TEST_RUN_TEST_BUILD_PATH')
80*795d594fSAndroid Build Coastguard Worker
81*795d594fSAndroid Build Coastguard Worker# Keep going after encountering a test failure?
82*795d594fSAndroid Build Coastguard WorkerART_TEST_KEEP_GOING = _getEnvBoolean('ART_TEST_KEEP_GOING', True)
83*795d594fSAndroid Build Coastguard Worker
84*795d594fSAndroid Build Coastguard Worker# Do you want failed tests to have their artifacts cleaned up?
85*795d594fSAndroid Build Coastguard WorkerART_TEST_RUN_TEST_ALWAYS_CLEAN = _getEnvBoolean('ART_TEST_RUN_TEST_ALWAYS_CLEAN', True)
86*795d594fSAndroid Build Coastguard Worker
87*795d594fSAndroid Build Coastguard WorkerART_TEST_BISECTION = _getEnvBoolean('ART_TEST_BISECTION', False)
88*795d594fSAndroid Build Coastguard Worker
89*795d594fSAndroid Build Coastguard Worker# Do you want run-tests with the host/target's second arch?
90*795d594fSAndroid Build Coastguard WorkerART_TEST_RUN_TEST_2ND_ARCH = _getEnvBoolean('ART_TEST_RUN_TEST_2ND_ARCH', True)
91*795d594fSAndroid Build Coastguard Worker
92*795d594fSAndroid Build Coastguard WorkerHOST_2ND_ARCH_PREFIX = _get_build_var('HOST_2ND_ARCH_PREFIX')
93*795d594fSAndroid Build Coastguard Worker
94*795d594fSAndroid Build Coastguard WorkerART_TEST_CHROOT = _env.get('ART_TEST_CHROOT')
95*795d594fSAndroid Build Coastguard WorkerART_TEST_ANDROID_ROOT = _env.get('ART_TEST_ANDROID_ROOT')
96*795d594fSAndroid Build Coastguard WorkerART_TEST_ANDROID_ART_ROOT = _env.get('ART_TEST_ANDROID_ART_ROOT')
97*795d594fSAndroid Build Coastguard WorkerART_TEST_ANDROID_I18N_ROOT = _env.get('ART_TEST_ANDROID_I18N_ROOT')
98*795d594fSAndroid Build Coastguard WorkerART_TEST_ANDROID_TZDATA_ROOT = _env.get('ART_TEST_ANDROID_TZDATA_ROOT')
99*795d594fSAndroid Build Coastguard Worker
100*795d594fSAndroid Build Coastguard WorkerART_TEST_WITH_STRACE = _getEnvBoolean('ART_TEST_DEBUG_GC', False)
101*795d594fSAndroid Build Coastguard Worker
102*795d594fSAndroid Build Coastguard WorkerEXTRA_DISABLED_TESTS = set(_env.get("ART_TEST_RUN_TEST_SKIP", "").split())
103*795d594fSAndroid Build Coastguard Worker
104*795d594fSAndroid Build Coastguard WorkerART_TEST_RUN_TEST_BUILD = _getEnvBoolean('ART_TEST_RUN_TEST_BUILD', False)
105*795d594fSAndroid Build Coastguard Worker
106*795d594fSAndroid Build Coastguard WorkerTARGET_2ND_ARCH = _get_build_var('TARGET_2ND_ARCH')
107*795d594fSAndroid Build Coastguard WorkerTARGET_ARCH = _get_build_var('TARGET_ARCH')
108*795d594fSAndroid Build Coastguard Worker
109*795d594fSAndroid Build Coastguard Worker# Note: ART_2ND_PHONY_TEST_TARGET_SUFFIX is 2ND_ART_PHONY_TEST_TARGET_SUFFIX in .mk files
110*795d594fSAndroid Build Coastguard Worker# Note: ART_2ND_PHONY_TEST_HOST_SUFFIX is 2ND_ART_PHONY_HOST_TARGET_SUFFIX in .mk files
111*795d594fSAndroid Build Coastguard Worker# Python does not let us have variable names starting with a digit, so it has differ.
112*795d594fSAndroid Build Coastguard Worker
113*795d594fSAndroid Build Coastguard Workerif TARGET_2ND_ARCH:
114*795d594fSAndroid Build Coastguard Worker  if "64" in TARGET_ARCH:
115*795d594fSAndroid Build Coastguard Worker    ART_PHONY_TEST_TARGET_SUFFIX = "64"
116*795d594fSAndroid Build Coastguard Worker    ART_2ND_PHONY_TEST_TARGET_SUFFIX = "32"
117*795d594fSAndroid Build Coastguard Worker  else:
118*795d594fSAndroid Build Coastguard Worker    ART_PHONY_TEST_TARGET_SUFFIX = "32"
119*795d594fSAndroid Build Coastguard Worker    ART_2ND_PHONY_TEST_TARGET_SUFFIX = ""
120*795d594fSAndroid Build Coastguard Workerelse:
121*795d594fSAndroid Build Coastguard Worker  if "64" in TARGET_ARCH:
122*795d594fSAndroid Build Coastguard Worker    ART_PHONY_TEST_TARGET_SUFFIX = "64"
123*795d594fSAndroid Build Coastguard Worker    ART_2ND_PHONY_TEST_TARGET_SUFFIX = ""
124*795d594fSAndroid Build Coastguard Worker  else:
125*795d594fSAndroid Build Coastguard Worker    ART_PHONY_TEST_TARGET_SUFFIX = "32"
126*795d594fSAndroid Build Coastguard Worker    ART_2ND_PHONY_TEST_TARGET_SUFFIX = ""
127*795d594fSAndroid Build Coastguard Worker
128*795d594fSAndroid Build Coastguard WorkerHOST_PREFER_32_BIT = _get_build_var('HOST_PREFER_32_BIT')
129*795d594fSAndroid Build Coastguard Workerif HOST_PREFER_32_BIT == "true":
130*795d594fSAndroid Build Coastguard Worker  ART_PHONY_TEST_HOST_SUFFIX = "32"
131*795d594fSAndroid Build Coastguard Worker  ART_2ND_PHONY_TEST_HOST_SUFFIX = ""
132*795d594fSAndroid Build Coastguard Workerelse:
133*795d594fSAndroid Build Coastguard Worker  ART_PHONY_TEST_HOST_SUFFIX = "64"
134*795d594fSAndroid Build Coastguard Worker  ART_2ND_PHONY_TEST_HOST_SUFFIX = "32"
135*795d594fSAndroid Build Coastguard Worker
136*795d594fSAndroid Build Coastguard Workerif HOST_OUT_EXECUTABLES := _get_build_var("HOST_OUT_EXECUTABLES"):
137*795d594fSAndroid Build Coastguard Worker  HOST_OUT_EXECUTABLES = os.path.join(ANDROID_BUILD_TOP, HOST_OUT_EXECUTABLES)
138*795d594fSAndroid Build Coastguard Worker
139*795d594fSAndroid Build Coastguard Worker  # Set up default values for $D8, $SMALI, etc to the $HOST_OUT_EXECUTABLES/$name path.
140*795d594fSAndroid Build Coastguard Worker  for tool in ['smali', 'jasmin', 'd8']:
141*795d594fSAndroid Build Coastguard Worker    os.environ.setdefault(tool.upper(), HOST_OUT_EXECUTABLES + '/' + tool)
142*795d594fSAndroid Build Coastguard Worker
143*795d594fSAndroid Build Coastguard Workerif ANDROID_JAVA_TOOLCHAIN := _get_build_var('ANDROID_JAVA_TOOLCHAIN'):
144*795d594fSAndroid Build Coastguard Worker  ANDROID_JAVA_TOOLCHAIN = os.path.join(ANDROID_BUILD_TOP, ANDROID_JAVA_TOOLCHAIN)
145*795d594fSAndroid Build Coastguard Worker
146*795d594fSAndroid Build Coastguard Worker  # include platform prebuilt java, javac, etc in $PATH.
147*795d594fSAndroid Build Coastguard Worker  os.environ['PATH'] = ANDROID_JAVA_TOOLCHAIN + ':' + os.environ['PATH']
148*795d594fSAndroid Build Coastguard Worker
149*795d594fSAndroid Build Coastguard WorkerDIST_DIR = _get_build_var('DIST_DIR')
150*795d594fSAndroid Build Coastguard WorkerSOONG_OUT_DIR = _get_build_var('SOONG_OUT_DIR')
151*795d594fSAndroid Build Coastguard Worker
152*795d594fSAndroid Build Coastguard WorkerART_TEST_RUN_ON_ARM_FVP = _getEnvBoolean('ART_TEST_RUN_ON_ARM_FVP', False)
153*795d594fSAndroid Build Coastguard Worker
154*795d594fSAndroid Build Coastguard WorkerART_TEST_ON_VM = _env.get('ART_TEST_ON_VM')
155*795d594fSAndroid Build Coastguard Worker
156*795d594fSAndroid Build Coastguard WorkerART_TEST_SSH_PORT = _env.get('ART_TEST_SSH_PORT', 10001)
157*795d594fSAndroid Build Coastguard WorkerART_TEST_SSH_USER = _env.get('ART_TEST_SSH_USER', 'ubuntu')
158*795d594fSAndroid Build Coastguard WorkerART_TEST_SSH_HOST = _env.get('ART_TEST_SSH_HOST', 'localhost')
159*795d594fSAndroid Build Coastguard WorkerART_SSH_CONFIG = os.path.join(os.path.dirname(__file__), 'ssh_config')
160*795d594fSAndroid Build Coastguard WorkerART_SSH_CMD = _env.get('ART_SSH_CMD', f"ssh -q -F {ART_SSH_CONFIG} -p {ART_TEST_SSH_PORT} "
161*795d594fSAndroid Build Coastguard Worker                                      f"{ART_TEST_SSH_USER}@{ART_TEST_SSH_HOST}")
162*795d594fSAndroid Build Coastguard WorkerART_SCP_CMD = _env.get('ART_SCP_CMD', f"scp -q -F {ART_SSH_CONFIG} -P {ART_TEST_SSH_PORT} -p -r")
163*795d594fSAndroid Build Coastguard WorkerART_CHROOT_CMD = _env.get('ART_CHROOT_CMD', "unshare --user --map-root-user chroot art-test-chroot")
164*795d594fSAndroid Build Coastguard Workerif ART_TEST_ON_VM:
165*795d594fSAndroid Build Coastguard Worker  ART_TEST_CHROOT = _env.get('ART_TEST_CHROOT', f"/home/{ART_TEST_SSH_USER}/art-test-chroot")
166*795d594fSAndroid Build Coastguard Workerelse:
167*795d594fSAndroid Build Coastguard Worker  ART_TEST_CHROOT = _env.get('ART_TEST_CHROOT', "/data/local/art-test-chroot")
168