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