12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochfrom metrics import memory
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from telemetry.page import page_measurement
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochclass Memory(page_measurement.PageMeasurement):
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def __init__(self):
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    super(Memory, self).__init__('stress_memory')
113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    self._memory_metric = None
123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  def DidStartBrowser(self, browser):
143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    self._memory_metric = memory.MemoryMetric(browser)
153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def DidNavigateToPage(self, page, tab):
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self._memory_metric.Start(page, tab)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def CustomizeBrowserOptions(self, options):
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    memory.MemoryMetric.CustomizeBrowserOptions(options)
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    # Since this is a memory benchmark, we want to sample memory histograms at
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    # a high frequency.
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    options.AppendExtraBrowserArgs('--memory-metrics')
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def CanRunForPage(self, page):
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return hasattr(page, 'stress_memory')
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def MeasurePage(self, page, tab, results):
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self._memory_metric.Stop(page, tab)
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self._memory_metric.AddResults(tab, results)
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if tab.browser.is_profiler_active('tcmalloc-heap'):
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      # The tcmalloc_heap_profiler dumps files at regular
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      # intervals (~20 secs).
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      # This is a minor optimization to ensure it'll dump the last file when
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      # the test completes.
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      tab.ExecuteJavaScript("""
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (chrome && chrome.memoryBenchmarking) {
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          chrome.memoryBenchmarking.heapProfilerDump('renderer', 'final');
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          chrome.memoryBenchmarking.heapProfilerDump('browser', 'final');
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        }
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      """)
433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  def DidRunTest(self, browser, results):
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self._memory_metric.AddSummaryResults(results)
46