| 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())
|
|
|