def testDumpMemoryFailure(self): self._inspector_socket.AddResponseHandler( 'Tracing.requestMemoryDump', lambda req: {'result': {'success': False, 'dumpGuid': '42abc'}}) backend = tracing_backend.TracingBackend(self._inspector_socket) self.assertIsNone(backend.DumpMemory())
def testCollectTracingDataNoTimeout(self): self._inspector_socket.AddEvent( 'Tracing.dataCollected', {'value': { 'traceEvents': [{ 'ph': 'B' }] }}, 9) self._inspector_socket.AddEvent( 'Tracing.dataCollected', {'value': { 'traceEvents': [{ 'ph': 'E' }] }}, 14) self._inspector_socket.AddEvent('Tracing.tracingComplete', {}, 19) backend = tracing_backend.TracingBackend(self._inspector_socket) with trace_data.TraceDataBuilder() as builder: backend._CollectTracingData(builder, 10) traces = builder.AsData().GetTracesFor( trace_data.CHROME_TRACE_PART) self.assertEqual(2, len(traces)) self.assertEqual(1, len(traces[0].get('traceEvents', []))) self.assertEqual(1, len(traces[1].get('traceEvents', []))) self.assertTrue(backend._has_received_all_tracing_data)
def _CreateTracingBackendIfNeeded(self, is_tracing_running=False): assert self.supports_tracing if not self._tracing_backend: self._CreateAndConnectBrowserInspectorWebsocketIfNeeded() self._tracing_backend = tracing_backend.TracingBackend( self._browser_inspector_websocket, is_tracing_running, self.support_modern_devtools_tracing_start_api)
def testCollectTracingDataTimeout(self): self._inspector_socket.AddEvent( 'Tracing.dataCollected', {'value': { 'traceEvents': [{ 'ph': 'B' }] }}, 9) self._inspector_socket.AddEvent( 'Tracing.dataCollected', {'value': { 'traceEvents': [{ 'ph': 'E' }] }}, 19) self._inspector_socket.AddEvent('Tracing.tracingComplete', {}, 35) backend = tracing_backend.TracingBackend(self._inspector_socket) trace_data_builder = trace_data.TraceDataBuilder() # The third response is 16 seconds after the second response, so we expect # a TracingTimeoutException. with self.assertRaises(tracing_backend.TracingTimeoutException): backend._CollectTracingData(trace_data_builder, 10) traces = self._GetRawChromeTracesFor(trace_data_builder) self.assertEqual(2, len(traces)) self.assertEqual(1, len(traces[0].get('traceEvents', []))) self.assertEqual(1, len(traces[1].get('traceEvents', []))) self.assertFalse(backend._has_received_all_tracing_data)
def testDumpMemorySuccess(self): self._inspector_socket.AddResponseHandler( 'Tracing.requestMemoryDump', lambda req: {'result': {'success': True, 'dumpGuid': '42abc'}}) backend = tracing_backend.TracingBackend(self._inspector_socket) self.assertEqual(backend.DumpMemory(), '42abc')
def testStartTracingFailure(self): self._inspector_socket.AddResponseHandler( 'Tracing.start', lambda req: {'error': {'message': 'Tracing is already started'}}) self._inspector_socket.AddResponseHandler( 'Tracing.hasCompleted', lambda req: {}) backend = tracing_backend.TracingBackend(self._inspector_socket) config = tracing_config.TracingConfig() self.assertRaisesRegexp( tracing_backend.TracingUnexpectedResponseException, 'Tracing is already started', backend.StartTracing, config.chrome_trace_config)
def testDumpMemoryFailure(self): self._inspector_socket.AddResponseHandler( 'Tracing.requestMemoryDump', lambda req: {'result': { 'success': False, 'dumpGuid': '42abc' }}) backend = tracing_backend.TracingBackend(self._inspector_socket) with self.assertRaises( tracing_backend.TracingUnexpectedResponseException): backend.DumpMemory()
def testCollectTracingDataNoTimeout(self): self._inspector_socket.AddEvent( 'Tracing.dataCollected', {'value': {'traceEvents': [{'ph': 'B'}]}}, 9) self._inspector_socket.AddEvent( 'Tracing.dataCollected', {'value': {'traceEvents': [{'ph': 'E'}]}}, 14) self._inspector_socket.AddEvent('Tracing.tracingComplete', {}, 19) backend = tracing_backend.TracingBackend(self._inspector_socket) trace_data_builder = trace_data.TraceDataBuilder() backend._CollectTracingData(trace_data_builder, 10) traces = self._GetRawChromeTracesFor(trace_data_builder) self.assertEqual(2, len(traces)) self.assertEqual(1, len(traces[0].get('traceEvents', []))) self.assertEqual(1, len(traces[1].get('traceEvents', []))) self.assertTrue(backend._has_received_all_tracing_data)
def testCollectTracingDataFromStream(self): self._inspector_socket.AddEvent('Tracing.tracingComplete', {'stream': '42'}, 1) self._inspector_socket.AddAsyncResponse('IO.read', {'data': '[{},{},{'}, 2) self._inspector_socket.AddAsyncResponse('IO.read', { 'data': '},{},{}]', 'eof': True }, 3) backend = tracing_backend.TracingBackend(self._inspector_socket) backend._CollectTracingData(10) self.assertEqual(5, len(backend._trace_events)) self.assertTrue(backend._has_received_all_tracing_data)
def testCollectTracingDataFromStreamNoContainer(self): self._inspector_socket.AddEvent( 'Tracing.tracingComplete', {'stream': '42'}, 1) self._inspector_socket.AddAsyncResponse( 'IO.read', {'data': '{"traceEvents": [{},{},{'}, 2) self._inspector_socket.AddAsyncResponse( 'IO.read', {'data': '},{},{}]}', 'eof': True}, 3) backend = tracing_backend.TracingBackend(self._inspector_socket) trace_data_builder = trace_data.TraceDataBuilder() backend._CollectTracingData(trace_data_builder, 10) trace_events = self._GetRawChromeTracesFor(trace_data_builder)[0].get( 'traceEvents', []) self.assertEqual(5, len(trace_events)) self.assertTrue(backend._has_received_all_tracing_data)
def testCollectTracingDataNoTimeout(self): self._inspector_socket.AddEvent('Tracing.dataCollected', {'value': [{ 'ph': 'B' }]}, 9) self._inspector_socket.AddEvent('Tracing.dataCollected', {'value': [{ 'ph': 'E' }]}, 14) self._inspector_socket.AddEvent('Tracing.tracingComplete', {}, 19) backend = tracing_backend.TracingBackend(self._inspector_socket) backend._CollectTracingData(10) self.assertEqual(2, len(backend._trace_events)) self.assertTrue(backend._has_received_all_tracing_data)
def testCollectTracingDataFromStreamNoContainer(self): self._inspector_socket.AddEvent( 'Tracing.tracingComplete', {'stream': '42'}, 1) self._inspector_socket.AddAsyncResponse( 'IO.read', {'data': '{"traceEvents": [{},{},{'}, 2) self._inspector_socket.AddAsyncResponse( 'IO.read', {'data': '},{},{}]}', 'eof': True}, 3) backend = tracing_backend.TracingBackend(self._inspector_socket) with trace_data.TraceDataBuilder() as builder: backend._CollectTracingData(builder, 10) trace = builder.AsData().GetTraceFor(trace_data.CHROME_TRACE_PART) self.assertEqual(5, len(trace['traceEvents'])) self.assertTrue(backend._has_received_all_tracing_data)
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) 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) backend._CollectTracingData(10) self.assertEqual(2, len(backend._trace_events)) self.assertTrue(backend._has_received_all_tracing_data)
def testStartTracingWithoutCollection(self): self._inspector_socket.AddResponseHandler('Tracing.start', lambda req: {}) self._inspector_socket.AddEvent( 'Tracing.dataCollected', {'value': [{'ph': 'B'}]}, 1) self._inspector_socket.AddEvent( 'Tracing.dataCollected', {'value': [{'ph': 'E'}]}, 2) self._inspector_socket.AddEvent('Tracing.tracingComplete', {}, 3) self._inspector_socket.AddResponseHandler( 'Tracing.hasCompleted', lambda req: {}) backend = tracing_backend.TracingBackend(self._inspector_socket) config = tracing_config.TracingConfig() backend.StartTracing(config._chrome_trace_config) backend.StopTracing() with self.assertRaisesRegexp(AssertionError, 'Data not collected from .*'): backend.StartTracing(config._chrome_trace_config)
def testDumpMemoryFailure(self): inspector = FakeInspectorWebsocket(self._mock_timer) inspector.AddResponseHandler( 'Tracing.requestMemoryDump', 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())
def testCollectTracingDataFromStreamJSONContainer(self): self._inspector_socket.AddEvent( 'Tracing.tracingComplete', {'stream': '42'}, 1) self._inspector_socket.AddAsyncResponse( 'IO.read', {'data': '{"traceEvents": [{},{},{}],'}, 2) self._inspector_socket.AddAsyncResponse( 'IO.read', {'data': '"metadata": {"a": "b"}'}, 3) self._inspector_socket.AddAsyncResponse( 'IO.read', {'data': '}', 'eof': True}, 4) backend = tracing_backend.TracingBackend(self._inspector_socket) trace_data_builder = trace_data.TraceDataBuilder() backend._CollectTracingData(trace_data_builder, 10) chrome_trace = self._GetRawChromeTracesFor(trace_data_builder)[0] self.assertEqual(3, len(chrome_trace.get('traceEvents', []))) self.assertEqual(dict, type(chrome_trace.get('metadata'))) self.assertTrue(backend._has_received_all_tracing_data)
def testCollectTracingDataTimeout(self): self._inspector_socket.AddEvent('Tracing.dataCollected', {'value': [{ 'ph': 'B' }]}, 9) self._inspector_socket.AddEvent('Tracing.dataCollected', {'value': [{ 'ph': 'E' }]}, 19) self._inspector_socket.AddEvent('Tracing.tracingComplete', {}, 35) backend = tracing_backend.TracingBackend(self._inspector_socket) # The third response is 16 seconds after the second response, so we expect # a TracingTimeoutException. with self.assertRaises(tracing_backend.TracingTimeoutException): backend._CollectTracingData(10) self.assertEqual(2, len(backend._trace_events)) self.assertFalse(backend._has_received_all_tracing_data)
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) 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) # The third response is 16 seconds after the second response, so we expect # a TracingTimeoutException. with self.assertRaises(tracing_backend.TracingTimeoutException): backend._CollectTracingData(10) self.assertEqual(2, len(backend._trace_events)) self.assertFalse(backend._has_received_all_tracing_data)
def _Connect(self, devtools_port, browser_target): """Attempt to connect to the DevTools client. Args: devtools_port: The devtools_port uniquely identifies the DevTools agent. browser_target: An optional string to override the default path used to establish a websocket connection with the browser inspector. Raises: Any of _DEVTOOLS_CONNECTION_ERRORS if failed to establish the connection. """ self._browser_target = browser_target or '/devtools/browser' self._forwarder = self.platform_backend.forwarder_factory.Create( local_port=None, # Forwarder will choose an available port. remote_port=devtools_port, reverse=True) self._local_port = self._forwarder._local_port self._remote_port = self._forwarder._remote_port self._devtools_http = devtools_http.DevToolsHttp(self.local_port) # If the agent is not alive and ready, trying to get the branch number will # raise a devtools_http.DevToolsClientConnectionError. branch_number = self.GetChromeBranchNumber() if branch_number < MIN_SUPPORTED_BRANCH_NUMBER: raise UnsupportedVersionError( 'Chrome branch number %d is no longer supported' % branch_number) # Ensure that the inspector websocket is ready. This may raise a # inspector_websocket.WebSocketException or socket.error if not ready. self._browser_websocket = inspector_websocket.InspectorWebsocket() self._browser_websocket.Connect(self.browser_target_url, timeout=10) chrome_tracing_devtools_manager.RegisterDevToolsClient(self) # If there is a trace_config it means that Telemetry has already started # Chrome tracing via a startup config. The TracingBackend also needs needs # this config to initialize itself correctly. trace_config = (self.platform_backend.tracing_controller_backend. GetChromeTraceConfig()) self._tracing_backend = tracing_backend.TracingBackend( self._browser_websocket, trace_config)
def _Connect(self, devtools_port, browser_target): """Attempt to connect to the DevTools client. Args: devtools_port: The devtools_port uniquely identifies the DevTools agent. browser_target: An optional string to override the default path used to establish a websocket connection with the browser inspector. Raises: Any of _DEVTOOLS_CONNECTION_ERRORS if failed to establish the connection. """ self._browser_target = browser_target or '/devtools/browser' self._forwarder = self.platform_backend.forwarder_factory.Create( local_port=None, # Forwarder will choose an available port. remote_port=devtools_port, reverse=True) self._local_port = self._forwarder._local_port self._remote_port = self._forwarder._remote_port self._devtools_http = devtools_http.DevToolsHttp(self.local_port) # If the agent is not alive and ready, this will raise a # devtools_http.DevToolsClientConnectionError. self.GetVersion() # Ensure that the inspector websocket is ready. This may raise a # inspector_websocket.WebSocketException or socket.error if not ready. self._browser_websocket = inspector_websocket.InspectorWebsocket() self._browser_websocket.Connect(self.browser_target_url, timeout=10) chrome_tracing_devtools_manager.RegisterDevToolsClient(self) # Telemetry has started Chrome tracing if there is a trace config, we use # this info to create the TracingBackend in the correct state. is_tracing_running = bool( self.platform_backend.tracing_controller_backend.GetChromeTraceConfig()) self._tracing_backend = tracing_backend.TracingBackend( self._browser_websocket, is_tracing_running)
def _CreateTracingBackendIfNeeded(self): if not self._tracing_backend: self._tracing_backend = tracing_backend.TracingBackend( self._devtools_port)
def _CreateTracingBackendIfNeeded(self, is_tracing_running=False): assert self.supports_tracing if not self._tracing_backend: self._tracing_backend = tracing_backend.TracingBackend( self._devtools_config._browser_websocket, is_tracing_running, self.support_modern_devtools_tracing_start_api)