Index: install_test/run_install_tests.py |
=================================================================== |
--- install_test/run_install_tests.py (revision 0) |
+++ install_test/run_install_tests.py (revision 0) |
@@ -0,0 +1,200 @@ |
+#!/usr/bin/env python |
+# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Runs install and update tests. |
+ |
+Install tests are performed using a single Chrome build, whereas two or more |
+builds are needed for Update tests. There are separate command arguments for |
+the builds that will be used for each of the tests. If a test file contains |
+both types of tests(Install and Update), both arguments should be specified. |
+Otherwise, specify only the command argument that is required for the test. |
+This script can be used as an executable to run other Install/Upgrade tests. |
+ |
+Example: |
+ $ python run_install_test.py <script_name> --url=<chrome_builds_url> \ |
+ --install-build=24.0.1290.0 --update-builds=24.0.1289.0,24.0.1290.0 |
+""" |
+ |
+import fnmatch |
+import logging |
+import optparse |
+import os |
+import re |
+import sys |
+import unittest |
+ |
+import chrome_installer_win |
+from install_test import InstallTest |
+import sample_updater |
+ |
+_DIRECTORY = os.path.dirname(os.path.abspath(__file__)) |
+sys.path.append(os.path.join(os.path.dirname(_DIRECTORY), 'pyautolib')) |
+ |
+import pyauto_utils |
+ |
+ |
+class Main(object): |
+ """Main program for running 'Fresh Install' and 'Updater' tests.""" |
+ |
+ def __init__(self): |
+ self._SetLoggingConfiguration() |
+ self._ParseArgs() |
+ self._Run() |
+ |
+ def _ParseArgs(self): |
+ """Parses command line arguments.""" |
+ parser = optparse.OptionParser() |
+ parser.add_option( |
+ '-u', '--url', type='string', default='', dest='url', |
+ help='Specifies the build url, without the build number.') |
+ parser.add_option( |
+ '-o', '--options', type='string', default='', |
+ help='Specifies any additional Chrome options (i.e. --system-level).') |
+ parser.add_option( |
+ '--install-build', type='string', default='', dest='install_build', |
+ help='Specifies the build to be used for fresh install testing.') |
+ parser.add_option( |
+ '--update-builds', type='string', default='', dest='update_builds', |
+ help='Specifies the builds to be used for updater testing.') |
+ parser.add_option( |
+ '--install-type', type='string', default='user', dest='install_type', |
+ help='Type of installation (i.e., user, system, or both)') |
+ parser.add_option( |
+ '-f', '--filter', type='string', default='*', dest='filter', |
+ help='Filter that specifies the test or testsuite to run.') |
+ self._opts, self._args = parser.parse_args() |
+ self._ValidateArgs() |
+ if(self._opts.install_type == 'system' or |
+ self._opts.install_type == 'user'): |
+ install_type = ({ |
+ 'system' : chrome_installer_win.InstallationType.SYSTEM, |
+ 'user' : chrome_installer_win.InstallationType.USER}).get( |
+ self._opts.install_type) |
+ InstallTest.SetInstallType(install_type) |
+ update_builds = (self._opts.update_builds.split(',') if |
+ self._opts.update_builds else []) |
+ options = self._opts.options.split(',') if self._opts.options else [] |
+ InstallTest.InitTestFixture(self._opts.install_build, update_builds, |
+ self._opts.url, options) |
+ |
+ def _ValidateArgs(self): |
+ """Verifies the sanity of the command arguments. |
+ |
+ Confirms that all specified builds have a valid version number, and the |
+ build urls are valid. |
+ """ |
+ builds = [] |
+ if self._opts.install_build: |
+ builds.append(self._opts.install_build) |
+ if self._opts.update_builds: |
+ builds.extend(self._opts.update_builds.split(',')) |
+ builds = list(frozenset(builds)) |
+ for build in builds: |
+ if not re.match('\d+\.\d+\.\d+\.\d+', build): |
+ raise RuntimeError('Invalid build number: %s' % build) |
+ if not pyauto_utils.DoesUrlExist('%s/%s/' % (self._opts.url, build)): |
+ raise RuntimeError('Could not locate build no. %s' % build) |
+ |
+ def _SetLoggingConfiguration(self): |
+ """Sets the basic logging configuration.""" |
+ log_format = '%(asctime)s %(levelname)-8s %(message)s' |
+ logging.basicConfig(level=logging.INFO, format=log_format) |
+ |
+ def _GetTestsFromSuite(self, suite): |
+ """Returns all the tests from a given test suite. |
+ |
+ Args: |
+ suite: A unittest.TestSuite object. |
+ |
+ Returns: |
+ A list that contains all the tests found in the suite. |
+ """ |
+ tests = [] |
+ for test in suite: |
+ if isinstance(test, unittest.TestSuite): |
+ tests += self._GetTestsFromSuite(test) |
+ else: |
+ tests += [test] |
+ return tests |
+ |
+ def _GetTestName(self, test): |
+ """Gets the test name of the given unittest test. |
+ |
+ Args: |
+ test: A unittest test. |
+ |
+ Returns: |
+ A string representing the full test name. |
+ """ |
+ return '.'.join([test.__module__, test.__class__.__name__, |
+ test._testMethodName]) |
+ |
+ def _FilterTestSuite(self, suite, gtest_filter): |
+ """Returns a new filtered test suite based on the given gtest filter. |
+ |
+ See http://code.google.com/p/googletest/wiki/AdvancedGuide for |
+ gtest_filter specification. |
+ |
+ Args: |
+ suite: A unittest.TestSuite object, which can be obtained by calling |
+ |unittest.defaultTestLoader.loadTestsFromName|. |
+ gtest_filter: The gtest filter to use. Filter can be passed as follows: |
+ --filter=*className* or --filter=*testcaseName. |
+ |
+ Returns: |
+ A unittest.TestSuite object that contains tests that match the gtest |
+ filter. |
+ """ |
+ return unittest.TestSuite( |
+ self._FilterTests(self._GetTestsFromSuite(suite), gtest_filter)) |
+ |
+ def _FilterTests(self, all_tests, gtest_filter): |
+ """Returns a filtered list of tests based on the given gtest filter. |
+ |
+ Args: |
+ all_tests: A list that contains all unittests in a given suite. This |
+ list must be obtained by calling |_GetTestsFromSuite|. |
+ gtest_filter: The gtest filter to use. Filter can be passed as follows: |
+ *className* or *testcaseName. |
+ |
+ Returns: |
+ A list that contains all tests that match the given gtest filter. |
+ """ |
+ pattern_groups = gtest_filter.split('-') |
+ positive_patterns = pattern_groups[0].split(':') |
+ negative_patterns = None |
+ if len(pattern_groups) > 1: |
+ negative_patterns = pattern_groups[1].split(':') |
+ tests = [] |
+ for test in all_tests: |
+ test_name = self._GetTestName(test) |
+ # Test name must by matched by one positive pattern. |
+ for pattern in positive_patterns: |
+ if fnmatch.fnmatch(test_name, pattern): |
+ break |
+ else: |
+ continue |
+ # Test name must not be matched by any negative patterns. |
+ for pattern in negative_patterns or []: |
+ if fnmatch.fnmatch(test_name, pattern): |
+ break |
+ else: |
+ tests += [test] |
+ return tests |
+ |
+ def _Run(self): |
+ """Runs the unit tests.""" |
+ all_tests = unittest.defaultTestLoader.loadTestsFromModule(sample_updater) |
+ tests = self._FilterTestSuite(all_tests, self._opts.filter) |
+ result = pyauto_utils.GTestTextTestRunner(verbosity=1).run(tests) |
+ del(tests) |
+ if not result.wasSuccessful(): |
+ print >>sys.stderr, ('Not all tests were successful.') |
+ sys.exit(1) |
+ sys.exit(0) |
+ |
+ |
+if __name__ == '__main__': |
+ Main() |
Property changes on: install_test\run_install_tests.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |