Пример #1
0
  def RunTests(self, results):
    wrapper_path = os.path.join(constants.GetOutDirectory(), 'bin', 'helper',
                                self._test_instance.suite)

    # This avoids searching through the classparth jars for tests classes,
    # which takes about 1-2 seconds.
    # Do not shard when a test filter is present since we do not know at this
    # point which tests will be filtered out.
    if (self._test_instance.shards == 1 or self._test_instance.test_filter
        or self._test_instance.suite in _EXCLUDED_SUITES):
      test_classes = []
      shards = 1
    else:
      test_classes = _GetTestClasses(wrapper_path)
      shards = ChooseNumOfShards(test_classes, self._test_instance.shards)

    logging.info('Running tests on %d shard(s).', shards)
    group_test_list = GroupTestsForShard(shards, test_classes)

    with tempfile_ext.NamedTemporaryDirectory() as temp_dir:
      cmd_list = [[wrapper_path] for _ in range(shards)]
      json_result_file_paths = [
          os.path.join(temp_dir, 'results%d.json' % i) for i in range(shards)
      ]
      jar_args_list = self._CreateJarArgsList(json_result_file_paths,
                                              group_test_list, shards)
      for i in range(shards):
        cmd_list[i].extend(['--jar-args', '"%s"' % ' '.join(jar_args_list[i])])

      jvm_args = self._CreateJvmArgsList()
      if jvm_args:
        for cmd in cmd_list:
          cmd.extend(['--jvm-args', '"%s"' % ' '.join(jvm_args)])

      AddPropertiesJar(cmd_list, temp_dir, self._test_instance.resource_apk)

      procs = [
          subprocess.Popen(cmd,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.STDOUT) for cmd in cmd_list
      ]
      PrintProcessesStdout(procs)

      results_list = []
      try:
        for json_file_path in json_result_file_paths:
          with open(json_file_path, 'r') as f:
            results_list += json_results.ParseResultsFromJson(
                json.loads(f.read()))
      except IOError:
        # In the case of a failure in the JUnit or Robolectric test runner
        # the output json file may never be written.
        results_list = [
          base_test_result.BaseTestResult(
              'Test Runner Failure', base_test_result.ResultType.UNKNOWN)
        ]

      test_run_results = base_test_result.TestRunResults()
      test_run_results.AddResults(results_list)
      results.append(test_run_results)
Пример #2
0
    def RunTest(self, _test):
        """Runs junit tests from |self._test_suite|."""
        with tempfile.NamedTemporaryFile() as json_file:
            java_script = os.path.join(constants.GetOutDirectory(), 'bin',
                                       'helper', self._test_suite)
            command = [java_script]

            # Add Jar arguments.
            jar_args = [
                '-test-jars', self._test_suite + '.jar', '-json-results-file',
                json_file.name
            ]
            if self._test_filter:
                jar_args.extend(['-gtest-filter', self._test_filter])
            if self._package_filter:
                jar_args.extend(['-package-filter', self._package_filter])
            if self._runner_filter:
                jar_args.extend(['-runner-filter', self._runner_filter])
            if self._sdk_version:
                jar_args.extend(['-sdk-version', self._sdk_version])
            command.extend(['--jar-args', '"%s"' % ' '.join(jar_args)])

            # Add JVM arguments.
            jvm_args = []
            if self._coverage_dir:
                jvm_args.append('-Demma.coverage.out.file=%s' %
                                self._coverage_dir)
            if jvm_args:
                command.extend(['--jvm-args', '"%s"' % ' '.join(jvm_args)])

            return_code = cmd_helper.RunCmd(command)
            results_list = json_results.ParseResultsFromJson(
                json.loads(json_file.read()))
            return (results_list, return_code)
    def RunTests(self):
        with tempfile.NamedTemporaryFile() as json_file:
            java_script = os.path.join(constants.GetOutDirectory(), 'bin',
                                       'helper', self._test_instance.suite)
            command = [java_script]

            # Add Jar arguments.
            jar_args = [
                '-test-jars', self._test_instance.suite + '.jar',
                '-json-results-file', json_file.name
            ]
            if self._test_instance.test_filter:
                jar_args.extend(
                    ['-gtest-filter', self._test_instance.test_filter])
            if self._test_instance.package_filter:
                jar_args.extend(
                    ['-package-filter', self._test_instance.package_filter])
            if self._test_instance.runner_filter:
                jar_args.extend(
                    ['-runner-filter', self._test_instance.runner_filter])
            command.extend(['--jar-args', '"%s"' % ' '.join(jar_args)])

            # Add JVM arguments.
            jvm_args = []
            # TODO(mikecase): Add a --robolectric-dep-dir arg to test runner.
            # Have this arg set by GN in the generated test runner scripts.
            jvm_args += [
                '-Drobolectric.dependency.dir=%s' %
                os.path.join(constants.GetOutDirectory(), 'lib.java',
                             'third_party', 'robolectric')
            ]
            if self._test_instance.coverage_dir:
                if not os.path.exists(self._test_instance.coverage_dir):
                    os.makedirs(self._test_instance.coverage_dir)
                elif not os.path.isdir(self._test_instance.coverage_dir):
                    raise Exception(
                        '--coverage-dir takes a directory, not file path.')
                jvm_args.append(
                    '-Demma.coverage.out.file=%s' %
                    os.path.join(self._test_instance.coverage_dir,
                                 '%s.ec' % self._test_instance.suite))
            if jvm_args:
                command.extend(['--jvm-args', '"%s"' % ' '.join(jvm_args)])

            cmd_helper.RunCmd(command)
            results_list = json_results.ParseResultsFromJson(
                json.loads(json_file.read()))

            test_run_results = base_test_result.TestRunResults()
            test_run_results.AddResults(results_list)

            return [test_run_results]
Пример #4
0
  def post_run(self, _):
    if self._on_device_script:
      os.remove(self._on_device_script)

    if self._test_launcher_summary_output and self._rdb_client:
      if not os.path.exists(self._test_launcher_summary_output):
        logging.error('Unable to locate %s in order to upload results to RDB.',
                      self._test_launcher_summary_output)
        return
      with open(self._test_launcher_summary_output) as f:
        raw_results = json.load(f)
      parsed_results = json_results.ParseResultsFromJson(raw_results)
      for r in parsed_results:
        self._rdb_client.Post(
            r.GetName(),
            r.GetType(),
            r.GetDuration(),
            r.GetLog(),
            None,
            failure_reason=r.GetFailureReason())
Пример #5
0
 def RunTest(self, _test):
   """Runs junit tests from |self._test_suite|."""
   with tempfile.NamedTemporaryFile() as json_file:
     java_script = os.path.join(
         constants.GetOutDirectory(), 'bin', self._test_suite)
     command = [java_script,
                '-test-jars', self._test_suite + '.jar',
                '-json-results-file', json_file.name]
     if self._test_filter:
       command.extend(['-gtest-filter', self._test_filter])
     if self._package_filter:
       command.extend(['-package-filter', self._package_filter])
     if self._runner_filter:
       command.extend(['-runner-filter', self._runner_filter])
     if self._sdk_version:
       command.extend(['-sdk-version', self._sdk_version])
     return_code = cmd_helper.RunCmd(command)
     results_list = json_results.ParseResultsFromJson(
         json.loads(json_file.read()))
     return (results_list, return_code)
Пример #6
0
 def RunTest(self, _test):
     """Runs junit tests from |self._test_suite|."""
     with tempfile.NamedTemporaryFile() as json_file:
         command = [
             'java',
             '-Drobolectric.dependency.dir=%s' %
             os.path.join(constants.GetOutDirectory(), 'lib.java'), '-jar',
             os.path.join(constants.GetOutDirectory(), 'lib.java',
                          '%s.jar' % self._test_suite),
             '-json-results-file', json_file.name
         ]
         if self._test_filter:
             command.extend(['-gtest-filter', self._test_filter])
         if self._package_filter:
             command.extend(['-package-filter', self._package_filter])
         if self._runner_filter:
             command.extend(['-runner-filter', self._runner_filter])
         if self._sdk_version:
             command.extend(['-sdk-version', self._sdk_version])
         return_code = cmd_helper.RunCmd(command)
         results_list = json_results.ParseResultsFromJson(
             json.loads(json_file.read()))
         return (results_list, return_code)
    def RunTests(self, results):
        with tempfile_ext.NamedTemporaryDirectory() as temp_dir:
            json_file_path = os.path.join(temp_dir, 'results.json')
            java_script = os.path.join(constants.GetOutDirectory(), 'bin',
                                       'helper', self._test_instance.suite)
            command = [java_script]

            # Add Jar arguments.
            jar_args = [
                '-test-jars', self._test_instance.suite + '.jar',
                '-json-results-file', json_file_path
            ]
            if self._test_instance.test_filter:
                jar_args.extend(
                    ['-gtest-filter', self._test_instance.test_filter])
            if self._test_instance.package_filter:
                jar_args.extend(
                    ['-package-filter', self._test_instance.package_filter])
            if self._test_instance.runner_filter:
                jar_args.extend(
                    ['-runner-filter', self._test_instance.runner_filter])
            command.extend(['--jar-args', '"%s"' % ' '.join(jar_args)])

            # Add JVM arguments.
            jvm_args = [
                '-Drobolectric.dependency.dir=%s' %
                self._test_instance.robolectric_runtime_deps_dir,
                '-Ddir.source.root=%s' % constants.DIR_SOURCE_ROOT,
                '-Drobolectric.resourcesMode=binary',
            ]

            if logging.getLogger().isEnabledFor(logging.INFO):
                jvm_args += ['-Drobolectric.logging=stdout']

            if self._test_instance.debug_socket:
                jvm_args += [
                    '-agentlib:jdwp=transport=dt_socket'
                    ',server=y,suspend=y,address=%s' %
                    self._test_instance.debug_socket
                ]

            if self._test_instance.coverage_dir:
                if not os.path.exists(self._test_instance.coverage_dir):
                    os.makedirs(self._test_instance.coverage_dir)
                elif not os.path.isdir(self._test_instance.coverage_dir):
                    raise Exception(
                        '--coverage-dir takes a directory, not file path.')
                if self._test_instance.coverage_on_the_fly:
                    jacoco_coverage_file = os.path.join(
                        self._test_instance.coverage_dir,
                        '%s.exec' % self._test_instance.suite)
                    jacoco_agent_path = os.path.join(
                        host_paths.DIR_SOURCE_ROOT, 'third_party', 'jacoco',
                        'lib', 'jacocoagent.jar')
                    jacoco_args = '-javaagent:{}=destfile={},inclnolocationclasses=true'
                    jvm_args.append(
                        jacoco_args.format(jacoco_agent_path,
                                           jacoco_coverage_file))
                else:
                    jvm_args.append(
                        '-Djacoco-agent.destfile=%s' %
                        os.path.join(self._test_instance.coverage_dir,
                                     '%s.exec' % self._test_instance.suite))

            if jvm_args:
                command.extend(['--jvm-args', '"%s"' % ' '.join(jvm_args)])

            # Create properties file for Robolectric test runners so they can find the
            # binary resources.
            properties_jar_path = os.path.join(temp_dir, 'properties.jar')
            with zipfile.ZipFile(properties_jar_path, 'w') as z:
                z.writestr(
                    'com/android/tools/test_config.properties',
                    'android_resource_apk=%s' %
                    self._test_instance.resource_apk)
            command.extend(['--classpath', properties_jar_path])

            cmd_helper.RunCmd(command)
            try:
                with open(json_file_path, 'r') as f:
                    results_list = json_results.ParseResultsFromJson(
                        json.loads(f.read()))
            except IOError:
                # In the case of a failure in the JUnit or Robolectric test runner
                # the output json file may never be written.
                results_list = [
                    base_test_result.BaseTestResult(
                        'Test Runner Failure',
                        base_test_result.ResultType.UNKNOWN)
                ]

            test_run_results = base_test_result.TestRunResults()
            test_run_results.AddResults(results_list)
            results.append(test_run_results)
    def RunTests(self, results):
        with tempfile_ext.NamedTemporaryDirectory() as temp_dir:
            json_file_path = os.path.join(temp_dir, 'results.json')

            # Extract resources needed for test.
            # TODO(mikecase): Investigate saving md5sums of zipfiles, and only
            # extract zipfiles when they change.
            def extract_resource_zip(resource_zip):
                def helper():
                    extract_dest = os.path.join(
                        temp_dir,
                        os.path.splitext(os.path.basename(resource_zip))[0])
                    with zipfile.ZipFile(resource_zip, 'r') as zf:
                        zf.extractall(extract_dest)
                    return extract_dest

                return helper

            resource_dirs = reraiser_thread.RunAsync([
                extract_resource_zip(resource_zip)
                for resource_zip in self._test_instance.resource_zips
                if os.path.exists(resource_zip)
            ])

            java_script = os.path.join(constants.GetOutDirectory(), 'bin',
                                       'helper', self._test_instance.suite)
            command = [java_script]

            # Add Jar arguments.
            jar_args = [
                '-test-jars', self._test_instance.suite + '.jar',
                '-json-results-file', json_file_path
            ]
            if self._test_instance.test_filter:
                jar_args.extend(
                    ['-gtest-filter', self._test_instance.test_filter])
            if self._test_instance.package_filter:
                jar_args.extend(
                    ['-package-filter', self._test_instance.package_filter])
            if self._test_instance.runner_filter:
                jar_args.extend(
                    ['-runner-filter', self._test_instance.runner_filter])
            command.extend(['--jar-args', '"%s"' % ' '.join(jar_args)])

            # Add JVM arguments.
            jvm_args = [
                '-Drobolectric.dependency.dir=%s' %
                self._test_instance.robolectric_runtime_deps_dir,
                '-Ddir.source.root=%s' % constants.DIR_SOURCE_ROOT,
            ]

            if self._test_instance.android_manifest_path:
                jvm_args += [
                    '-Dchromium.robolectric.manifest=%s' %
                    self._test_instance.android_manifest_path
                ]

            if self._test_instance.package_name:
                jvm_args += [
                    '-Dchromium.robolectric.package.name=%s' %
                    self._test_instance.package_name
                ]

            if resource_dirs:
                jvm_args += [
                    '-Dchromium.robolectric.resource.dirs=%s' %
                    ':'.join(resource_dirs)
                ]

            if logging.getLogger().isEnabledFor(logging.INFO):
                jvm_args += ['-Drobolectric.logging=stdout']

            if self._test_instance.debug_socket:
                jvm_args += [
                    '-agentlib:jdwp=transport=dt_socket'
                    ',server=y,suspend=y,address=%s' %
                    self._test_instance.debug_socket
                ]

            if self._test_instance.coverage_dir:
                if not os.path.exists(self._test_instance.coverage_dir):
                    os.makedirs(self._test_instance.coverage_dir)
                elif not os.path.isdir(self._test_instance.coverage_dir):
                    raise Exception(
                        '--coverage-dir takes a directory, not file path.')
                jvm_args.append(
                    '-Demma.coverage.out.file=%s' %
                    os.path.join(self._test_instance.coverage_dir,
                                 '%s.ec' % self._test_instance.suite))

            if jvm_args:
                command.extend(['--jvm-args', '"%s"' % ' '.join(jvm_args)])

            cmd_helper.RunCmd(command)
            try:
                with open(json_file_path, 'r') as f:
                    results_list = json_results.ParseResultsFromJson(
                        json.loads(f.read()))
            except IOError:
                # In the case of a failure in the JUnit or Robolectric test runner
                # the output json file may never be written.
                results_list = [
                    base_test_result.BaseTestResult(
                        'Test Runner Failure',
                        base_test_result.ResultType.UNKNOWN)
                ]

            test_run_results = base_test_result.TestRunResults()
            test_run_results.AddResults(results_list)
            results.append(test_run_results)
    def RunTests(self):
        with tempfile_ext.NamedTemporaryDirectory() as temp_dir:
            json_file_path = os.path.join(temp_dir, 'results.json')

            # Extract resources needed for test.
            # TODO(mikecase): Investigate saving md5sums of zipfiles, and only
            # extract zipfiles when they change.
            def extract_resource_zip(resource_zip):
                def helper():
                    extract_dest = os.path.join(
                        temp_dir,
                        os.path.splitext(os.path.basename(resource_zip))[0])
                    with zipfile.ZipFile(resource_zip, 'r') as zf:
                        zf.extractall(extract_dest)
                    return extract_dest

                return helper

            resource_dirs = reraiser_thread.RunAsync([
                extract_resource_zip(resource_zip)
                for resource_zip in self._test_instance.resource_zips
                if os.path.exists(resource_zip)
            ])

            java_script = os.path.join(constants.GetOutDirectory(), 'bin',
                                       'helper', self._test_instance.suite)
            command = [java_script]

            # Add Jar arguments.
            jar_args = [
                '-test-jars', self._test_instance.suite + '.jar',
                '-json-results-file', json_file_path
            ]
            if self._test_instance.test_filter:
                jar_args.extend(
                    ['-gtest-filter', self._test_instance.test_filter])
            if self._test_instance.package_filter:
                jar_args.extend(
                    ['-package-filter', self._test_instance.package_filter])
            if self._test_instance.runner_filter:
                jar_args.extend(
                    ['-runner-filter', self._test_instance.runner_filter])
            command.extend(['--jar-args', '"%s"' % ' '.join(jar_args)])

            # Add JVM arguments.
            jvm_args = [
                '-Drobolectric.dependency.dir=%s' %
                self._test_instance.robolectric_runtime_deps_dir,
                '-Ddir.source.root=%s' % constants.DIR_SOURCE_ROOT,
            ]

            if self._test_instance.android_manifest_path:
                jvm_args += [
                    '-Dchromium.robolectric.manifest=%s' %
                    self._test_instance.android_manifest_path
                ]

            if self._test_instance.package_name:
                jvm_args += [
                    '-Dchromium.robolectric.package.name=%s' %
                    self._test_instance.package_name
                ]

            if resource_dirs:
                jvm_args += [
                    '-Dchromium.robolectric.resource.dirs=%s' %
                    ':'.join(resource_dirs)
                ]

            if self._test_instance.coverage_dir:
                if not os.path.exists(self._test_instance.coverage_dir):
                    os.makedirs(self._test_instance.coverage_dir)
                elif not os.path.isdir(self._test_instance.coverage_dir):
                    raise Exception(
                        '--coverage-dir takes a directory, not file path.')
                jvm_args.append(
                    '-Demma.coverage.out.file=%s' %
                    os.path.join(self._test_instance.coverage_dir,
                                 '%s.ec' % self._test_instance.suite))

            if jvm_args:
                command.extend(['--jvm-args', '"%s"' % ' '.join(jvm_args)])

            cmd_helper.RunCmd(command)
            with open(json_file_path, 'r') as f:
                results_list = json_results.ParseResultsFromJson(
                    json.loads(f.read()))

            test_run_results = base_test_result.TestRunResults()
            test_run_results.AddResults(results_list)

            return [test_run_results]