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

Unified Diff: tools/auto_bisect/bisect_perf_regression_test.py

Issue 645263002: Implementing direction_of_improvement (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Adding missing option from command-line building logic. Improved error message. Created 6 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 | « tools/auto_bisect/bisect_perf_regression.py ('k') | tools/run-bisect-perf-regression.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/auto_bisect/bisect_perf_regression_test.py
diff --git a/tools/auto_bisect/bisect_perf_regression_test.py b/tools/auto_bisect/bisect_perf_regression_test.py
index a4ba38984571be69f262544743ab66e13beb6708..c7d98e08fef089e884e9a5ca5404c3becbeb3e86 100644
--- a/tools/auto_bisect/bisect_perf_regression_test.py
+++ b/tools/auto_bisect/bisect_perf_regression_test.py
@@ -17,9 +17,8 @@ import mock
import source_control
-def _GetBisectPerformanceMetricsInstance():
- """Returns an instance of the BisectPerformanceMetrics class."""
- options_dict = {
+# Default options for the dry run
+DEFAULT_OPTIONS = {
'debug_ignore_build': True,
'debug_ignore_sync': True,
'debug_ignore_perf_test': True,
@@ -28,12 +27,53 @@ def _GetBisectPerformanceMetricsInstance():
'good_revision': 280000,
'bad_revision': 280005,
}
+
+
+def _GetBisectPerformanceMetricsInstance(options_dict):
+ """Returns an instance of the BisectPerformanceMetrics class."""
bisect_options = bisect_perf_regression.BisectOptions.FromDict(options_dict)
bisect_instance = bisect_perf_regression.BisectPerformanceMetrics(
bisect_options)
return bisect_instance
+def _GetExtendedOptions(d, f):
+ """Returns the a copy of the default options dict plus some options."""
+ result = dict(DEFAULT_OPTIONS)
+ result.update({
+ 'improvement_direction': d,
+ 'debug_fake_first_test_mean': f})
+ return result
+
+
+def _GenericDryRun(options, print_results=False):
+ """Performs a dry run of the bisector.
+
+ Args:
+ options: Dictionary containing the options for the bisect instance.
+ print_results: Boolean telling whether to call FormatAndPrintResults.
+
+ Returns:
+ The results dictionary as returned by the bisect Run method.
+ """
+ # Disable rmtree to avoid deleting local trees.
+ old_rmtree = shutil.rmtree
+ try:
+ shutil.rmtree = lambda path, onerror: None
+ bisect_instance = _GetBisectPerformanceMetricsInstance(options)
+ results = bisect_instance.Run(bisect_instance.opts.command,
+ bisect_instance.opts.bad_revision,
+ bisect_instance.opts.good_revision,
+ bisect_instance.opts.metric)
+
+ if print_results:
+ bisect_instance.FormatAndPrintResults(results)
+
+ return results
+ finally:
+ shutil.rmtree = old_rmtree
+
+
class BisectPerfRegressionTest(unittest.TestCase):
"""Test case for other functions and classes in bisect-perf-regression.py."""
@@ -257,18 +297,29 @@ class BisectPerfRegressionTest(unittest.TestCase):
This serves as a smoke test to catch errors in the basic execution of the
script.
"""
- # Disable rmtree to avoid deleting local trees.
- old_rmtree = shutil.rmtree
- try:
- shutil.rmtree = lambda path, onerror: None
- bisect_instance = _GetBisectPerformanceMetricsInstance()
- results = bisect_instance.Run(bisect_instance.opts.command,
- bisect_instance.opts.bad_revision,
- bisect_instance.opts.good_revision,
- bisect_instance.opts.metric)
- bisect_instance.FormatAndPrintResults(results)
- finally:
- shutil.rmtree = old_rmtree
+ _GenericDryRun(DEFAULT_OPTIONS, True)
+
+ def testBisectImprovementDirectionFails(self):
+ """Dry run of a bisect with an improvement instead of regression."""
+
+ # Test result goes from 0 to 100 where higher is better
+ results = _GenericDryRun(_GetExtendedOptions(1, 100))
+ self.assertIsNotNone(results.error)
+ self.assertIn('not a regression', results.error)
+ # Test result goes from 0 to -100 where lower is better
+ results = _GenericDryRun(_GetExtendedOptions(-1, -100))
+ self.assertIsNotNone(results.error)
+ self.assertIn('not a regression', results.error)
+
+ def testBisectImprovementDirectionSucceeds(self):
+ """Bisects with improvement direction matching regression range."""
+ # Test result goes from 0 to 100 where lower is better
+ results = _GenericDryRun(_GetExtendedOptions(-1, 100))
+ self.assertIsNone(results.error)
+ # Test result goes from 0 to -100 where higher is better
+ results = _GenericDryRun(_GetExtendedOptions(1, -100))
+ self.assertIsNone(results.error)
+
def testGetCommitPosition(self):
cp_git_rev = '7017a81991de983e12ab50dfc071c70e06979531'
@@ -278,21 +329,21 @@ class BisectPerfRegressionTest(unittest.TestCase):
self.assertEqual(291467, source_control.GetCommitPosition(svn_git_rev))
def testGetCommitPositionForV8(self):
- bisect_instance = _GetBisectPerformanceMetricsInstance()
+ bisect_instance = _GetBisectPerformanceMetricsInstance(DEFAULT_OPTIONS)
v8_rev = '21d700eedcdd6570eff22ece724b63a5eefe78cb'
depot_path = os.path.join(bisect_instance.src_cwd, 'v8')
self.assertEqual(
23634, source_control.GetCommitPosition(v8_rev, depot_path))
def testGetCommitPositionForWebKit(self):
- bisect_instance = _GetBisectPerformanceMetricsInstance()
+ bisect_instance = _GetBisectPerformanceMetricsInstance(DEFAULT_OPTIONS)
wk_rev = 'a94d028e0f2c77f159b3dac95eb90c3b4cf48c61'
depot_path = os.path.join(bisect_instance.src_cwd, 'third_party', 'WebKit')
self.assertEqual(
181660, source_control.GetCommitPosition(wk_rev, depot_path))
def testUpdateDepsContent(self):
- bisect_instance = _GetBisectPerformanceMetricsInstance()
+ bisect_instance = _GetBisectPerformanceMetricsInstance(DEFAULT_OPTIONS)
deps_file = 'DEPS'
# We are intentionally reading DEPS file contents instead of string literal
# with few lines from DEPS because to check if the format we are expecting
« no previous file with comments | « tools/auto_bisect/bisect_perf_regression.py ('k') | tools/run-bisect-perf-regression.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698