Index: tools/telemetry/telemetry/core/backends/chrome_inspector/tracing_backend_unittest.py |
diff --git a/tools/telemetry/telemetry/core/backends/chrome_inspector/tracing_backend_unittest.py b/tools/telemetry/telemetry/core/backends/chrome_inspector/tracing_backend_unittest.py |
index 48d8650fe8fc3616c104fdaf47826866a42e5ff0..115d7dec2d9c8486d272e68343e82594cabde998 100644 |
--- a/tools/telemetry/telemetry/core/backends/chrome_inspector/tracing_backend_unittest.py |
+++ b/tools/telemetry/telemetry/core/backends/chrome_inspector/tracing_backend_unittest.py |
@@ -8,12 +8,62 @@ import unittest |
from telemetry import decorators |
from telemetry.core import util |
+from telemetry.core.backends.chrome_inspector import inspector_websocket |
+from telemetry.core.backends.chrome_inspector import tracing_backend |
+from telemetry.core.backends.chrome_inspector import websocket |
from telemetry.core.platform import tracing_category_filter |
from telemetry.core.platform import tracing_options |
from telemetry.timeline import model as model_module |
from telemetry.timeline import trace_data as trace_data_module |
+from telemetry.unittest_util import simple_mock |
from telemetry.unittest_util import tab_test_case |
+util.AddDirToPythonPath(util.GetTelemetryDir(), 'third_party', 'mock') |
+import mock |
+ |
+ |
+class FakeInspectorWebsocket(object): |
+ """A fake InspectorWebsocket. |
+ |
+ A fake that allows tests to send pregenerated data. Normal |
+ InspectorWebsockets allow for any number of domain handlers. This fake only |
+ allows up to 1 domain handler, and assumes that the domain of the response |
+ always matches that of the handler. |
+ """ |
+ def __init__(self, mock_timer): |
+ self._mock_timer = mock_timer |
+ self._responses = [] |
+ 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, ( |
+ 'Current response is scheduled earlier than previous response.') |
+ params = {'value': value} |
+ response = {'method': method, 'params': params} |
+ self._responses.append((response, time)) |
+ |
+ def Connect(self, _): |
+ pass |
+ |
+ def DispatchNotifications(self, timeout): |
+ current_time = self._mock_timer.time() |
+ if not self._responses: |
+ self._mock_timer.SetTime(current_time + timeout + 1) |
+ raise websocket.WebSocketTimeoutException() |
+ |
+ response, time = self._responses[0] |
+ if time - current_time > timeout: |
+ self._mock_timer.SetTime(current_time + timeout + 1) |
+ raise websocket.WebSocketTimeoutException() |
+ |
+ self._responses.pop(0) |
+ self._mock_timer.SetTime(time + 1) |
+ self._handler(response) |
+ |
class TracingBackendTest(tab_test_case.TabTestCase): |
@@ -53,3 +103,44 @@ class TracingBackendTest(tab_test_case.TabTestCase): |
self.assertFalse(self._tracing_controller.is_tracing_running) |
# Calling stop again will raise exception |
self.assertRaises(Exception, self._tracing_controller.Stop) |
+ |
+ |
+class TracingBackendUnitTest(unittest.TestCase): |
+ def setUp(self): |
+ self._mock_timer = simple_mock.MockTimer(tracing_backend) |
+ |
+ def tearDown(self): |
+ self._mock_timer.Restore() |
+ |
+ 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.core.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 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.core.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) |