1a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved.
2a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch# Use of this source code is governed by a BSD-style license that can be
3a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch# found in the LICENSE file.
4a3f7b4e666c476898878fa745f637129375cd889Ben Murdochimport logging
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import os
6a3f7b4e666c476898878fa745f637129375cd889Ben Murdochimport unittest
7a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from telemetry.core import util
9a3f7b4e666c476898878fa745f637129375cd889Ben Murdochfrom telemetry.core.platform.profiler import perf_profiler
10a3f7b4e666c476898878fa745f637129375cd889Ben Murdochfrom telemetry.unittest import options_for_unittests
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from telemetry.unittest import simple_mock
12a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass TestPerfProfiler(unittest.TestCase):
15a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  def testPerfProfiler(self):
16a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    options = options_for_unittests.GetCopy()
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if not perf_profiler.PerfProfiler.is_supported(options.browser_type):
18a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      logging.warning('PerfProfiler is not supported. Skipping test')
19a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      return
20a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    profile_file = os.path.join(
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        util.GetUnittestDataDir(), 'perf_report_output.txt')
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    with open(profile_file) as f:
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      perf_report_output = f.read()
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    mock_popen = simple_mock.MockObject()
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    mock_popen.ExpectCall('communicate').WillReturn([perf_report_output])
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    mock_subprocess = simple_mock.MockObject()
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    mock_subprocess.ExpectCall(
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'Popen').WithArgs(simple_mock.DONT_CARE).WillReturn(mock_popen)
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    mock_subprocess.SetAttribute('PIPE', simple_mock.MockObject())
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    real_subprocess = perf_profiler.subprocess
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    perf_profiler.subprocess = mock_subprocess
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    try:
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      self.assertEqual(
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          perf_profiler.PerfProfiler.GetTopSamples(profile_file, 10),
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          { 'v8::internal::StaticMarkingVisitor::MarkMapContents': 63615201,
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'v8::internal::RelocIterator::next': 38271931,
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'v8::internal::LAllocator::MeetConstraintsBetween': 42913933,
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'v8::internal::FlexibleBodyVisitor::Visit': 31909537,
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'v8::internal::LiveRange::CreateAssignedOperand': 42913933,
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'void v8::internal::RelocInfo::Visit': 96878864,
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'WebCore::HTMLTokenizer::nextToken': 48240439,
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'v8::internal::Scanner::ScanIdentifierOrKeyword': 46054550,
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'sk_memset32_SSE2': 45121317,
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'v8::internal::HeapObject::Size': 39786862
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            })
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    finally:
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      perf_profiler.subprocess = real_subprocess
52