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