1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import cStringIO
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import json
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import logging
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import unittest
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom telemetry import benchmark
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import util
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.core.platform import tracing_category_filter
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.core.platform import tracing_options
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.timeline import model
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)from telemetry.timeline import tracing_timeline_data
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)from telemetry.unittest import tab_test_case
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TracingBackendTest(tab_test_case.TabTestCase):
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def _StartServer(self):
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self._browser.SetHTTPServerDirectories(util.GetUnittestDataDir())
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def _WaitForAnimationFrame(self):
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def _IsDone():
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      js_is_done = """done"""
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return bool(self._tab.EvaluateJavaScript(js_is_done))
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    util.WaitFor(_IsDone, 5)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  @benchmark.Disabled('chromeos') # crbug.com/412713.
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testGotTrace(self):
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    tracing_controller = self._browser.platform.tracing_controller
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if not tracing_controller.IsChromeTracingSupported(self._browser):
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      logging.warning('Browser does not support tracing, skipping test.')
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._StartServer()
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    options = tracing_options.TracingOptions()
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    options.enable_chrome_trace = True
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    tracing_controller.Start(
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      options, tracing_category_filter.TracingCategoryFilter())
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    trace_data = tracing_controller.Stop()
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    # Test that trace data is parsable
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    model.TimelineModel(trace_data)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ChromeTraceResultTest(unittest.TestCase):
46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  def __init__(self, method_name):
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    super(ChromeTraceResultTest, self).__init__(method_name)
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testWrite1(self):
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ri = tracing_timeline_data.TracingTimelineData(map(json.loads, []))
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    f = cStringIO.StringIO()
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ri.Serialize(f)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    v = f.getvalue()
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    j = json.loads(v)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert 'traceEvents' in j
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEquals(j['traceEvents'], [])
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testWrite2(self):
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ri = tracing_timeline_data.TracingTimelineData(map(json.loads, [
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        '"foo"',
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        '"bar"']))
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    f = cStringIO.StringIO()
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ri.Serialize(f)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    v = f.getvalue()
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    j = json.loads(v)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert 'traceEvents' in j
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEquals(j['traceEvents'], ['foo', 'bar'])
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testWrite3(self):
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ri = tracing_timeline_data.TracingTimelineData(map(json.loads, [
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        '"foo"',
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        '"bar"',
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        '"baz"']))
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    f = cStringIO.StringIO()
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ri.Serialize(f)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    v = f.getvalue()
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    j = json.loads(v)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert 'traceEvents' in j
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEquals(j['traceEvents'],
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      ['foo', 'bar', 'baz'])
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testBrowserProcess(self):
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ri = tracing_timeline_data.TracingTimelineData(map(json.loads, [
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        '{"name": "process_name",'
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        '"args": {"name": "Browser"},'
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        '"pid": 5, "ph": "M"}',
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        '{"name": "thread_name",'
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        '"args": {"name": "CrBrowserMain"},'
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        '"pid": 5, "tid": 32578, "ph": "M"}']))
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    timeline_model = model.TimelineModel(ri)
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    self.assertEquals(timeline_model.browser_process.pid, 5)
95