| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 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 """Test fixture for tests involving installing/updating Chrome. | 5 """Test fixture for tests involving installing/updating Chrome. |
| 6 | 6 |
| 7 Provides an interface to install or update chrome from within a testcase, and | 7 Provides an interface to install or update chrome from within a testcase, and |
| 8 allows users to run tests using installed version of Chrome. User and system | 8 allows users to run tests using installed version of Chrome. User and system |
| 9 level installations are supported, and either one can be used for running the | 9 level installations are supported, and either one can be used for running the |
| 10 tests. Currently the only platform it supports is Windows. | 10 tests. Currently the only platform it supports is Windows. |
| 11 """ | 11 """ |
| 12 | 12 |
| 13 import atexit | 13 import atexit |
| 14 import logging | |
| 15 import optparse | |
| 16 import os | 14 import os |
| 17 import platform | 15 import platform |
| 18 import re | |
| 19 import shutil | |
| 20 import stat | 16 import stat |
| 21 import sys | 17 import sys |
| 22 import tempfile | 18 import tempfile |
| 23 import unittest | 19 import unittest |
| 24 import urllib | 20 import urllib |
| 25 | 21 |
| 26 import chrome_installer_win | 22 import chrome_installer_win |
| 27 | 23 |
| 28 _DIRECTORY = os.path.dirname(os.path.abspath(__file__)) | 24 _DIRECTORY = os.path.dirname(os.path.abspath(__file__)) |
| 29 sys.path.append(os.path.join(os.path.dirname(_DIRECTORY), 'pyautolib')) | 25 sys.path.append(os.path.join(os.path.dirname(_DIRECTORY), 'pyautolib')) |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 builds = list(frozenset(builds)) | 211 builds = list(frozenset(builds)) |
| 216 for build in builds: | 212 for build in builds: |
| 217 url = '%s%s/%s/mini_installer.exe' % (base_url, build, system) | 213 url = '%s%s/%s/mini_installer.exe' % (base_url, build, system) |
| 218 installer_path = os.path.join(tempdir, 'mini_installer_%s.exe' % build) | 214 installer_path = os.path.join(tempdir, 'mini_installer_%s.exe' % build) |
| 219 InstallTest._installer_paths[build] = installer_path | 215 InstallTest._installer_paths[build] = installer_path |
| 220 InstallTest._Download(url, installer_path) | 216 InstallTest._Download(url, installer_path) |
| 221 InstallTest._chrome_driver = os.path.join(tempdir, 'chromedriver.exe') | 217 InstallTest._chrome_driver = os.path.join(tempdir, 'chromedriver.exe') |
| 222 url = '%s%s/%s/%s/chromedriver.exe' % (base_url, build, system, | 218 url = '%s%s/%s/%s/chromedriver.exe' % (base_url, build, system, |
| 223 'chrome-win32.test') | 219 'chrome-win32.test') |
| 224 InstallTest._Download(url, InstallTest._chrome_driver) | 220 InstallTest._Download(url, InstallTest._chrome_driver) |
| 225 | |
| 226 | |
| 227 class Main(object): | |
| 228 """Main program for running Updater tests.""" | |
| 229 | |
| 230 def __init__(self): | |
| 231 self._SetLoggingConfiguration() | |
| 232 self._ParseArgs() | |
| 233 self._Run() | |
| 234 | |
| 235 def _ParseArgs(self): | |
| 236 """Parses command line arguments.""" | |
| 237 parser = optparse.OptionParser() | |
| 238 parser.add_option( | |
| 239 '-u', '--url', type='string', default='', dest='url', | |
| 240 help='Specifies the build url, without the build number.') | |
| 241 parser.add_option( | |
| 242 '-o', '--options', type='string', default='', | |
| 243 help='Specifies any additional Chrome options (i.e. --system-level).') | |
| 244 parser.add_option( | |
| 245 '--install-build', type='string', default='', dest='install_build', | |
| 246 help='Specifies the build to be used for fresh install testing.') | |
| 247 parser.add_option( | |
| 248 '--update-builds', type='string', default='', dest='update_builds', | |
| 249 help='Specifies the builds to be used for updater testing.') | |
| 250 parser.add_option( | |
| 251 '--install-type', type='string', default='user', dest='install_type', | |
| 252 help='Type of installation (i.e., user, system, or both)') | |
| 253 self._opts, self._args = parser.parse_args() | |
| 254 self._ValidateArgs() | |
| 255 if(self._opts.install_type == 'system' or | |
| 256 self._opts.install_type == 'user'): | |
| 257 install_type = ({ | |
| 258 'system' : chrome_installer_win.InstallationType.SYSTEM, | |
| 259 'user' : chrome_installer_win.InstallationType.USER}).get( | |
| 260 self._opts.install_type) | |
| 261 InstallTest.SetInstallType(install_type) | |
| 262 update_builds = (self._opts.update_builds.split(',') if | |
| 263 self._opts.update_builds else []) | |
| 264 options = self._opts.options.split(',') if self._opts.options else [] | |
| 265 InstallTest.InitTestFixture(self._opts.install_build, | |
| 266 update_builds, | |
| 267 self._opts.url, | |
| 268 options) | |
| 269 | |
| 270 def _ValidateArgs(self): | |
| 271 """Verifies the sanity of the command arguments. | |
| 272 | |
| 273 Confirms that all specified builds have a valid version number, and the | |
| 274 build urls are valid. | |
| 275 """ | |
| 276 builds = [] | |
| 277 if self._opts.install_build: | |
| 278 builds.append(self._opts.install_build) | |
| 279 if self._opts.update_builds: | |
| 280 builds.extend(self._opts.update_builds.split(',')) | |
| 281 builds = list(frozenset(builds)) | |
| 282 for build in builds: | |
| 283 if not re.match('\d+\.\d+\.\d+\.\d+', build): | |
| 284 raise RuntimeError('Invalid build number: %s' % build) | |
| 285 if not pyauto_utils.DoesUrlExist('%s/%s/' % (self._opts.url, build)): | |
| 286 raise RuntimeError('Could not locate build no. %s' % build) | |
| 287 | |
| 288 def _SetLoggingConfiguration(self): | |
| 289 """Sets the basic logging configuration.""" | |
| 290 log_format = '%(asctime)s %(levelname)-8s %(message)s' | |
| 291 logging.basicConfig(level=logging.INFO, format=log_format) | |
| 292 | |
| 293 def _GetTests(self): | |
| 294 """Returns a list of unittests from the calling script.""" | |
| 295 mod_name = [os.path.splitext(os.path.basename(sys.argv[0]))[0]] | |
| 296 if os.path.dirname(sys.argv[0]) not in sys.path: | |
| 297 sys.path.append(os.path.dirname(sys.argv[0])) | |
| 298 return unittest.defaultTestLoader.loadTestsFromNames(mod_name) | |
| 299 | |
| 300 def _Run(self): | |
| 301 """Runs the unit tests.""" | |
| 302 tests = self._GetTests() | |
| 303 result = pyauto_utils.GTestTextTestRunner(verbosity=1).run(tests) | |
| 304 del(tests) | |
| 305 if not result.wasSuccessful(): | |
| 306 print >>sys.stderr, ('Not all tests were successful.') | |
| 307 sys.exit(1) | |
| 308 sys.exit(0) | |
| OLD | NEW |