1# Copyright 2013 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import cStringIO 6import json 7import logging 8import unittest 9 10from telemetry import benchmark 11from telemetry.core import util 12from telemetry.core.platform import tracing_category_filter 13from telemetry.core.platform import tracing_options 14from telemetry.timeline import model 15from telemetry.timeline import tracing_timeline_data 16from telemetry.unittest import tab_test_case 17 18 19class TracingBackendTest(tab_test_case.TabTestCase): 20 def _StartServer(self): 21 self._browser.SetHTTPServerDirectories(util.GetUnittestDataDir()) 22 23 def _WaitForAnimationFrame(self): 24 def _IsDone(): 25 js_is_done = """done""" 26 return bool(self._tab.EvaluateJavaScript(js_is_done)) 27 util.WaitFor(_IsDone, 5) 28 29 @benchmark.Disabled('chromeos') # crbug.com/412713. 30 def testGotTrace(self): 31 tracing_controller = self._browser.platform.tracing_controller 32 if not tracing_controller.IsChromeTracingSupported(self._browser): 33 logging.warning('Browser does not support tracing, skipping test.') 34 return 35 self._StartServer() 36 options = tracing_options.TracingOptions() 37 options.enable_chrome_trace = True 38 tracing_controller.Start( 39 options, tracing_category_filter.TracingCategoryFilter()) 40 trace_data = tracing_controller.Stop() 41 # Test that trace data is parsable 42 model.TimelineModel(trace_data) 43 44 45class ChromeTraceResultTest(unittest.TestCase): 46 def __init__(self, method_name): 47 super(ChromeTraceResultTest, self).__init__(method_name) 48 49 def testWrite1(self): 50 ri = tracing_timeline_data.TracingTimelineData(map(json.loads, [])) 51 f = cStringIO.StringIO() 52 ri.Serialize(f) 53 v = f.getvalue() 54 55 j = json.loads(v) 56 assert 'traceEvents' in j 57 self.assertEquals(j['traceEvents'], []) 58 59 def testWrite2(self): 60 ri = tracing_timeline_data.TracingTimelineData(map(json.loads, [ 61 '"foo"', 62 '"bar"'])) 63 f = cStringIO.StringIO() 64 ri.Serialize(f) 65 v = f.getvalue() 66 67 j = json.loads(v) 68 assert 'traceEvents' in j 69 self.assertEquals(j['traceEvents'], ['foo', 'bar']) 70 71 def testWrite3(self): 72 ri = tracing_timeline_data.TracingTimelineData(map(json.loads, [ 73 '"foo"', 74 '"bar"', 75 '"baz"'])) 76 f = cStringIO.StringIO() 77 ri.Serialize(f) 78 v = f.getvalue() 79 80 j = json.loads(v) 81 assert 'traceEvents' in j 82 self.assertEquals(j['traceEvents'], 83 ['foo', 'bar', 'baz']) 84 85 def testBrowserProcess(self): 86 ri = tracing_timeline_data.TracingTimelineData(map(json.loads, [ 87 '{"name": "process_name",' 88 '"args": {"name": "Browser"},' 89 '"pid": 5, "ph": "M"}', 90 '{"name": "thread_name",' 91 '"args": {"name": "CrBrowserMain"},' 92 '"pid": 5, "tid": 32578, "ph": "M"}'])) 93 timeline_model = model.TimelineModel(ri) 94 self.assertEquals(timeline_model.browser_process.pid, 5) 95