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