Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / build / android / pylib / gtest / setup.py
index 6a9e65b..3206bda 100644 (file)
@@ -5,21 +5,20 @@
 """Generates test runner factory and tests for GTests."""
 # pylint: disable=W0212
 
-import fnmatch
-import glob
 import logging
 import os
-import shutil
 import sys
 
-from pylib import cmd_helper
 from pylib import constants
+from pylib import valgrind_tools
 
 from pylib.base import base_test_result
 from pylib.base import test_dispatcher
+from pylib.device import device_utils
 from pylib.gtest import test_package_apk
 from pylib.gtest import test_package_exe
 from pylib.gtest import test_runner
+from pylib.utils import isolator
 
 sys.path.insert(0,
                 os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'util', 'lib',
@@ -40,6 +39,7 @@ _ISOLATE_FILE_PATHS = {
     'media_unittests': 'media/media_unittests.isolate',
     'net_unittests': 'net/net_unittests.isolate',
     'sql_unittests': 'sql/sql_unittests.isolate',
+    'ui_base_unittests': 'ui/base/ui_base_tests.isolate',
     'ui_unittests': 'ui/base/ui_base_tests.isolate',
     'unit_tests': 'chrome/unit_tests.isolate',
     'webkit_unit_tests':
@@ -68,9 +68,6 @@ _DEPS_EXCLUSION_LIST = [
     'webkit/data/ico_decoder',
 ]
 
-_ISOLATE_SCRIPT = os.path.join(
-    constants.DIR_SOURCE_ROOT, 'tools', 'swarming_client', 'isolate.py')
-
 
 def _GenerateDepsDirUsingIsolate(suite_name, isolate_file_path=None):
   """Generate the dependency dir for the test suite using isolate.
@@ -80,9 +77,6 @@ def _GenerateDepsDirUsingIsolate(suite_name, isolate_file_path=None):
     isolate_file_path: .isolate file path to use. If there is a default .isolate
                        file path for the suite_name, this will override it.
   """
-  if os.path.isdir(constants.ISOLATE_DEPS_DIR):
-    shutil.rmtree(constants.ISOLATE_DEPS_DIR)
-
   if isolate_file_path:
     if os.path.isabs(isolate_file_path):
       isolate_abs_path = isolate_file_path
@@ -99,82 +93,17 @@ def _GenerateDepsDirUsingIsolate(suite_name, isolate_file_path=None):
   isolated_abs_path = os.path.join(
       constants.GetOutDirectory(), '%s.isolated' % suite_name)
   assert os.path.exists(isolate_abs_path), 'Cannot find %s' % isolate_abs_path
-  # This needs to be kept in sync with the cmd line options for isolate.py
-  # in src/build/isolate.gypi.
-  isolate_cmd = [
-      'python', _ISOLATE_SCRIPT,
-      'remap',
-      '--isolate', isolate_abs_path,
-      '--isolated', isolated_abs_path,
-      '--outdir', constants.ISOLATE_DEPS_DIR,
-
-      '--path-variable', 'DEPTH', constants.DIR_SOURCE_ROOT,
-      '--path-variable', 'PRODUCT_DIR', constants.GetOutDirectory(),
-
-      '--config-variable', 'OS', 'android',
-      '--config-variable', 'CONFIGURATION_NAME', constants.GetBuildType(),
-      '--config-variable', 'asan', '0',
-      '--config-variable', 'chromeos', '0',
-      '--config-variable', 'component', 'static_library',
-      '--config-variable', 'fastbuild', '0',
-      '--config-variable', 'icu_use_data_file_flag', '1',
-      # TODO(maruel): This may not be always true.
-      '--config-variable', 'target_arch', 'arm',
-      '--config-variable', 'use_openssl', '0',
-      '--config-variable', 'use_ozone', '0',
-  ]
-  assert not cmd_helper.RunCmd(isolate_cmd)
 
+  i = isolator.Isolator(constants.ISOLATE_DEPS_DIR)
+  i.Clear()
+  i.Remap(isolate_abs_path, isolated_abs_path)
   # We're relying on the fact that timestamps are preserved
   # by the remap command (hardlinked). Otherwise, all the data
   # will be pushed to the device once we move to using time diff
   # instead of md5sum. Perform a sanity check here.
-  for root, _, filenames in os.walk(constants.ISOLATE_DEPS_DIR):
-    if filenames:
-      linked_file = os.path.join(root, filenames[0])
-      orig_file = os.path.join(
-          constants.DIR_SOURCE_ROOT,
-          os.path.relpath(linked_file, constants.ISOLATE_DEPS_DIR))
-      if os.stat(linked_file).st_ino == os.stat(orig_file).st_ino:
-        break
-      else:
-        raise Exception('isolate remap command did not use hardlinks.')
-
-  # Delete excluded files as defined by _DEPS_EXCLUSION_LIST.
-  old_cwd = os.getcwd()
-  try:
-    os.chdir(constants.ISOLATE_DEPS_DIR)
-    excluded_paths = [x for y in _DEPS_EXCLUSION_LIST for x in glob.glob(y)]
-    if excluded_paths:
-      logging.info('Excluding the following from dependency list: %s',
-                   excluded_paths)
-    for p in excluded_paths:
-      if os.path.isdir(p):
-        shutil.rmtree(p)
-      else:
-        os.remove(p)
-  finally:
-    os.chdir(old_cwd)
-
-  # On Android, all pak files need to be in the top-level 'paks' directory.
-  paks_dir = os.path.join(constants.ISOLATE_DEPS_DIR, 'paks')
-  os.mkdir(paks_dir)
-
-  deps_out_dir = os.path.join(
-      constants.ISOLATE_DEPS_DIR,
-      os.path.relpath(os.path.join(constants.GetOutDirectory(), os.pardir),
-                      constants.DIR_SOURCE_ROOT))
-  for root, _, filenames in os.walk(deps_out_dir):
-    for filename in fnmatch.filter(filenames, '*.pak'):
-      shutil.move(os.path.join(root, filename), paks_dir)
-
-  # Move everything in PRODUCT_DIR to top level.
-  deps_product_dir = os.path.join(deps_out_dir, constants.GetBuildType())
-  if os.path.isdir(deps_product_dir):
-    for p in os.listdir(deps_product_dir):
-      shutil.move(os.path.join(deps_product_dir, p), constants.ISOLATE_DEPS_DIR)
-    os.rmdir(deps_product_dir)
-    os.rmdir(deps_out_dir)
+  i.VerifyHardlinks()
+  i.PurgeExcluded(_DEPS_EXCLUSION_LIST)
+  i.MoveOutputDeps()
 
 
 def _GetDisabledTestsFilterFromFile(suite_name):
@@ -214,16 +143,16 @@ def _GetTests(test_options, test_package, devices):
   Returns:
     A list of all the tests in the test suite.
   """
+  class TestListResult(base_test_result.BaseTestResult):
+    def __init__(self):
+      super(TestListResult, self).__init__(
+          'gtest_list_tests', base_test_result.ResultType.PASS)
+      self.test_list = []
+
   def TestListerRunnerFactory(device, _shard_index):
     class TestListerRunner(test_runner.TestRunner):
-      #override
-      def PushDataDeps(self):
-        pass
-
-      #override
       def RunTest(self, _test):
-        result = base_test_result.BaseTestResult(
-            'gtest_list_tests', base_test_result.ResultType.PASS)
+        result = TestListResult()
         self.test_package.Install(self.device)
         result.test_list = self.test_package.GetAllTests(self.device)
         results = base_test_result.TestRunResults()
@@ -290,6 +219,19 @@ def _FilterDisabledTests(tests, suite_name, has_gtest_filter):
   return tests
 
 
+def PushDataDeps(device, test_options, test_package):
+  valgrind_tools.PushFilesForTool(test_options.tool, device)
+  if os.path.exists(constants.ISOLATE_DEPS_DIR):
+    device_dir = (
+        constants.TEST_EXECUTABLE_DIR
+        if test_package.suite_name == 'breakpad_unittests'
+        else device.GetExternalStoragePath())
+    device.PushChangedFiles([
+        (os.path.join(constants.ISOLATE_DEPS_DIR, p),
+         '%s/%s' % (device_dir, p))
+        for p in os.listdir(constants.ISOLATE_DEPS_DIR)])
+
+
 def Setup(test_options, devices):
   """Create the test runner factory and tests.
 
@@ -317,6 +259,9 @@ def Setup(test_options, devices):
   _GenerateDepsDirUsingIsolate(test_options.suite_name,
                                test_options.isolate_file_path)
 
+  device_utils.DeviceUtils.parallel(devices).pMap(
+      PushDataDeps, test_options, test_package)
+
   tests = _GetTests(test_options, test_package, devices)
 
   # Constructs a new TestRunner with the current options.