| Index: tools/perf/measurements/oilpan_gc_times_unittest.py
|
| diff --git a/tools/perf/measurements/oilpan_gc_times_unittest.py b/tools/perf/measurements/oilpan_gc_times_unittest.py
|
| index dc2d87b4715cf5295e1fd5bc3bff9778551e4304..e187bcb52d7555597d547c87770cc2676364db11 100644
|
| --- a/tools/perf/measurements/oilpan_gc_times_unittest.py
|
| +++ b/tools/perf/measurements/oilpan_gc_times_unittest.py
|
| @@ -2,10 +2,55 @@
|
| # Use of this source code is governed by a BSD-style license that can be
|
| # found in the LICENSE file.
|
|
|
| +from measurements import oilpan_gc_times
|
| +
|
| +from telemetry.results import page_test_results
|
| +from telemetry.timeline import model
|
| +from telemetry.timeline import slice as slice_data
|
| +from telemetry.timeline.event import TimelineEvent
|
| from telemetry.unittest_util import options_for_unittests
|
| from telemetry.unittest_util import page_test_test_case
|
| +from telemetry.page import page as page_module
|
| +
|
| +
|
| +class TestOilpanGCTimesPage(page_module.Page):
|
| + def __init__(self, page_set):
|
| + super(TestOilpanGCTimesPage, self).__init__(
|
| + 'file://blank.html', page_set, page_set.base_dir)
|
| +
|
| + def RunPageInteractions(self, action_runner):
|
| + interaction = action_runner.BeginGestureInteraction('ScrollAction')
|
| + action_runner.ScrollPage()
|
| + interaction.End()
|
|
|
| -from measurements import oilpan_gc_times
|
| +
|
| +class OilpanGCTimesTestData(object):
|
| + def __init__(self, thread_name):
|
| + self._model = model.TimelineModel()
|
| + self._renderer_process = self._model.GetOrCreateProcess(1)
|
| + self._renderer_thread = self._renderer_process.GetOrCreateThread(2)
|
| + self._renderer_thread.name = thread_name
|
| + self._results = page_test_results.PageTestResults()
|
| +
|
| + @property
|
| + def results(self):
|
| + return self._results
|
| +
|
| + def AddSlice(self, name, timestamp, duration, args):
|
| + new_slice = slice_data.Slice(
|
| + None,
|
| + 'category',
|
| + name,
|
| + timestamp,
|
| + duration,
|
| + timestamp,
|
| + duration,
|
| + args)
|
| + self._renderer_thread.all_slices.append(new_slice)
|
| + return new_slice
|
| +
|
| + def ClearResults(self):
|
| + self._results = page_test_results.PageTestResults()
|
|
|
|
|
| class OilpanGCTimesTest(page_test_test_case.PageTestTestCase):
|
| @@ -15,9 +60,76 @@ class OilpanGCTimesTest(page_test_test_case.PageTestTestCase):
|
| that all metrics were added to the results. The test is purely functional,
|
| i.e. it only checks if the metrics are present and non-zero.
|
| """
|
| + _KEY_MARK = 'Heap::collectGarbage'
|
| + _KEY_LAZY_SWEEP = 'ThreadHeap::lazySweepPages'
|
| + _KEY_COMPLETE_SWEEP = 'ThreadState::completeSweep'
|
| + _KEY_COALESCE = 'ThreadHeap::coalesce'
|
| +
|
| def setUp(self):
|
| self._options = options_for_unittests.GetCopy()
|
|
|
| + def testForParsingOldFormat(self):
|
| + def getMetric(results, name):
|
| + metrics = results.FindAllPageSpecificValuesNamed(name)
|
| + self.assertEquals(1, len(metrics))
|
| + return metrics[0].GetBuildbotValue()
|
| +
|
| + data = self._GenerateDataForParsingOldFormat()
|
| +
|
| + measurement = oilpan_gc_times._OilpanGCTimesBase()
|
| + measurement._renderer_process = data._renderer_process
|
| + measurement._timeline_model = data._model
|
| + measurement.ValidateAndMeasurePage(None, None, data.results)
|
| +
|
| + results = data.results
|
| + self.assertEquals(7, len(getMetric(results, 'oilpan_coalesce')))
|
| + self.assertEquals(3, len(getMetric(results, 'oilpan_precise_mark')))
|
| + self.assertEquals(3, len(getMetric(results, 'oilpan_precise_lazy_sweep')))
|
| + self.assertEquals(3, len(getMetric(results,
|
| + 'oilpan_precise_complete_sweep')))
|
| + self.assertEquals(1, len(getMetric(results, 'oilpan_conservative_mark')))
|
| + self.assertEquals(1, len(getMetric(results,
|
| + 'oilpan_conservative_lazy_sweep')))
|
| + self.assertEquals(1, len(getMetric(results,
|
| + 'oilpan_conservative_complete_sweep')))
|
| + self.assertEquals(2, len(getMetric(results, 'oilpan_forced_mark')))
|
| + self.assertEquals(2, len(getMetric(results, 'oilpan_forced_lazy_sweep')))
|
| + self.assertEquals(2, len(getMetric(results,
|
| + 'oilpan_forced_complete_sweep')))
|
| +
|
| + def testForParsing(self):
|
| + def getMetric(results, name):
|
| + metrics = results.FindAllPageSpecificValuesNamed(name)
|
| + self.assertEquals(1, len(metrics))
|
| + return metrics[0].GetBuildbotValue()
|
| +
|
| + data = self._GenerateDataForParsing()
|
| +
|
| + measurement = oilpan_gc_times._OilpanGCTimesBase()
|
| + measurement._renderer_process = data._renderer_process
|
| + measurement._timeline_model = data._model
|
| + measurement.ValidateAndMeasurePage(None, None, data.results)
|
| +
|
| + results = data.results
|
| + self.assertEquals(7, len(getMetric(results, 'oilpan_coalesce')))
|
| + self.assertEquals(2, len(getMetric(results, 'oilpan_precise_mark')))
|
| + self.assertEquals(2, len(getMetric(results, 'oilpan_precise_lazy_sweep')))
|
| + self.assertEquals(2, len(getMetric(results,
|
| + 'oilpan_precise_complete_sweep')))
|
| + self.assertEquals(2, len(getMetric(results, 'oilpan_conservative_mark')))
|
| + self.assertEquals(2, len(getMetric(results,
|
| + 'oilpan_conservative_lazy_sweep')))
|
| + self.assertEquals(2, len(getMetric(results,
|
| + 'oilpan_conservative_complete_sweep')))
|
| + self.assertEquals(1, len(getMetric(results, 'oilpan_forced_mark')))
|
| + self.assertEquals(1, len(getMetric(results, 'oilpan_forced_lazy_sweep')))
|
| + self.assertEquals(1, len(getMetric(results,
|
| + 'oilpan_forced_complete_sweep')))
|
| + self.assertEquals(1, len(getMetric(results, 'oilpan_idle_mark')))
|
| + self.assertEquals(1, len(getMetric(results, 'oilpan_idle_lazy_sweep')))
|
| + self.assertEquals(1, len(getMetric(results,
|
| + 'oilpan_idle_complete_sweep')))
|
| +
|
| def testForSmoothness(self):
|
| ps = self.CreatePageSetFromFileInUnittestDataDir('create_many_objects.html')
|
| measurement = oilpan_gc_times.OilpanGCTimesForSmoothness()
|
| @@ -39,3 +151,80 @@ class OilpanGCTimesTest(page_test_test_case.PageTestTestCase):
|
| conservative = results.FindAllPageSpecificValuesNamed(
|
| 'oilpan_conservative_mark')
|
| self.assertLess(0, len(precise) + len(conservative))
|
| +
|
| + def _GenerateDataForEmptyPageSet(self):
|
| + page_set = self.CreateEmptyPageSet()
|
| + page = TestOilpanGCTimesPage(page_set)
|
| + page_set.AddUserStory(page)
|
| +
|
| + data = OilpanGCTimesTestData('CrRendererMain')
|
| + # Pretend we are about to run the tests to silence lower level asserts.
|
| + data.results.WillRunPage(page)
|
| +
|
| + return data
|
| +
|
| + def _GenerateDataForParsingOldFormat(self):
|
| + data = self._GenerateDataForEmptyPageSet()
|
| + data.AddSlice(self._KEY_MARK, 1, 1, {'precise': True, 'forced': False})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 2, 2, {})
|
| + data.AddSlice(self._KEY_COALESCE, 4, 3, {})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 7, 4, {})
|
| + data.AddSlice(self._KEY_COALESCE, 11, 5, {})
|
| + data.AddSlice(self._KEY_COMPLETE_SWEEP, 16, 6, {})
|
| + data.AddSlice(self._KEY_MARK, 22, 7, {'precise': True, 'forced': False})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 29, 8, {})
|
| + data.AddSlice(self._KEY_COALESCE, 37, 9, {})
|
| + data.AddSlice(self._KEY_COMPLETE_SWEEP, 46, 10, {})
|
| + data.AddSlice(self._KEY_MARK, 56, 11, {'precise': False, 'forced': False})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 67, 12, {})
|
| + data.AddSlice(self._KEY_COALESCE, 79, 13, {})
|
| + data.AddSlice(self._KEY_COMPLETE_SWEEP, 92, 14, {})
|
| + data.AddSlice(self._KEY_MARK, 106, 15, {'precise': True, 'forced': False})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 121, 16, {})
|
| + data.AddSlice(self._KEY_COALESCE, 137, 17, {})
|
| + data.AddSlice(self._KEY_COMPLETE_SWEEP, 154, 18, {})
|
| + data.AddSlice(self._KEY_MARK, 172, 19, {'precise': False, 'forced': True})
|
| + data.AddSlice(self._KEY_COALESCE, 191, 20, {})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 211, 21, {})
|
| + data.AddSlice(self._KEY_COMPLETE_SWEEP, 232, 22, {})
|
| + data.AddSlice(self._KEY_MARK, 254, 23, {'precise': True, 'forced': True})
|
| + data.AddSlice(self._KEY_COALESCE, 277, 24, {})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 301, 25, {})
|
| + data.AddSlice(self._KEY_COMPLETE_SWEEP, 326, 26, {})
|
| + return data
|
| +
|
| + def _GenerateDataForParsing(self):
|
| + data = self._GenerateDataForEmptyPageSet()
|
| + data.AddSlice(self._KEY_MARK, 1, 1,
|
| + {'lazySweeping': True, 'gcReason': 'ConservativeGC'})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 2, 2, {})
|
| + data.AddSlice(self._KEY_COALESCE, 4, 3, {})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 7, 4, {})
|
| + data.AddSlice(self._KEY_COALESCE, 11, 5, {})
|
| + data.AddSlice(self._KEY_COMPLETE_SWEEP, 16, 6, {})
|
| + data.AddSlice(self._KEY_MARK, 22, 7,
|
| + {'lazySweeping': True, 'gcReason': 'PreciseGC'})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 29, 8, {})
|
| + data.AddSlice(self._KEY_COALESCE, 37, 9, {})
|
| + data.AddSlice(self._KEY_COMPLETE_SWEEP, 46, 10, {})
|
| + data.AddSlice(self._KEY_MARK, 56, 11,
|
| + {'lazySweeping': False, 'gcReason': 'ConservativeGC'})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 67, 12, {})
|
| + data.AddSlice(self._KEY_COALESCE, 79, 13, {})
|
| + data.AddSlice(self._KEY_COMPLETE_SWEEP, 92, 14, {})
|
| + data.AddSlice(self._KEY_MARK, 106, 15,
|
| + {'lazySweeping': False, 'gcReason': 'PreciseGC'})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 121, 16, {})
|
| + data.AddSlice(self._KEY_COALESCE, 137, 17, {})
|
| + data.AddSlice(self._KEY_COMPLETE_SWEEP, 154, 18, {})
|
| + data.AddSlice(self._KEY_MARK, 172, 19,
|
| + {'lazySweeping': False, 'gcReason': 'ForcedGCForTesting'})
|
| + data.AddSlice(self._KEY_COALESCE, 191, 20, {})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 211, 21, {})
|
| + data.AddSlice(self._KEY_COMPLETE_SWEEP, 232, 22, {})
|
| + data.AddSlice(self._KEY_MARK, 254, 23,
|
| + {'lazySweeping': False, 'gcReason': 'IdleGC'})
|
| + data.AddSlice(self._KEY_COALESCE, 277, 24, {})
|
| + data.AddSlice(self._KEY_LAZY_SWEEP, 301, 25, {})
|
| + data.AddSlice(self._KEY_COMPLETE_SWEEP, 326, 26, {})
|
| + return data
|
|
|