diff options
author | edmundyan@chromium.org <edmundyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-16 05:37:28 +0000 |
---|---|---|
committer | edmundyan@chromium.org <edmundyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-16 05:37:28 +0000 |
commit | 465e99b8b904789842866e35bd99d0347c9a5ea9 (patch) | |
tree | 99195f989621b257c2d6a91e67217a79d7edfc0d /tools | |
parent | 0ff58b63b3a74e83d87d5288702346cd5f6cdae9 (diff) | |
download | chromium_src-465e99b8b904789842866e35bd99d0347c9a5ea9.zip chromium_src-465e99b8b904789842866e35bd99d0347c9a5ea9.tar.gz chromium_src-465e99b8b904789842866e35bd99d0347c9a5ea9.tar.bz2 |
A basic chrome endure test for Google Calendar that tracks DOM nodes and event listeners over time. Simply prints memory information to stdout for buildbots to parse
Use case:
tools/perf/run_measurement endure tools/perf/page_sets/endure_calendar.json --page-repeat=60s
BUG=273827
TEST=tools/perf/run_measurement --browser=system endure tools/perf/page_sets/endure_calendar_forward_backward.json
Review URL: https://chromiumcodereview.appspot.com/22495006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@217947 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools')
7 files changed, 142 insertions, 1 deletions
diff --git a/tools/perf/measurements/endure.py b/tools/perf/measurements/endure.py new file mode 100644 index 0000000..9cf4e75 --- /dev/null +++ b/tools/perf/measurements/endure.py @@ -0,0 +1,62 @@ +# Copyright 2013 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. + +from telemetry.page import page_measurement + +import optparse +import time + + +class Endure(page_measurement.PageMeasurement): + def __init__(self): + super(Endure, self).__init__('endure') + self._test_start_time = None + + # Timestamp of the last memory retrieval. + self._last_mem_dump = 0 + + def AddCommandLineOptions(self, parser): + group = optparse.OptionGroup(parser, 'Endure options') + group.add_option('--perf-stats-interval', + dest='perf_stats_interval', + default=20, + type='int', + help='Time interval between perf dumps (secs)') + parser.add_option_group(group) + + def CanRunForPage(self, page): + return hasattr(page, 'endure') + + def WillRunPageRepeats(self, page, tab): + """Reset the starting time for each new page.""" + self._test_start_time = time.time() + + def MeasurePage(self, page, tab, results): + """Dump perf information if we have gone past our interval time.""" + now = time.time() + if int(round(now - self._last_mem_dump)) > self.options.perf_stats_interval: + self._last_mem_dump = now + self._GetPerformanceStats(tab, results, now) + + def _GetPerformanceStats(self, tab, results, now): + """Record all memory information.""" + elapsed_time = int(round(now - self._test_start_time)) + + # DOM Nodes + dom_node_count = tab.dom_stats['node_count'] + self._SaveToResults(results, 'TotalDOMNodeCount_X', + 'seconds', elapsed_time) + self._SaveToResults(results, 'TotalDOMNodeCount_Y', + 'nodes', dom_node_count) + + # Event Listeners + event_listener_count = tab.dom_stats['event_listener_count'] + self._SaveToResults(results, 'EventListenerCount_X', + 'seconds', elapsed_time) + self._SaveToResults(results, 'EventListenerCount_Y', + 'listeners', event_listener_count) + + def _SaveToResults(self, results, trace_name, units, value, + chart_name=None, data_type='default'): + results.Add(trace_name, units, value, chart_name, data_type) diff --git a/tools/perf/page_sets/endure_calendar_forward_backward.json b/tools/perf/page_sets/endure_calendar_forward_backward.json new file mode 100644 index 0000000..27d9b74 --- /dev/null +++ b/tools/perf/page_sets/endure_calendar_forward_backward.json @@ -0,0 +1,57 @@ +{ + "description": "Chrome Endure test for Google Calendar.", + "archive_data_file": "../data/endure_calendar_forward_backward.json", + "credentials_path": "../data/credentials.json", + "user_agent_type": "desktop", + "pages": [ + { + "url": "https://www.google.com/calendar/", + "why": "Click forward(4x) and backwards(4x) repeatedly", + "credentials": "google", + "wait_for_element_with_selector": "div[class~=\"navForward\"]", + "post_navigate_javascript_to_execute": "(function() { var elem = document.createElement('meta');elem.name='viewport';elem.content='initial-scale=1';document.body.appendChild(elem); })();", + "endure": [ + { + "action": "click_element", + "selector": "div[class~=\"navForward\"]", + "wait_for_element_with_selector": "div[class~=\"navForward\"]" + }, + { + "action": "click_element", + "selector": "div[class~=\"navForward\"]", + "wait_for_element_with_selector": "div[class~=\"navForward\"]" + }, + { + "action": "click_element", + "selector": "div[class~=\"navForward\"]", + "wait_for_element_with_selector": "div[class~=\"navForward\"]" + }, + { + "action": "click_element", + "selector": "div[class~=\"navForward\"]", + "wait_for_element_with_selector": "div[class~=\"navBack\"]" + }, + { + "action": "click_element", + "selector": "div[class~=\"navBack\"]", + "wait_for_element_with_selector": "div[class~=\"navBack\"]" + }, + { + "action": "click_element", + "selector": "div[class~=\"navBack\"]", + "wait_for_element_with_selector": "div[class~=\"navBack\"]" + }, + { + "action": "click_element", + "selector": "div[class~=\"navBack\"]", + "wait_for_element_with_selector": "div[class~=\"navBack\"]" + }, + { + "action": "click_element", + "selector": "div[class~=\"navBack\"]", + "wait_for_element_with_selector": "div[class~=\"navForward\"]" + } + ] + } + ] +} diff --git a/tools/telemetry/telemetry/page/block_page_measurement_results.py b/tools/telemetry/telemetry/page/block_page_measurement_results.py index 625c5c8..ab9f7aa 100644 --- a/tools/telemetry/telemetry/page/block_page_measurement_results.py +++ b/tools/telemetry/telemetry/page/block_page_measurement_results.py @@ -14,6 +14,11 @@ class BlockPageMeasurementResults( def DidMeasurePage(self): page_values = self.values_for_current_page + if not page_values.values: + # Do not output if no results were added on this page. + super(BlockPageMeasurementResults, self).DidMeasurePage() + return + lines = ['url: %s' % self.values_for_current_page.page.url] sorted_measurement_names = page_values.measurement_names diff --git a/tools/telemetry/telemetry/page/csv_page_measurement_results.py b/tools/telemetry/telemetry/page/csv_page_measurement_results.py index 2440dd8..9dbf6fb 100644 --- a/tools/telemetry/telemetry/page/csv_page_measurement_results.py +++ b/tools/telemetry/telemetry/page/csv_page_measurement_results.py @@ -17,7 +17,11 @@ class CsvPageMeasurementResults( def DidMeasurePage(self): assert self.values_for_current_page, 'Failed to call WillMeasurePage' - if not self._output_after_every_page: + + if (not self.values_for_current_page.values or + not self._output_after_every_page): + # Do not output if no results were added on this page or if output flag + # is not set. super(CsvPageMeasurementResults, self).DidMeasurePage() return diff --git a/tools/telemetry/telemetry/page/page_measurement_results.py b/tools/telemetry/telemetry/page/page_measurement_results.py index 9b8f088..02ebd2a 100644 --- a/tools/telemetry/telemetry/page/page_measurement_results.py +++ b/tools/telemetry/telemetry/page/page_measurement_results.py @@ -108,5 +108,8 @@ class PageMeasurementResults(page_test_results.PageTestResults): def DidMeasurePage(self): assert self._values_for_current_page, 'Failed to call WillMeasurePage' + if not self.values_for_current_page.values: + # Do not store to page_results list if no results were added on this page. + return self._page_results.append(self._values_for_current_page) self._values_for_current_page = None diff --git a/tools/telemetry/telemetry/page/page_runner.py b/tools/telemetry/telemetry/page/page_runner.py index fdc2d48..1fdda4d 100644 --- a/tools/telemetry/telemetry/page/page_runner.py +++ b/tools/telemetry/telemetry/page/page_runner.py @@ -275,11 +275,13 @@ def Run(test, page_set, expectations, options): while state.repeat_state.ShouldRepeatPageSet(): for page in pages: state.repeat_state.WillRunPage() + test.WillRunPageRepeats(page, state.tab) while state.repeat_state.ShouldRepeatPage(): # execute test on page _PrepareAndRunPage(test, page_set, expectations, options, page, credentials_path, possible_browser, results, state) state.repeat_state.DidRunPage() + test.DidRunPageRepeats(page, state.tab) state.repeat_state.DidRunPageSet() test.DidRunTest(state.tab, results) diff --git a/tools/telemetry/telemetry/page/page_test.py b/tools/telemetry/telemetry/page/page_test.py index 50963dc..a0fdc0b 100644 --- a/tools/telemetry/telemetry/page/page_test.py +++ b/tools/telemetry/telemetry/page/page_test.py @@ -128,6 +128,14 @@ class PageTest(object): """ pass + def WillRunPageRepeats(self, page, tab): + """Override to do operations before each page is iterated over.""" + pass + + def DidRunPageRepeats(self, page, tab): + """Override to do operations after each page is iterated over.""" + pass + def DidStartHTTPServer(self, tab): """Override to do operations after the HTTP server is started.""" pass |