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)
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]
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())
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)
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]