1# Copyright (c) 2012 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5"""Defines a set of constants shared by test runners and other scripts.""" 6 7# TODO(jbudorick): Split these constants into coherent modules. 8 9# pylint: disable=W0212 10 11import collections 12import glob 13import logging 14import os 15import subprocess 16 17import devil.android.sdk.keyevent 18from devil.android.constants import chrome 19from devil.android.sdk import version_codes 20from devil.constants import exit_codes 21 22 23keyevent = devil.android.sdk.keyevent 24 25 26DIR_SOURCE_ROOT = os.environ.get('CHECKOUT_SOURCE_ROOT', 27 os.path.abspath(os.path.join(os.path.dirname(__file__), 28 os.pardir, os.pardir, os.pardir, os.pardir))) 29 30PACKAGE_INFO = dict(chrome.PACKAGE_INFO) 31PACKAGE_INFO.update({ 32 'legacy_browser': chrome.PackageInfo( 33 'com.google.android.browser', 34 'com.android.browser.BrowserActivity', 35 None, 36 None), 37 'chromecast_shell': chrome.PackageInfo( 38 'com.google.android.apps.mediashell', 39 'com.google.android.apps.mediashell.MediaShellActivity', 40 '/data/local/tmp/castshell-command-line', 41 None), 42 'android_webview_shell': chrome.PackageInfo( 43 'org.chromium.android_webview.shell', 44 'org.chromium.android_webview.shell.AwShellActivity', 45 '/data/local/tmp/android-webview-command-line', 46 None), 47 'gtest': chrome.PackageInfo( 48 'org.chromium.native_test', 49 'org.chromium.native_test.NativeUnitTestActivity', 50 '/data/local/tmp/chrome-native-tests-command-line', 51 None), 52 'components_browsertests': chrome.PackageInfo( 53 'org.chromium.components_browsertests_apk', 54 ('org.chromium.components_browsertests_apk' + 55 '.ComponentsBrowserTestsActivity'), 56 '/data/local/tmp/chrome-native-tests-command-line', 57 None), 58 'content_browsertests': chrome.PackageInfo( 59 'org.chromium.content_browsertests_apk', 60 'org.chromium.content_browsertests_apk.ContentBrowserTestsActivity', 61 '/data/local/tmp/chrome-native-tests-command-line', 62 None), 63 'chromedriver_webview_shell': chrome.PackageInfo( 64 'org.chromium.chromedriver_webview_shell', 65 'org.chromium.chromedriver_webview_shell.Main', 66 None, 67 None), 68}) 69 70 71# Ports arrangement for various test servers used in Chrome for Android. 72# Lighttpd server will attempt to use 9000 as default port, if unavailable it 73# will find a free port from 8001 - 8999. 74LIGHTTPD_DEFAULT_PORT = 9000 75LIGHTTPD_RANDOM_PORT_FIRST = 8001 76LIGHTTPD_RANDOM_PORT_LAST = 8999 77TEST_SYNC_SERVER_PORT = 9031 78TEST_SEARCH_BY_IMAGE_SERVER_PORT = 9041 79TEST_POLICY_SERVER_PORT = 9051 80 81 82TEST_EXECUTABLE_DIR = '/data/local/tmp' 83# Directories for common java libraries for SDK build. 84# These constants are defined in build/android/ant/common.xml 85SDK_BUILD_JAVALIB_DIR = 'lib.java' 86SDK_BUILD_TEST_JAVALIB_DIR = 'test.lib.java' 87SDK_BUILD_APKS_DIR = 'apks' 88 89ADB_KEYS_FILE = '/data/misc/adb/adb_keys' 90 91PERF_OUTPUT_DIR = os.path.join(DIR_SOURCE_ROOT, 'out', 'step_results') 92# The directory on the device where perf test output gets saved to. 93DEVICE_PERF_OUTPUT_DIR = ( 94 '/data/data/' + PACKAGE_INFO['chrome'].package + '/files') 95 96SCREENSHOTS_DIR = os.path.join(DIR_SOURCE_ROOT, 'out_screenshots') 97 98ANDROID_SDK_VERSION = version_codes.MARSHMALLOW 99ANDROID_SDK_BUILD_TOOLS_VERSION = '23.0.1' 100ANDROID_SDK_ROOT = os.path.join(DIR_SOURCE_ROOT, 101 'third_party', 'android_tools', 'sdk') 102ANDROID_SDK_TOOLS = os.path.join(ANDROID_SDK_ROOT, 103 'build-tools', ANDROID_SDK_BUILD_TOOLS_VERSION) 104ANDROID_NDK_ROOT = os.path.join(DIR_SOURCE_ROOT, 105 'third_party', 'android_tools', 'ndk') 106 107PROGUARD_SCRIPT_PATH = os.path.join( 108 ANDROID_SDK_ROOT, 'tools', 'proguard', 'bin', 'proguard.sh') 109 110PROGUARD_ROOT = os.path.join(DIR_SOURCE_ROOT, 'third_party', 'proguard') 111 112BAD_DEVICES_JSON = os.path.join(DIR_SOURCE_ROOT, 113 os.environ.get('CHROMIUM_OUT_DIR', 'out'), 114 'bad_devices.json') 115 116UPSTREAM_FLAKINESS_SERVER = 'test-results.appspot.com' 117 118# TODO(jbudorick): Remove once unused. 119DEVICE_LOCAL_PROPERTIES_PATH = '/data/local.prop' 120 121# TODO(jbudorick): Rework this into testing/buildbot/ 122PYTHON_UNIT_TEST_SUITES = { 123 'pylib_py_unittests': { 124 'path': os.path.join(DIR_SOURCE_ROOT, 'build', 'android'), 125 'test_modules': [ 126 'devil.android.device_utils_test', 127 'devil.android.md5sum_test', 128 'devil.utils.cmd_helper_test', 129 'pylib.results.json_results_test', 130 'pylib.utils.proguard_test', 131 ] 132 }, 133 'gyp_py_unittests': { 134 'path': os.path.join(DIR_SOURCE_ROOT, 'build', 'android', 'gyp'), 135 'test_modules': [ 136 'java_cpp_enum_tests', 137 'java_google_api_keys_tests', 138 ] 139 }, 140} 141 142LOCAL_MACHINE_TESTS = ['junit', 'python'] 143VALID_ENVIRONMENTS = ['local', 'remote_device'] 144VALID_TEST_TYPES = ['gtest', 'instrumentation', 'junit', 'linker', 'monkey', 145 'perf', 'python', 'uirobot'] 146VALID_DEVICE_TYPES = ['Android', 'iOS'] 147 148 149def GetBuildType(): 150 try: 151 return os.environ['BUILDTYPE'] 152 except KeyError: 153 raise EnvironmentError( 154 'The BUILDTYPE environment variable has not been set') 155 156 157def SetBuildType(build_type): 158 os.environ['BUILDTYPE'] = build_type 159 160 161def SetBuildDirectory(build_directory): 162 os.environ['CHROMIUM_OUT_DIR'] = build_directory 163 164 165def SetOutputDirectory(output_directory): 166 os.environ['CHROMIUM_OUTPUT_DIR'] = output_directory 167 168 169def GetOutDirectory(build_type=None): 170 """Returns the out directory where the output binaries are built. 171 172 Args: 173 build_type: Build type, generally 'Debug' or 'Release'. Defaults to the 174 globally set build type environment variable BUILDTYPE. 175 """ 176 if 'CHROMIUM_OUTPUT_DIR' in os.environ: 177 return os.path.abspath(os.path.join( 178 DIR_SOURCE_ROOT, os.environ.get('CHROMIUM_OUTPUT_DIR'))) 179 180 return os.path.abspath(os.path.join( 181 DIR_SOURCE_ROOT, os.environ.get('CHROMIUM_OUT_DIR', 'out'), 182 GetBuildType() if build_type is None else build_type)) 183 184 185def CheckOutputDirectory(): 186 """Checks that CHROMIUM_OUT_DIR or CHROMIUM_OUTPUT_DIR is set. 187 188 If neither are set, but the current working directory is a build directory, 189 then CHROMIUM_OUTPUT_DIR is set to the current working directory. 190 191 Raises: 192 Exception: If no output directory is detected. 193 """ 194 output_dir = os.environ.get('CHROMIUM_OUTPUT_DIR') 195 out_dir = os.environ.get('CHROMIUM_OUT_DIR') 196 if not output_dir and not out_dir: 197 # If CWD is an output directory, then assume it's the desired one. 198 if os.path.exists('build.ninja'): 199 output_dir = os.getcwd() 200 SetOutputDirectory(output_dir) 201 elif os.environ.get('CHROME_HEADLESS'): 202 # When running on bots, see if the output directory is obvious. 203 dirs = glob.glob(os.path.join(DIR_SOURCE_ROOT, 'out', '*', 'build.ninja')) 204 if len(dirs) == 1: 205 SetOutputDirectory(dirs[0]) 206 else: 207 raise Exception('Neither CHROMIUM_OUTPUT_DIR nor CHROMIUM_OUT_DIR ' 208 'has been set. CHROME_HEADLESS detected, but multiple ' 209 'out dirs exist: %r' % dirs) 210 else: 211 raise Exception('Neither CHROMIUM_OUTPUT_DIR nor CHROMIUM_OUT_DIR ' 212 'has been set') 213 214 215# TODO(jbudorick): Convert existing callers to AdbWrapper.GetAdbPath() and 216# remove this. 217def GetAdbPath(): 218 from devil.android.sdk import adb_wrapper 219 return adb_wrapper.AdbWrapper.GetAdbPath() 220 221 222# Exit codes 223ERROR_EXIT_CODE = exit_codes.ERROR 224INFRA_EXIT_CODE = exit_codes.INFRA 225WARNING_EXIT_CODE = exit_codes.WARNING 226