Esempio n. 1
0
  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)
Esempio n. 5
0
  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')
Esempio n. 6
0
 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()
Esempio n. 8
0
 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)
Esempio n. 9
0
    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)
Esempio n. 10
0
 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)
Esempio n. 11
0
    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)
Esempio n. 12
0
  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)
Esempio n. 13
0
    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)
Esempio n. 14
0
  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())
Esempio n. 16
0
  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)
Esempio n. 17
0
    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)
Esempio n. 18
0
    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)
Esempio n. 19
0
    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)
Esempio n. 21
0
 def _CreateTracingBackendIfNeeded(self):
     if not self._tracing_backend:
         self._tracing_backend = tracing_backend.TracingBackend(
             self._devtools_port)
Esempio n. 22
0
 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)