OLD | NEW |
1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import json | 5 import json |
6 import os | 6 import os |
7 import tempfile | 7 import zipfile |
8 | 8 |
9 from devil.utils import cmd_helper | 9 from devil.utils import cmd_helper |
| 10 from devil.utils import reraiser_thread |
10 from pylib import constants | 11 from pylib import constants |
11 from pylib.base import base_test_result | 12 from pylib.base import base_test_result |
12 from pylib.base import test_run | 13 from pylib.base import test_run |
13 from pylib.results import json_results | 14 from pylib.results import json_results |
| 15 from py_utils import tempfile_ext |
14 | 16 |
15 | 17 |
16 class LocalMachineJunitTestRun(test_run.TestRun): | 18 class LocalMachineJunitTestRun(test_run.TestRun): |
17 def __init__(self, env, test_instance): | 19 def __init__(self, env, test_instance): |
18 super(LocalMachineJunitTestRun, self).__init__(env, test_instance) | 20 super(LocalMachineJunitTestRun, self).__init__(env, test_instance) |
19 | 21 |
20 #override | 22 #override |
21 def TestPackage(self): | 23 def TestPackage(self): |
22 return self._test_instance.suite | 24 return self._test_instance.suite |
23 | 25 |
24 #override | 26 #override |
25 def SetUp(self): | 27 def SetUp(self): |
26 pass | 28 pass |
27 | 29 |
28 #override | 30 #override |
29 def RunTests(self): | 31 def RunTests(self): |
30 with tempfile.NamedTemporaryFile() as json_file: | 32 with tempfile_ext.NamedTemporaryDirectory() as temp_dir: |
31 java_script = os.path.join(constants.GetOutDirectory(), 'bin', 'helper', | 33 json_file_path = os.path.join(temp_dir, 'results.json') |
32 self._test_instance.suite) | 34 |
| 35 # Extract resources needed for test. |
| 36 # TODO(mikecase): Investigate saving md5sums of zipfiles, and only |
| 37 # extract zipfiles when they change. |
| 38 def extract_resource_zip(resource_zip): |
| 39 def helper(): |
| 40 extract_dest = os.path.join( |
| 41 temp_dir, os.path.splitext(os.path.basename(resource_zip))[0]) |
| 42 with zipfile.ZipFile(resource_zip, 'r') as zf: |
| 43 zf.extractall(extract_dest) |
| 44 return extract_dest |
| 45 return helper |
| 46 |
| 47 resource_dirs = reraiser_thread.RunAsync( |
| 48 [extract_resource_zip(resource_zip) |
| 49 for resource_zip in self._test_instance.resource_zips]) |
| 50 |
| 51 java_script = os.path.join( |
| 52 constants.GetOutDirectory(), 'bin', 'helper', |
| 53 self._test_instance.suite) |
33 command = [java_script] | 54 command = [java_script] |
34 | 55 |
35 # Add Jar arguments. | 56 # Add Jar arguments. |
36 jar_args = ['-test-jars', self._test_instance.suite + '.jar', | 57 jar_args = ['-test-jars', self._test_instance.suite + '.jar', |
37 '-json-results-file', json_file.name] | 58 '-json-results-file', json_file_path] |
38 if self._test_instance.test_filter: | 59 if self._test_instance.test_filter: |
39 jar_args.extend(['-gtest-filter', self._test_instance.test_filter]) | 60 jar_args.extend(['-gtest-filter', self._test_instance.test_filter]) |
40 if self._test_instance.package_filter: | 61 if self._test_instance.package_filter: |
41 jar_args.extend(['-package-filter', | 62 jar_args.extend(['-package-filter', |
42 self._test_instance.package_filter]) | 63 self._test_instance.package_filter]) |
43 if self._test_instance.runner_filter: | 64 if self._test_instance.runner_filter: |
44 jar_args.extend(['-runner-filter', self._test_instance.runner_filter]) | 65 jar_args.extend(['-runner-filter', self._test_instance.runner_filter]) |
45 command.extend(['--jar-args', '"%s"' % ' '.join(jar_args)]) | 66 command.extend(['--jar-args', '"%s"' % ' '.join(jar_args)]) |
46 | 67 |
47 # Add JVM arguments. | 68 # Add JVM arguments. |
48 jvm_args = [] | 69 jvm_args = ['-Drobolectric.dependency.dir=%s' % |
49 # TODO(mikecase): Add a --robolectric-dep-dir arg to test runner. | 70 self._test_instance.robolectric_runtime_deps_dir, |
50 # Have this arg set by GN in the generated test runner scripts. | 71 '-Ddir.source.root=%s' % constants.DIR_SOURCE_ROOT,] |
51 jvm_args += [ | 72 |
52 '-Drobolectric.dependency.dir=%s' % os.path.join( | 73 if self._test_instance.android_manifest_path: |
53 constants.GetOutDirectory(), 'lib.java', 'third_party', | 74 jvm_args += ['-Dchromium.robolectric.manifest=%s' % |
54 'robolectric'), | 75 self._test_instance.android_manifest_path] |
55 '-Ddir.source.root=%s' % constants.DIR_SOURCE_ROOT, | 76 |
56 ] | 77 if self._test_instance.package_name: |
| 78 jvm_args += ['-Dchromium.robolectric.package.name=%s' % |
| 79 self._test_instance.package_name] |
| 80 |
| 81 if resource_dirs: |
| 82 jvm_args += ['-Dchromium.robolectric.resource.dirs=%s' % |
| 83 ':'.join(resource_dirs)] |
| 84 |
57 if self._test_instance.coverage_dir: | 85 if self._test_instance.coverage_dir: |
58 if not os.path.exists(self._test_instance.coverage_dir): | 86 if not os.path.exists(self._test_instance.coverage_dir): |
59 os.makedirs(self._test_instance.coverage_dir) | 87 os.makedirs(self._test_instance.coverage_dir) |
60 elif not os.path.isdir(self._test_instance.coverage_dir): | 88 elif not os.path.isdir(self._test_instance.coverage_dir): |
61 raise Exception('--coverage-dir takes a directory, not file path.') | 89 raise Exception('--coverage-dir takes a directory, not file path.') |
62 jvm_args.append('-Demma.coverage.out.file=%s' % os.path.join( | 90 jvm_args.append('-Demma.coverage.out.file=%s' % os.path.join( |
63 self._test_instance.coverage_dir, | 91 self._test_instance.coverage_dir, |
64 '%s.ec' % self._test_instance.suite)) | 92 '%s.ec' % self._test_instance.suite)) |
| 93 |
65 if jvm_args: | 94 if jvm_args: |
66 command.extend(['--jvm-args', '"%s"' % ' '.join(jvm_args)]) | 95 command.extend(['--jvm-args', '"%s"' % ' '.join(jvm_args)]) |
67 | 96 |
68 cmd_helper.RunCmd(command) | 97 cmd_helper.RunCmd(command) |
69 results_list = json_results.ParseResultsFromJson( | 98 with open(json_file_path, 'r') as f: |
70 json.loads(json_file.read())) | 99 results_list = json_results.ParseResultsFromJson( |
| 100 json.loads(f.read())) |
71 | 101 |
72 test_run_results = base_test_result.TestRunResults() | 102 test_run_results = base_test_result.TestRunResults() |
73 test_run_results.AddResults(results_list) | 103 test_run_results.AddResults(results_list) |
74 | 104 |
75 return [test_run_results] | 105 return [test_run_results] |
76 | 106 |
77 #override | 107 #override |
78 def TearDown(self): | 108 def TearDown(self): |
79 pass | 109 pass |
OLD | NEW |