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