Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(463)

Unified Diff: tools/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend_unittest.py

Issue 1224083015: [telemetry] Add support for requesting memory dumps via DevTools API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add tests Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend_unittest.py
diff --git a/tools/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend_unittest.py b/tools/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend_unittest.py
index 073c11873fd454ab4501b81f54cf04dc0ea3574c..d5bc571b7b9f39b6093b96f78e2dd7128bf691bd 100644
--- a/tools/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend_unittest.py
+++ b/tools/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend_unittest.py
@@ -4,6 +4,7 @@
import unittest
+from telemetry import decorators
from telemetry.core import util
from telemetry.internal.backends.chrome_inspector import tracing_backend
from telemetry.internal.backends.chrome_inspector import websocket
@@ -27,35 +28,43 @@ class FakeInspectorWebsocket(object):
"""
def __init__(self, mock_timer):
self._mock_timer = mock_timer
- self._responses = []
+ self._notifications = []
+ self._response_handlers = {}
self._handler = None
def RegisterDomain(self, _, handler):
self._handler = handler
- def AddResponse(self, method, value, time):
- if self._responses:
- assert self._responses[-1][1] < time, (
+ def AddNotification(self, method, value, time):
+ if self._notifications:
+ assert self._notifications[-1][1] < time, (
'Current response is scheduled earlier than previous response.')
params = {'value': value}
response = {'method': method, 'params': params}
- self._responses.append((response, time))
+ self._notifications.append((response, time))
+
+ def AddResponseHandler(self, method, handler):
+ self._response_handlers[method] = handler
+
+ def SyncRequest(self, request, *args, **kwargs):
+ handler = self._response_handlers[request['method']]
+ return handler(request) if handler else None
def Connect(self, _):
pass
def DispatchNotifications(self, timeout):
current_time = self._mock_timer.time()
- if not self._responses:
+ if not self._notifications:
self._mock_timer.SetTime(current_time + timeout + 1)
raise websocket.WebSocketTimeoutException()
- response, time = self._responses[0]
+ response, time = self._notifications[0]
if time - current_time > timeout:
self._mock_timer.SetTime(current_time + timeout + 1)
raise websocket.WebSocketTimeoutException()
- self._responses.pop(0)
+ self._notifications.pop(0)
self._mock_timer.SetTime(time + 1)
self._handler(response)
@@ -97,6 +106,34 @@ class TracingBackendTest(tab_test_case.TabTestCase):
# Calling stop again will raise exception
self.assertRaises(Exception, self._tracing_controller.Stop)
+ # This test will be enabled once the Tracing.DumpMemory method is added to the
+ # Chrome DevTools API. See crbug.com/505826
+ @decorators.Disabled
+ def testDumpMemory(self):
+ if not self._browser.supports_memory_dumping:
+ self.skipTest('Browser does not support memory dumping, skipping test.')
+
+ options = tracing_options.TracingOptions()
+ options.enable_chrome_trace = True
+ self._tracing_controller.Start(
+ options, tracing_category_filter.TracingCategoryFilter(
+ 'disabled-by-default-memory-infra'))
+
+ # Request a memory dump and test that it was succesfully created.
+ dump_id = self._browser.DumpMemory()
+ self.assertIsNotNone(dump_id)
+
+ trace_data = self._tracing_controller.Stop()
+
+ # Test that trace data is parsable.
+ model = model_module.TimelineModel(trace_data)
+ self.assertGreater(len(model.processes), 0)
+
+ # Test that the resulting model contains the memory dump.
+ memory_dumps = list(model.IterGlobalMemoryDumps())
+ self.assertEqual(1, len(memory_dumps))
+ self.assertEqual(dump_id, memory_dumps[0].dump_id)
+
class TracingBackendUnitTest(unittest.TestCase):
def setUp(self):
@@ -107,9 +144,9 @@ class TracingBackendUnitTest(unittest.TestCase):
def testCollectTracingDataTimeout(self):
inspector = FakeInspectorWebsocket(self._mock_timer)
- inspector.AddResponse('Tracing.dataCollected', 'asdf1', 9)
- inspector.AddResponse('Tracing.dataCollected', 'asdf2', 19)
- inspector.AddResponse('Tracing.tracingComplete', 'asdf3', 35)
+ inspector.AddNotification('Tracing.dataCollected', 'asdf1', 9)
+ inspector.AddNotification('Tracing.dataCollected', 'asdf2', 19)
+ inspector.AddNotification('Tracing.tracingComplete', 'asdf3', 35)
with mock.patch('telemetry.internal.backends.chrome_inspector.'
'inspector_websocket.InspectorWebsocket') as mock_class:
@@ -125,9 +162,9 @@ class TracingBackendUnitTest(unittest.TestCase):
def testCollectTracingDataNoTimeout(self):
inspector = FakeInspectorWebsocket(self._mock_timer)
- inspector.AddResponse('Tracing.dataCollected', 'asdf1', 9)
- inspector.AddResponse('Tracing.dataCollected', 'asdf2', 14)
- inspector.AddResponse('Tracing.tracingComplete', 'asdf3', 19)
+ inspector.AddNotification('Tracing.dataCollected', 'asdf1', 9)
+ inspector.AddNotification('Tracing.dataCollected', 'asdf2', 14)
+ inspector.AddNotification('Tracing.tracingComplete', 'asdf3', 19)
with mock.patch('telemetry.internal.backends.chrome_inspector.'
'inspector_websocket.InspectorWebsocket') as mock_class:
@@ -137,3 +174,29 @@ class TracingBackendUnitTest(unittest.TestCase):
backend._CollectTracingData(10)
self.assertEqual(2, len(backend._trace_events))
self.assertTrue(backend._has_received_all_tracing_data)
+
+ def testDumpMemorySuccess(self):
+ inspector = FakeInspectorWebsocket(self._mock_timer)
+ inspector.AddResponseHandler(
+ 'Tracing.dumpMemory',
+ lambda req: {'result': {'success': True, 'dumpGuid': '42abc'}})
+
+ with mock.patch('telemetry.internal.backends.chrome_inspector.'
+ 'inspector_websocket.InspectorWebsocket') as mock_class:
+ mock_class.return_value = inspector
+ backend = tracing_backend.TracingBackend(devtools_port=65000)
+
+ self.assertEqual(backend.DumpMemory(), '42abc')
+
+ def testDumpMemoryFailure(self):
+ inspector = FakeInspectorWebsocket(self._mock_timer)
+ inspector.AddResponseHandler(
+ 'Tracing.dumpMemory',
+ lambda req: {'result': {'success': False, 'dumpGuid': '42abc'}})
+
+ with mock.patch('telemetry.internal.backends.chrome_inspector.'
+ 'inspector_websocket.InspectorWebsocket') as mock_class:
+ mock_class.return_value = inspector
+ backend = tracing_backend.TracingBackend(devtools_port=65000)
+
+ self.assertIsNone(backend.DumpMemory())

Powered by Google App Engine
This is Rietveld 408576698