| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Defines a set of constants shared by test runners and other scripts.""" |
| |
| # TODO(jbudorick): Split these constants into coherent modules. |
| |
| # pylint: disable=W0212 |
| |
| from __future__ import absolute_import |
| import collections |
| import glob |
| import logging |
| import os |
| import subprocess |
| |
| import devil.android.sdk.keyevent |
| from devil.android.constants import chrome |
| from devil.android.sdk import version_codes |
| from devil.constants import exit_codes |
| |
| |
| keyevent = devil.android.sdk.keyevent |
| |
| |
| DIR_SOURCE_ROOT = os.environ.get('CHECKOUT_SOURCE_ROOT', |
| os.path.abspath(os.path.join(os.path.dirname(__file__), |
| os.pardir, os.pardir, os.pardir, os.pardir))) |
| |
| PACKAGE_INFO = dict(chrome.PACKAGE_INFO) |
| PACKAGE_INFO.update({ |
| 'legacy_browser': |
| chrome.PackageInfo('com.google.android.browser', |
| 'com.android.browser.BrowserActivity', None, None), |
| 'chromecast_shell': |
| chrome.PackageInfo('com.google.android.apps.mediashell', |
| 'com.google.android.apps.mediashell.MediaShellActivity', |
| 'castshell-command-line', None), |
| 'android_webview_shell': |
| chrome.PackageInfo('org.chromium.android_webview.shell', |
| 'org.chromium.android_webview.shell.AwShellActivity', |
| 'android-webview-command-line', None), |
| 'gtest': |
| chrome.PackageInfo('org.chromium.native_test', |
| 'org.chromium.native_test.NativeUnitTestActivity', |
| 'chrome-native-tests-command-line', None), |
| 'android_browsertests': |
| chrome.PackageInfo('org.chromium.android_browsertests_apk', |
| ('org.chromium.android_browsertests_apk' + |
| '.ChromeBrowserTestsActivity'), |
| 'chrome-native-tests-command-line', None), |
| 'components_browsertests': |
| chrome.PackageInfo('org.chromium.components_browsertests_apk', |
| ('org.chromium.components_browsertests_apk' + |
| '.ComponentsBrowserTestsActivity'), |
| 'chrome-native-tests-command-line', None), |
| 'content_browsertests': |
| chrome.PackageInfo( |
| 'org.chromium.content_browsertests_apk', |
| 'org.chromium.content_browsertests_apk.ContentBrowserTestsActivity', |
| 'chrome-native-tests-command-line', None), |
| 'chromedriver_webview_shell': |
| chrome.PackageInfo('org.chromium.chromedriver_webview_shell', |
| 'org.chromium.chromedriver_webview_shell.Main', None, |
| None), |
| 'android_webview_cts': |
| chrome.PackageInfo('com.android.webview', |
| 'com.android.cts.webkit.WebViewStartupCtsActivity', |
| 'webview-command-line', None), |
| 'android_google_webview_cts': |
| chrome.PackageInfo('com.google.android.webview', |
| 'com.android.cts.webkit.WebViewStartupCtsActivity', |
| 'webview-command-line', None), |
| 'android_system_webview_shell': |
| chrome.PackageInfo('org.chromium.webview_shell', |
| 'org.chromium.webview_shell.WebViewBrowserActivity', |
| 'webview-command-line', None), |
| 'android_webview_ui_test': |
| chrome.PackageInfo('org.chromium.webview_ui_test', |
| 'org.chromium.webview_ui_test.WebViewUiTestActivity', |
| 'webview-command-line', None), |
| 'weblayer_browsertests': |
| chrome.PackageInfo( |
| 'org.chromium.weblayer_browsertests_apk', |
| 'org.chromium.weblayer_browsertests_apk.WebLayerBrowserTestsActivity', |
| 'chrome-native-tests-command-line', None), |
| }) |
| |
| |
| # Ports arrangement for various test servers used in Chrome for Android. |
| # Lighttpd server will attempt to use 9000 as default port, if unavailable it |
| # will find a free port from 8001 - 8999. |
| LIGHTTPD_DEFAULT_PORT = 9000 |
| LIGHTTPD_RANDOM_PORT_FIRST = 8001 |
| LIGHTTPD_RANDOM_PORT_LAST = 8999 |
| TEST_SYNC_SERVER_PORT = 9031 |
| TEST_SEARCH_BY_IMAGE_SERVER_PORT = 9041 |
| TEST_POLICY_SERVER_PORT = 9051 |
| |
| |
| TEST_EXECUTABLE_DIR = '/data/local/tmp' |
| # Directories for common java libraries for SDK build. |
| # These constants are defined in build/android/ant/common.xml |
| SDK_BUILD_JAVALIB_DIR = 'lib.java' |
| SDK_BUILD_TEST_JAVALIB_DIR = 'test.lib.java' |
| SDK_BUILD_APKS_DIR = 'apks' |
| |
| ADB_KEYS_FILE = '/data/misc/adb/adb_keys' |
| |
| PERF_OUTPUT_DIR = os.path.join(DIR_SOURCE_ROOT, 'out', 'step_results') |
| # The directory on the device where perf test output gets saved to. |
| DEVICE_PERF_OUTPUT_DIR = ( |
| '/data/data/' + PACKAGE_INFO['chrome'].package + '/files') |
| |
| SCREENSHOTS_DIR = os.path.join(DIR_SOURCE_ROOT, 'out_screenshots') |
| |
| ANDROID_SDK_BUILD_TOOLS_VERSION = '30.0.1' |
| ANDROID_SDK_ROOT = os.path.join(DIR_SOURCE_ROOT, 'third_party', 'android_sdk', |
| 'public') |
| ANDROID_SDK_TOOLS = os.path.join(ANDROID_SDK_ROOT, |
| 'build-tools', ANDROID_SDK_BUILD_TOOLS_VERSION) |
| ANDROID_NDK_ROOT = os.path.join(DIR_SOURCE_ROOT, |
| 'third_party', 'android_ndk') |
| |
| BAD_DEVICES_JSON = os.path.join(DIR_SOURCE_ROOT, |
| os.environ.get('CHROMIUM_OUT_DIR', 'out'), |
| 'bad_devices.json') |
| |
| UPSTREAM_FLAKINESS_SERVER = 'test-results.appspot.com' |
| |
| # TODO(jbudorick): Remove once unused. |
| DEVICE_LOCAL_PROPERTIES_PATH = '/data/local.prop' |
| |
| # Configure ubsan to print stack traces in the format understood by "stack" so |
| # that they will be symbolized, and disable signal handlers because they |
| # interfere with the breakpad and sandbox tests. |
| # This value is duplicated in |
| # base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java |
| UBSAN_OPTIONS = ( |
| 'print_stacktrace=1 stack_trace_format=\'#%n pc %o %m\' ' |
| 'handle_segv=0 handle_sigbus=0 handle_sigfpe=0') |
| |
| # TODO(jbudorick): Rework this into testing/buildbot/ |
| PYTHON_UNIT_TEST_SUITES = { |
| 'pylib_py_unittests': { |
| 'path': |
| os.path.join(DIR_SOURCE_ROOT, 'build', 'android'), |
| 'test_modules': [ |
| 'devil.android.device_utils_test', |
| 'devil.android.md5sum_test', |
| 'devil.utils.cmd_helper_test', |
| 'pylib.results.json_results_test', |
| 'pylib.utils.proguard_test', |
| ] |
| }, |
| 'gyp_py_unittests': { |
| 'path': |
| os.path.join(DIR_SOURCE_ROOT, 'build', 'android', 'gyp'), |
| 'test_modules': [ |
| 'java_cpp_enum_tests', |
| 'java_cpp_strings_tests', |
| 'java_google_api_keys_tests', |
| 'extract_unwind_tables_tests', |
| ] |
| }, |
| } |
| |
| LOCAL_MACHINE_TESTS = ['junit', 'python'] |
| VALID_ENVIRONMENTS = ['local'] |
| VALID_TEST_TYPES = ['gtest', 'instrumentation', 'junit', 'linker', 'monkey', |
| 'perf', 'python'] |
| VALID_DEVICE_TYPES = ['Android', 'iOS'] |
| |
| |
| def SetBuildType(build_type): |
| """Set the BUILDTYPE environment variable. |
| |
| NOTE: Using this function is deprecated, in favor of SetOutputDirectory(), |
| it is still maintained for a few scripts that typically call it |
| to implement their --release and --debug command-line options. |
| |
| When writing a new script, consider supporting an --output-dir or |
| --chromium-output-dir option instead, and calling SetOutputDirectory() |
| instead. |
| |
| NOTE: If CHROMIUM_OUTPUT_DIR if defined, or if SetOutputDirectory() was |
| called previously, this will be completely ignored. |
| """ |
| chromium_output_dir = os.environ.get('CHROMIUM_OUTPUT_DIR') |
| if chromium_output_dir: |
| logging.warning( |
| 'SetBuildType("%s") ignored since CHROMIUM_OUTPUT_DIR is already ' |
| 'defined as (%s)', build_type, chromium_output_dir) |
| os.environ['BUILDTYPE'] = build_type |
| |
| |
| def SetOutputDirectory(output_directory): |
| """Set the Chromium output directory. |
| |
| This must be called early by scripts that rely on GetOutDirectory() or |
| CheckOutputDirectory(). Typically by providing an --output-dir or |
| --chromium-output-dir option. |
| """ |
| os.environ['CHROMIUM_OUTPUT_DIR'] = output_directory |
| |
| |
| # The message that is printed when the Chromium output directory cannot |
| # be found. Note that CHROMIUM_OUT_DIR and BUILDTYPE are not mentioned |
| # intentionally to encourage the use of CHROMIUM_OUTPUT_DIR instead. |
| _MISSING_OUTPUT_DIR_MESSAGE = '\ |
| The Chromium output directory could not be found. Please use an option such as \ |
| --output-directory to provide it (see --help for details). Otherwise, \ |
| define the CHROMIUM_OUTPUT_DIR environment variable.' |
| |
| |
| def GetOutDirectory(): |
| """Returns the Chromium build output directory. |
| |
| NOTE: This is determined in the following way: |
| - From a previous call to SetOutputDirectory() |
| - Otherwise, from the CHROMIUM_OUTPUT_DIR env variable, if it is defined. |
| - Otherwise, from the current Chromium source directory, and a previous |
| call to SetBuildType() or the BUILDTYPE env variable, in combination |
| with the optional CHROMIUM_OUT_DIR env variable. |
| """ |
| if 'CHROMIUM_OUTPUT_DIR' in os.environ: |
| return os.path.abspath(os.path.join( |
| DIR_SOURCE_ROOT, os.environ.get('CHROMIUM_OUTPUT_DIR'))) |
| |
| build_type = os.environ.get('BUILDTYPE') |
| if not build_type: |
| raise EnvironmentError(_MISSING_OUTPUT_DIR_MESSAGE) |
| |
| return os.path.abspath(os.path.join( |
| DIR_SOURCE_ROOT, os.environ.get('CHROMIUM_OUT_DIR', 'out'), |
| build_type)) |
| |
| |
| def CheckOutputDirectory(): |
| """Checks that the Chromium output directory is set, or can be found. |
| |
| If it is not already set, this will also perform a little auto-detection: |
| |
| - If the current directory contains a build.ninja file, use it as |
| the output directory. |
| |
| - If CHROME_HEADLESS is defined in the environment (e.g. on a bot), |
| look if there is a single output directory under DIR_SOURCE_ROOT/out/, |
| and if so, use it as the output directory. |
| |
| Raises: |
| Exception: If no output directory is detected. |
| """ |
| output_dir = os.environ.get('CHROMIUM_OUTPUT_DIR') |
| if output_dir: |
| return |
| |
| build_type = os.environ.get('BUILDTYPE') |
| if build_type and len(build_type) > 1: |
| return |
| |
| # If CWD is an output directory, then assume it's the desired one. |
| if os.path.exists('build.ninja'): |
| output_dir = os.getcwd() |
| SetOutputDirectory(output_dir) |
| return |
| |
| # When running on bots, see if the output directory is obvious. |
| # TODO(http://crbug.com/833808): Get rid of this by ensuring bots always set |
| # CHROMIUM_OUTPUT_DIR correctly. |
| if os.environ.get('CHROME_HEADLESS'): |
| dirs = glob.glob(os.path.join(DIR_SOURCE_ROOT, 'out', '*', 'build.ninja')) |
| if len(dirs) == 1: |
| SetOutputDirectory(dirs[0]) |
| return |
| |
| raise Exception( |
| 'Chromium output directory not set, and CHROME_HEADLESS detected. ' + |
| 'However, multiple out dirs exist: %r' % dirs) |
| |
| raise Exception(_MISSING_OUTPUT_DIR_MESSAGE) |
| |
| |
| # Exit codes |
| ERROR_EXIT_CODE = exit_codes.ERROR |
| INFRA_EXIT_CODE = exit_codes.INFRA |
| WARNING_EXIT_CODE = exit_codes.WARNING |