summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authoredmundyan@chromium.org <edmundyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-16 05:37:28 +0000
committeredmundyan@chromium.org <edmundyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-16 05:37:28 +0000
commit465e99b8b904789842866e35bd99d0347c9a5ea9 (patch)
tree99195f989621b257c2d6a91e67217a79d7edfc0d /tools
parent0ff58b63b3a74e83d87d5288702346cd5f6cdae9 (diff)
downloadchromium_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')
-rw-r--r--tools/perf/measurements/endure.py62
-rw-r--r--tools/perf/page_sets/endure_calendar_forward_backward.json57
-rw-r--r--tools/telemetry/telemetry/page/block_page_measurement_results.py5
-rw-r--r--tools/telemetry/telemetry/page/csv_page_measurement_results.py6
-rw-r--r--tools/telemetry/telemetry/page/page_measurement_results.py3
-rw-r--r--tools/telemetry/telemetry/page/page_runner.py2
-rw-r--r--tools/telemetry/telemetry/page/page_test.py8
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