1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)"""TestEnvironment classes.
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)These classes abstract away the various setups needed to run the WebDriver java
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)tests in various environments.
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)"""
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import os
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import sys
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochimport chrome_paths
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport util
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch_THIS_DIR = os.path.abspath(os.path.dirname(__file__))
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)if util.IsLinux():
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  sys.path.insert(0, os.path.join(chrome_paths.GetSrc(), 'build', 'android'))
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  from pylib import android_commands
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  from pylib import forwarder
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  from pylib import valgrind_tools
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  from pylib.device import device_errors
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  from pylib.device import device_utils
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ANDROID_TEST_HTTP_PORT = 2311
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ANDROID_TEST_HTTPS_PORT = 2411
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)_EXPECTATIONS = {}
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)execfile(os.path.join(_THIS_DIR, 'test_expectations'), _EXPECTATIONS)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class BaseTestEnvironment(object):
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """Manages the environment java tests require to run."""
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def __init__(self, chrome_version='HEAD'):
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """Initializes a desktop test environment.
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Args:
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      chrome_version: Optionally a chrome version to run the tests against.
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self._chrome_version = chrome_version
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def GetOS(self):
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """Name of the OS."""
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    raise NotImplementedError
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def GlobalSetUp(self):
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """Sets up the global test environment state."""
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pass
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def GlobalTearDown(self):
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """Tears down the global test environment state."""
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pass
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def GetDisabledJavaTestMatchers(self):
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    """Get the list of disabled java test matchers.
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Returns:
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      List of disabled test matchers, which may contain '*' wildcards.
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return _EXPECTATIONS['GetDisabledTestMatchers'](
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.GetOS(), self._chrome_version)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def GetPassedJavaTests(self):
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """Get the list of passed java tests.
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Returns:
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      List of passed test names.
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    with open(os.path.join(_THIS_DIR, 'java_tests.txt'), 'r') as f:
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return _EXPECTATIONS['ApplyJavaTestFilter'](
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          self.GetOS(), self._chrome_version,
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          [t.strip('\n') for t in f.readlines()])
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DesktopTestEnvironment(BaseTestEnvironment):
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """Manages the environment java tests require to run on Desktop."""
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  # override
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def GetOS(self):
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return util.GetPlatformName()
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AndroidTestEnvironment(DesktopTestEnvironment):
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """Manages the environment java tests require to run on Android."""
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  def __init__(self, package, chrome_version='HEAD'):
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    super(AndroidTestEnvironment, self).__init__(chrome_version)
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    self._package = package
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    self._device = None
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self._forwarder = None
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  # override
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def GlobalSetUp(self):
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    os.putenv('TEST_HTTP_PORT', str(ANDROID_TEST_HTTP_PORT))
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    os.putenv('TEST_HTTPS_PORT', str(ANDROID_TEST_HTTPS_PORT))
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    devices = android_commands.GetAttachedDevices()
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if not devices:
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      raise device_errors.NoDevicesError()
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    elif len(devices) > 1:
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      logging.warning('Multiple devices attached. Using %s.' % devices[0])
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self._device = device_utils.DeviceUtils(devices[0])
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    forwarder.Forwarder.Map(
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        [(ANDROID_TEST_HTTP_PORT, ANDROID_TEST_HTTP_PORT),
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         (ANDROID_TEST_HTTPS_PORT, ANDROID_TEST_HTTPS_PORT)],
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        self._device)
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  # override
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def GlobalTearDown(self):
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if self._device:
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      forwarder.Forwarder.UnmapAllDevicePorts(self._device)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  # override
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def GetOS(self):
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return 'android:%s' % self._package
118