Index: tools/bisect-perf-regression_test.py |
diff --git a/tools/bisect-perf-regression_test.py b/tools/bisect-perf-regression_test.py |
deleted file mode 100644 |
index b91179216293505e5d893d6fa4c0c8a238324a94..0000000000000000000000000000000000000000 |
--- a/tools/bisect-perf-regression_test.py |
+++ /dev/null |
@@ -1,305 +0,0 @@ |
-# Copyright 2014 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. |
- |
-import os |
-import re |
-import unittest |
- |
-from auto_bisect import source_control as source_control_module |
- |
-# Special import necessary because filename contains dash characters. |
-bisect_perf_module = __import__('bisect-perf-regression') |
- |
-def _GetBisectPerformanceMetricsInstance(): |
- """Returns an instance of the BisectPerformanceMetrics class.""" |
- options_dict = { |
- 'debug_ignore_build': True, |
- 'debug_ignore_sync': True, |
- 'debug_ignore_perf_test': True, |
- 'command': 'fake_command', |
- 'metric': 'fake/metric', |
- 'good_revision': 280000, |
- 'bad_revision': 280005, |
- } |
- bisect_options = bisect_perf_module.BisectOptions.FromDict(options_dict) |
- source_control = source_control_module.DetermineAndCreateSourceControl( |
- bisect_options) |
- bisect_instance = bisect_perf_module.BisectPerformanceMetrics( |
- source_control, bisect_options) |
- bisect_instance.src_cwd = os.path.abspath( |
- os.path.join(os.path.dirname(__file__), os.path.pardir)) |
- return bisect_instance |
- |
- |
-class BisectPerfRegressionTest(unittest.TestCase): |
- """Test case for other functions and classes in bisect-perf-regression.py.""" |
- |
- def _AssertConfidence(self, score, bad_values, good_values): |
- """Checks whether the given sets of values have a given confidence score. |
- |
- The score represents our confidence that the two sets of values wouldn't |
- be as different as they are just by chance; that is, that some real change |
- occurred between the two sets of values. |
- |
- Args: |
- score: Expected confidence score. |
- bad_values: First list of numbers. |
- good_values: Second list of numbers. |
- """ |
- # ConfidenceScore takes a list of lists but these lists are flattened |
- # inside the function. |
- confidence = bisect_perf_module.ConfidenceScore( |
- [[v] for v in bad_values], |
- [[v] for v in good_values]) |
- self.assertEqual(score, confidence) |
- |
- def testConfidenceScore_ZeroConfidence(self): |
- # The good and bad sets contain the same values, so the confidence that |
- # they're different should be zero. |
- self._AssertConfidence(0.0, [4, 5, 7, 6, 8, 7], [8, 7, 6, 7, 5, 4]) |
- |
- def testConfidenceScore_MediumConfidence(self): |
- self._AssertConfidence(80.0, [0, 1, 1, 1, 2, 2], [1, 1, 1, 3, 3, 4]) |
- |
- def testConfidenceScore_HighConfidence(self): |
- self._AssertConfidence(95.0, [0, 1, 1, 1, 2, 2], [1, 2, 2, 3, 3, 4]) |
- |
- def testConfidenceScore_VeryHighConfidence(self): |
- # Confidence is high if the two sets of values have no internal variance. |
- self._AssertConfidence(99.9, [1, 1, 1, 1], [1.2, 1.2, 1.2, 1.2]) |
- self._AssertConfidence(99.9, [1, 1, 1, 1], [1.01, 1.01, 1.01, 1.01]) |
- |
- def testConfidenceScore_UnbalancedSampleSize(self): |
- # The second set of numbers only contains one number, so confidence is 0. |
- self._AssertConfidence(0.0, [1.1, 1.2, 1.1, 1.2, 1.0, 1.3, 1.2], [1.4]) |
- |
- def testConfidenceScore_EmptySample(self): |
- # Confidence is zero if either or both samples are empty. |
- self._AssertConfidence(0.0, [], []) |
- self._AssertConfidence(0.0, [], [1.1, 1.2, 1.1, 1.2, 1.0, 1.3, 1.2, 1.3]) |
- self._AssertConfidence(0.0, [1.1, 1.2, 1.1, 1.2, 1.0, 1.3, 1.2, 1.3], []) |
- |
- def testConfidenceScore_FunctionalTestResults(self): |
- self._AssertConfidence(80.0, [1, 1, 0, 1, 1, 1, 0, 1], [0, 0, 1, 0, 1, 0]) |
- self._AssertConfidence(99.9, [1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0]) |
- |
- def testConfidenceScore_RealWorldCases(self): |
- """This method contains a set of data from actual bisect results. |
- |
- The confidence scores asserted below were all copied from the actual |
- results, so the purpose of this test method is mainly to show what the |
- results for real cases are, and compare when we change the confidence |
- score function in the future. |
- """ |
- self._AssertConfidence(80, [133, 130, 132, 132, 130, 129], [129, 129, 125]) |
- self._AssertConfidence(99.5, [668, 667], [498, 498, 499]) |
- self._AssertConfidence(80, [67, 68], [65, 65, 67]) |
- self._AssertConfidence(0, [514], [514]) |
- self._AssertConfidence(90, [616, 613, 607, 615], [617, 619, 619, 617]) |
- self._AssertConfidence(0, [3.5, 5.8, 4.7, 3.5, 3.6], [2.8]) |
- self._AssertConfidence(90, [3, 3, 3], [2, 2, 2, 3]) |
- self._AssertConfidence(0, [1999004, 1999627], [223355]) |
- self._AssertConfidence(90, [1040, 934, 961], [876, 875, 789]) |
- self._AssertConfidence(90, [309, 305, 304], [302, 302, 299, 303, 298]) |
- |
- def testParseDEPSStringManually(self): |
- """Tests DEPS parsing.""" |
- deps_file_contents = """ |
- vars = { |
- 'ffmpeg_hash': |
- '@ac4a9f31fe2610bd146857bbd55d7a260003a888', |
- 'webkit_url': |
- 'https://chromium.googlesource.com/chromium/blink.git', |
- 'git_url': |
- 'https://chromium.googlesource.com', |
- 'webkit_rev': |
- '@e01ac0a267d1017288bc67fa3c366b10469d8a24', |
- 'angle_revision': |
- '74697cf2064c0a2c0d7e1b1b28db439286766a05' |
- }""" |
- |
- # Should only expect SVN/git revisions to come through, and URLs should be |
- # filtered out. |
- expected_vars_dict = { |
- 'ffmpeg_hash': '@ac4a9f31fe2610bd146857bbd55d7a260003a888', |
- 'webkit_rev': '@e01ac0a267d1017288bc67fa3c366b10469d8a24', |
- 'angle_revision': '74697cf2064c0a2c0d7e1b1b28db439286766a05' |
- } |
- # Testing private function. |
- # pylint: disable=W0212 |
- vars_dict = bisect_perf_module._ParseRevisionsFromDEPSFileManually( |
- deps_file_contents) |
- self.assertEqual(vars_dict, expected_vars_dict) |
- |
- def _AssertParseResult(self, expected_values, result_string): |
- """Asserts some values are parsed from a RESULT line.""" |
- results_template = ('RESULT other_chart: other_trace= 123 count\n' |
- 'RESULT my_chart: my_trace= %(value)s\n') |
- results = results_template % {'value': result_string} |
- metric = ['my_chart', 'my_trace'] |
- # Testing private function. |
- # pylint: disable=W0212 |
- values = bisect_perf_module._TryParseResultValuesFromOutput(metric, results) |
- self.assertEqual(expected_values, values) |
- |
- def testTryParseResultValuesFromOutput_WithSingleValue(self): |
- """Tests result pattern <*>RESULT <graph>: <trace>= <value>""" |
- self._AssertParseResult([66.88], '66.88 kb') |
- self._AssertParseResult([66.88], '66.88 ') |
- self._AssertParseResult([-66.88], '-66.88 kb') |
- self._AssertParseResult([66], '66 kb') |
- self._AssertParseResult([0.66], '.66 kb') |
- self._AssertParseResult([], '. kb') |
- self._AssertParseResult([], 'aaa kb') |
- |
- def testTryParseResultValuesFromOutput_WithMultiValue(self): |
- """Tests result pattern <*>RESULT <graph>: <trace>= [<value>,<value>, ..]""" |
- self._AssertParseResult([66.88], '[66.88] kb') |
- self._AssertParseResult([66.88, 99.44], '[66.88, 99.44]kb') |
- self._AssertParseResult([66.88, 99.44], '[ 66.88, 99.44 ]') |
- self._AssertParseResult([-66.88, 99.44], '[-66.88, 99.44] kb') |
- self._AssertParseResult([-66, 99], '[-66,99] kb') |
- self._AssertParseResult([-66, 99], '[-66,99,] kb') |
- self._AssertParseResult([-66, 0.99], '[-66,.99] kb') |
- self._AssertParseResult([], '[] kb') |
- self._AssertParseResult([], '[-66,abc] kb') |
- |
- def testTryParseResultValuesFromOutputWithMeanStd(self): |
- """Tests result pattern <*>RESULT <graph>: <trace>= {<mean, std}""" |
- self._AssertParseResult([33.22], '{33.22, 3.6} kb') |
- self._AssertParseResult([33.22], '{33.22, 3.6} kb') |
- self._AssertParseResult([33.22], '{33.22,3.6}kb') |
- self._AssertParseResult([33.22], '{33.22,3.6} kb') |
- self._AssertParseResult([33.22], '{ 33.22,3.6 }kb') |
- self._AssertParseResult([-33.22], '{-33.22,3.6}kb') |
- self._AssertParseResult([22], '{22,6}kb') |
- self._AssertParseResult([.22], '{.22,6}kb') |
- self._AssertParseResult([], '{.22,6, 44}kb') |
- self._AssertParseResult([], '{}kb') |
- self._AssertParseResult([], '{XYZ}kb') |
- |
- def _AssertCompatibleCommand( |
- self, expected_command, original_command, revision, target_platform): |
- """Tests the modification of the command that might be done. |
- |
- This modification to the command is done in order to get a Telemetry |
- command that works; before some revisions, the browser name that Telemetry |
- expects is different in some cases, but we want it to work anyway. |
- |
- Specifically, only for android: |
- After r276628, only android-chrome-shell works. |
- Prior to r274857, only android-chromium-testshell works. |
- In the range [274857, 276628], both work. |
- """ |
- bisect_options = bisect_perf_module.BisectOptions() |
- bisect_options.output_buildbot_annotations = None |
- source_control = source_control_module.DetermineAndCreateSourceControl( |
- bisect_options) |
- bisect_instance = bisect_perf_module.BisectPerformanceMetrics( |
- source_control, bisect_options) |
- bisect_instance.opts.target_platform = target_platform |
- git_revision = bisect_instance.source_control.ResolveToRevision( |
- revision, 'chromium', bisect_perf_module.DEPOT_DEPS_NAME, 100) |
- depot = 'chromium' |
- command = bisect_instance.GetCompatibleCommand( |
- original_command, git_revision, depot) |
- self.assertEqual(expected_command, command) |
- |
- def testGetCompatibleCommand_ChangeToTestShell(self): |
- # For revisions <= r274857, only android-chromium-testshell is used. |
- self._AssertCompatibleCommand( |
- 'tools/perf/run_benchmark -v --browser=android-chromium-testshell foo', |
- 'tools/perf/run_benchmark -v --browser=android-chrome-shell foo', |
- 274857, 'android') |
- |
- def testGetCompatibleCommand_ChangeToShell(self): |
- # For revisions >= r276728, only android-chrome-shell can be used. |
- self._AssertCompatibleCommand( |
- 'tools/perf/run_benchmark -v --browser=android-chrome-shell foo', |
- 'tools/perf/run_benchmark -v --browser=android-chromium-testshell foo', |
- 276628, 'android') |
- |
- def testGetCompatibleCommand_NoChange(self): |
- # For revisions < r276728, android-chromium-testshell can be used. |
- self._AssertCompatibleCommand( |
- 'tools/perf/run_benchmark -v --browser=android-chromium-testshell foo', |
- 'tools/perf/run_benchmark -v --browser=android-chromium-testshell foo', |
- 274858, 'android') |
- # For revisions > r274857, android-chrome-shell can be used. |
- self._AssertCompatibleCommand( |
- 'tools/perf/run_benchmark -v --browser=android-chrome-shell foo', |
- 'tools/perf/run_benchmark -v --browser=android-chrome-shell foo', |
- 274858, 'android') |
- |
- def testGetCompatibleCommand_NonAndroidPlatform(self): |
- # In most cases, there's no need to change Telemetry command. |
- # For revisions >= r276728, only android-chrome-shell can be used. |
- self._AssertCompatibleCommand( |
- 'tools/perf/run_benchmark -v --browser=release foo', |
- 'tools/perf/run_benchmark -v --browser=release foo', |
- 276628, 'chromium') |
- |
- # This method doesn't reference self; it fails if an error is thrown. |
- # pylint: disable=R0201 |
- def testDryRun(self): |
- """Does a dry run of the bisect script. |
- |
- This serves as a smoke test to catch errors in the basic execution of the |
- script. |
- """ |
- 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) |
- |
- def testGetCommitPosition(self): |
- bisect_instance = _GetBisectPerformanceMetricsInstance() |
- cp_git_rev = '7017a81991de983e12ab50dfc071c70e06979531' |
- self.assertEqual( |
- 291765, bisect_instance.source_control.GetCommitPosition(cp_git_rev)) |
- |
- svn_git_rev = 'e6db23a037cad47299a94b155b95eebd1ee61a58' |
- self.assertEqual( |
- 291467, bisect_instance.source_control.GetCommitPosition(svn_git_rev)) |
- |
- def testGetCommitPositionForV8(self): |
- bisect_instance = _GetBisectPerformanceMetricsInstance() |
- v8_rev = '21d700eedcdd6570eff22ece724b63a5eefe78cb' |
- depot_path = os.path.join(bisect_instance.src_cwd, 'src', 'v8') |
- self.assertEqual( |
- 23634, |
- bisect_instance.source_control.GetCommitPosition(v8_rev, depot_path)) |
- |
- def testGetCommitPositionForWebKit(self): |
- bisect_instance = _GetBisectPerformanceMetricsInstance() |
- wk_rev = 'a94d028e0f2c77f159b3dac95eb90c3b4cf48c61' |
- depot_path = os.path.join(bisect_instance.src_cwd, 'src', 'third_party', |
- 'WebKit') |
- self.assertEqual( |
- 181660, |
- bisect_instance.source_control.GetCommitPosition(wk_rev, depot_path)) |
- |
- def testUpdateDepsContent(self): |
- bisect_instance = _GetBisectPerformanceMetricsInstance() |
- 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 |
- # to search is not changed in DEPS content. |
- # TODO (prasadv): Add a separate test to validate the DEPS contents with the |
- # format that bisect script expects. |
- deps_contents = bisect_perf_module.ReadStringFromFile(deps_file) |
- deps_key = 'v8_revision' |
- depot = 'v8' |
- git_revision = 'a12345789a23456789a123456789a123456789' |
- updated_content = bisect_instance.UpdateDepsContents( |
- deps_contents, depot, git_revision, deps_key) |
- self.assertIsNotNone(updated_content) |
- ss = re.compile('["\']%s["\']: ["\']%s["\']' % (deps_key, git_revision)) |
- self.assertIsNotNone(re.search(ss, updated_content)) |
- |
- |
-if __name__ == '__main__': |
- unittest.main() |