| Index: build/android/pylib/linker/test_case.py
|
| diff --git a/build/android/pylib/linker/test_case.py b/build/android/pylib/linker/test_case.py
|
| index 13f68cb70855b0b49c343cb0d86e4bcbd3fc4f66..8ebf803a36677a8fdc8fa93a59c90b4f7e5c70cc 100644
|
| --- a/build/android/pylib/linker/test_case.py
|
| +++ b/build/android/pylib/linker/test_case.py
|
| @@ -42,6 +42,7 @@ import time
|
|
|
| from pylib import constants
|
| from pylib.base import base_test_result
|
| +from pylib.device import device_errors
|
| from pylib.device import intent
|
|
|
|
|
| @@ -70,10 +71,11 @@ _LOGCAT_FILTERS = ['*:s', 'chromium:v', 'chromium_android_linker:v']
|
| #_LOGCAT_FILTERS = ['*:v'] ## DEBUG
|
|
|
| # Regular expression used to match status lines in logcat.
|
| -re_status_line = re.compile(r'(BROWSER|RENDERER)_LINKER_TEST: (FAIL|SUCCESS)')
|
| +_RE_BROWSER_STATUS_LINE = re.compile(r' BROWSER_LINKER_TEST: (FAIL|SUCCESS)$')
|
| +_RE_RENDERER_STATUS_LINE = re.compile(r' RENDERER_LINKER_TEST: (FAIL|SUCCESS)$')
|
|
|
| # Regular expression used to mach library load addresses in logcat.
|
| -re_library_address = re.compile(
|
| +_RE_LIBRARY_ADDRESS = re.compile(
|
| r'(BROWSER|RENDERER)_LIBRARY_ADDRESS: (\S+) ([0-9A-Fa-f]+)')
|
|
|
|
|
| @@ -109,46 +111,6 @@ def _GetBrowserSharedRelroConfig():
|
| return configs[0]
|
|
|
|
|
| -def _WriteCommandLineFile(device, command_line, command_line_file):
|
| - """Create a command-line file on the device. This does not use FlagChanger
|
| - because its implementation assumes the device has 'su', and thus does
|
| - not work at all with production devices."""
|
| - device.RunShellCommand(
|
| - 'echo "%s" > %s' % (command_line, command_line_file))
|
| -
|
| -
|
| -def _CheckLinkerTestStatus(logcat):
|
| - """Parse the content of |logcat| and checks for both a browser and
|
| - renderer status line.
|
| -
|
| - Args:
|
| - logcat: A string to parse. Can include line separators.
|
| -
|
| - Returns:
|
| - A tuple, result[0] is True if there is a complete match, then
|
| - result[1] and result[2] will be True or False to reflect the
|
| - test status for the browser and renderer processes, respectively.
|
| - """
|
| - browser_found = False
|
| - renderer_found = False
|
| - for m in re_status_line.finditer(logcat):
|
| - process_type, status = m.groups()
|
| - if process_type == 'BROWSER':
|
| - browser_found = True
|
| - browser_success = (status == 'SUCCESS')
|
| - elif process_type == 'RENDERER':
|
| - renderer_found = True
|
| - renderer_success = (status == 'SUCCESS')
|
| - else:
|
| - assert False, 'Invalid process type ' + process_type
|
| -
|
| - if browser_found and renderer_found:
|
| - return (True, browser_success, renderer_success)
|
| -
|
| - # Didn't find anything.
|
| - return (False, None, None)
|
| -
|
| -
|
| def _StartActivityAndWaitForLinkerTestStatus(device, timeout):
|
| """Force-start an activity and wait up to |timeout| seconds until the full
|
| linker test status lines appear in the logcat, recorded through |device|.
|
| @@ -159,38 +121,30 @@ def _StartActivityAndWaitForLinkerTestStatus(device, timeout):
|
| A (status, logs) tuple, where status is a ResultType constant, and logs
|
| if the final logcat output as a string.
|
| """
|
| +
|
| # 1. Start recording logcat with appropriate filters.
|
| - device.old_interface.StartRecordingLogcat(
|
| - clear=True, filters=_LOGCAT_FILTERS)
|
| + with device.GetLogcatMonitor(filters=_LOGCAT_FILTERS) as logmon:
|
|
|
| - try:
|
| # 2. Force-start activity.
|
| device.StartActivity(
|
| intent.Intent(package=_PACKAGE_NAME, activity=_ACTIVITY_NAME),
|
| force_stop=True)
|
|
|
| # 3. Wait up to |timeout| seconds until the test status is in the logcat.
|
| - num_tries = 0
|
| - max_tries = timeout
|
| - found = False
|
| - while num_tries < max_tries:
|
| - time.sleep(1)
|
| - num_tries += 1
|
| - found, browser_ok, renderer_ok = _CheckLinkerTestStatus(
|
| - device.old_interface.GetCurrentRecordedLogcat())
|
| - if found:
|
| - break
|
| -
|
| - finally:
|
| - logs = device.old_interface.StopRecordingLogcat()
|
| -
|
| - if num_tries >= max_tries:
|
| - return ResultType.TIMEOUT, logs
|
| -
|
| - if browser_ok and renderer_ok:
|
| - return ResultType.PASS, logs
|
| -
|
| - return ResultType.FAIL, logs
|
| + result = ResultType.PASS
|
| + try:
|
| + browser_match = logmon.WaitFor(_RE_BROWSER_STATUS_LINE, timeout=timeout)
|
| + logging.debug('Found browser match: %s', browser_match.group(0))
|
| + renderer_match = logmon.WaitFor(_RE_RENDERER_STATUS_LINE,
|
| + timeout=timeout)
|
| + logging.debug('Found renderer match: %s', renderer_match.group(0))
|
| + if (browser_match.group(1) != 'SUCCESS'
|
| + or renderer_match.group(1) != 'SUCCESS'):
|
| + result = ResultType.FAIL
|
| + except device_errors.CommandTimeoutError:
|
| + result = ResultType.TIMEOUT
|
| +
|
| + return result, '\n'.join(device.adb.Logcat(dump=True))
|
|
|
|
|
| class LibraryLoadMap(dict):
|
| @@ -226,7 +180,7 @@ def _ExtractLibraryLoadAddressesFromLogcat(logs):
|
| """
|
| browser_libs = LibraryLoadMap()
|
| renderer_libs = LibraryLoadMap()
|
| - for m in re_library_address.finditer(logs):
|
| + for m in _RE_LIBRARY_ADDRESS.finditer(logs):
|
| process_type, lib_name, lib_address = m.groups()
|
| lib_address = int(lib_address, 16)
|
| if process_type == 'BROWSER':
|
| @@ -323,7 +277,7 @@ class LinkerTestCaseBase(object):
|
| command_line_flags = ''
|
| if self.is_low_memory:
|
| command_line_flags = '--low-memory-device'
|
| - _WriteCommandLineFile(device, command_line_flags, _COMMAND_LINE_FILE)
|
| + device.WriteFile(_COMMAND_LINE_FILE, command_line_flags)
|
|
|
| # Run the test.
|
| status, logs = self._RunTest(device)
|
|
|