OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Runs install and update tests. | 6 """Runs install and update tests. |
7 | 7 |
8 Install tests are performed using a single Chrome build, whereas two or more | 8 Install tests are performed using a single Chrome build, whereas two or more |
9 builds are needed for Update tests. There are separate command arguments for | 9 builds are needed for Update tests. There are separate command arguments for |
10 the builds that will be used for each of the tests. If a test file contains | 10 the builds that will be used for each of the tests. If a test file contains |
11 both types of tests(install and update), both arguments should be specified. | 11 both types of tests(install and update), both arguments should be specified. |
12 Otherwise, specify only the command argument that is required for the test. | 12 Otherwise, specify only the command argument that is required for the test. |
13 To run a test with this script, append the module name to the _TEST_MODULES | 13 To run a test with this script, append the module name to the _TEST_MODULES |
14 list. Modules added to the list must be in the same directory or in a sub- | 14 list. Modules added to the list must be in the same directory or in a sub- |
15 directory that's in the same location as this script. | 15 directory that's in the same location as this script. |
16 | 16 |
17 Example: | 17 Example: |
18 $ python run_install_test.py --url=<chrome_builds_url> --filter=* \ | 18 $ python run_install_test.py --url=<chrome_builds_url> --filter=* \ |
19 --install-build=24.0.1290.0 --update-builds=24.0.1289.0,24.0.1290.0 | 19 --install-build=24.0.1290.0 --update-builds=24.0.1289.0,24.0.1290.0 |
20 """ | 20 """ |
21 | 21 |
22 import fnmatch | |
23 import logging | 22 import logging |
24 import optparse | 23 import optparse |
25 import os | 24 import os |
26 import re | 25 import re |
27 import sys | 26 import sys |
28 import unittest | 27 import unittest |
29 | 28 |
30 import chrome_installer_win | 29 import chrome_installer_win |
31 from install_test import InstallTest | 30 from install_test import InstallTest |
32 | 31 |
33 _DIRECTORY = os.path.dirname(os.path.abspath(__file__)) | 32 from common import unittest_util |
34 sys.path.append(os.path.join(os.path.dirname(_DIRECTORY), 'pyautolib')) | 33 from common import util |
35 | |
36 import pyauto_utils | |
37 | 34 |
38 # To run tests from a module, append the module name to this list. | 35 # To run tests from a module, append the module name to this list. |
39 _TEST_MODULES = ['sample_updater'] | 36 _TEST_MODULES = ['sample_updater'] |
40 | 37 |
41 for module in _TEST_MODULES: | 38 for module in _TEST_MODULES: |
42 __import__(module) | 39 __import__(module) |
43 | 40 |
44 | 41 |
45 class Main(object): | 42 class Main(object): |
46 """Main program for running 'Fresh Install' and 'Updater' tests.""" | 43 """Main program for running 'Fresh Install' and 'Updater' tests.""" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 """ | 86 """ |
90 builds = [] | 87 builds = [] |
91 if self._opts.install_build: | 88 if self._opts.install_build: |
92 builds.append(self._opts.install_build) | 89 builds.append(self._opts.install_build) |
93 if self._opts.update_builds: | 90 if self._opts.update_builds: |
94 builds.extend(self._opts.update_builds.split(',')) | 91 builds.extend(self._opts.update_builds.split(',')) |
95 builds = list(frozenset(builds)) | 92 builds = list(frozenset(builds)) |
96 for build in builds: | 93 for build in builds: |
97 if not re.match('\d+\.\d+\.\d+\.\d+', build): | 94 if not re.match('\d+\.\d+\.\d+\.\d+', build): |
98 raise RuntimeError('Invalid build number: %s' % build) | 95 raise RuntimeError('Invalid build number: %s' % build) |
99 if not pyauto_utils.DoesUrlExist('%s/%s/' % (self._opts.url, build)): | 96 if not util.DoesUrlExist('%s/%s/' % (self._opts.url, build)): |
100 raise RuntimeError('Could not locate build no. %s' % build) | 97 raise RuntimeError('Could not locate build no. %s' % build) |
101 | 98 |
102 def _SetLoggingConfiguration(self): | 99 def _SetLoggingConfiguration(self): |
103 """Sets the basic logging configuration.""" | 100 """Sets the basic logging configuration.""" |
104 log_format = '%(asctime)s %(levelname)-8s %(message)s' | 101 log_format = '%(asctime)s %(levelname)-8s %(message)s' |
105 logging.basicConfig(level=logging.INFO, format=log_format) | 102 logging.basicConfig(level=logging.INFO, format=log_format) |
106 | 103 |
107 def _GetTestsFromSuite(self, suite): | |
108 """Returns all the tests from a given test suite. | |
109 | |
110 Args: | |
111 suite: A unittest.TestSuite object. | |
112 | |
113 Returns: | |
114 A list that contains all the tests found in the suite. | |
115 """ | |
116 tests = [] | |
117 for test in suite: | |
118 if isinstance(test, unittest.TestSuite): | |
119 tests += self._GetTestsFromSuite(test) | |
120 else: | |
121 tests += [test] | |
122 return tests | |
123 | |
124 def _GetTestName(self, test): | |
125 """Gets the test name of the given unittest test. | |
126 | |
127 Args: | |
128 test: A unittest test. | |
129 | |
130 Returns: | |
131 A string representing the full test name. | |
132 """ | |
133 return '.'.join([test.__module__, test.__class__.__name__, | |
134 test._testMethodName]) | |
135 | |
136 def _FilterTestSuite(self, suite, gtest_filter): | |
137 """Returns a new filtered test suite based on the given gtest filter. | |
138 | |
139 See http://code.google.com/p/googletest/wiki/AdvancedGuide for | |
140 gtest_filter specification. | |
141 | |
142 Args: | |
143 suite: A unittest.TestSuite object, which can be obtained by calling | |
144 |unittest.defaultTestLoader.loadTestsFromName|. | |
145 gtest_filter: The gtest filter to use. Filter can be passed as follows: | |
146 --filter=*className* or --filter=*testcaseName. | |
147 | |
148 Returns: | |
149 A unittest.TestSuite object that contains tests that match the gtest | |
150 filter. | |
151 """ | |
152 return unittest.TestSuite( | |
153 self._FilterTests(self._GetTestsFromSuite(suite), gtest_filter)) | |
154 | |
155 def _FilterTests(self, all_tests, gtest_filter): | |
156 """Returns a filtered list of tests based on the given gtest filter. | |
157 | |
158 Args: | |
159 all_tests: A list that contains all unittests in a given suite. This | |
160 list must be obtained by calling |_GetTestsFromSuite|. | |
161 gtest_filter: The gtest filter to use. Filter can be passed as follows: | |
162 *className* or *testcaseName. | |
163 | |
164 Returns: | |
165 A list that contains all tests that match the given gtest filter. | |
166 """ | |
167 pattern_groups = gtest_filter.split('-') | |
168 positive_patterns = pattern_groups[0].split(':') | |
169 negative_patterns = None | |
170 if len(pattern_groups) > 1: | |
171 negative_patterns = pattern_groups[1].split(':') | |
172 tests = [] | |
173 for test in all_tests: | |
174 test_name = self._GetTestName(test) | |
175 # Test name must by matched by one positive pattern. | |
176 for pattern in positive_patterns: | |
177 if fnmatch.fnmatch(test_name, pattern): | |
178 break | |
179 else: | |
180 continue | |
181 # Test name must not be matched by any negative patterns. | |
182 for pattern in negative_patterns or []: | |
183 if fnmatch.fnmatch(test_name, pattern): | |
184 break | |
185 else: | |
186 tests += [test] | |
187 return tests | |
188 | |
189 def _Run(self): | 104 def _Run(self): |
190 """Runs the unit tests.""" | 105 """Runs the unit tests.""" |
191 all_tests = unittest.defaultTestLoader.loadTestsFromNames(_TEST_MODULES) | 106 all_tests = unittest.defaultTestLoader.loadTestsFromNames(_TEST_MODULES) |
192 tests = self._FilterTestSuite(all_tests, self._opts.filter) | 107 tests = unittest_util.FilterTestSuite(all_tests, self._opts.filter) |
193 result = pyauto_utils.GTestTextTestRunner(verbosity=1).run(tests) | 108 result = unittest_util.TextTestRunner(verbosity=1).run(tests) |
194 # Run tests again if installation type is 'both'(i.e., user and system). | 109 # Run tests again if installation type is 'both'(i.e., user and system). |
195 if self._opts.install_type == 'both': | 110 if self._opts.install_type == 'both': |
196 # Load the tests again so test parameters can be reinitialized. | 111 # Load the tests again so test parameters can be reinitialized. |
197 all_tests = unittest.defaultTestLoader.loadTestsFromNames(_TEST_MODULES) | 112 all_tests = unittest.defaultTestLoader.loadTestsFromNames(_TEST_MODULES) |
198 tests = self._FilterTestSuite(all_tests, self._opts.filter) | 113 tests = unittest_util.FilterTestSuite(all_tests, self._opts.filter) |
199 InstallTest.SetInstallType(chrome_installer_win.InstallationType.SYSTEM) | 114 InstallTest.SetInstallType(chrome_installer_win.InstallationType.SYSTEM) |
200 result = pyauto_utils.GTestTextTestRunner(verbosity=1).run(tests) | 115 result = unittest_util.TextTestRunner(verbosity=1).run(tests) |
201 del(tests) | 116 del(tests) |
202 if not result.wasSuccessful(): | 117 if not result.wasSuccessful(): |
203 print >>sys.stderr, ('Not all tests were successful.') | 118 print >>sys.stderr, ('Not all tests were successful.') |
204 sys.exit(1) | 119 sys.exit(1) |
205 sys.exit(0) | 120 sys.exit(0) |
206 | 121 |
207 | 122 |
208 if __name__ == '__main__': | 123 if __name__ == '__main__': |
209 Main() | 124 Main() |
OLD | NEW |