Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Unified Diff: install_test/run_install_tests.py

Issue 11234068: Unittest filtering (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/chrome/test/
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « install_test/install_test.py ('k') | install_test/sample_updater.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « install_test/install_test.py ('k') | install_test/sample_updater.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698