| Index: tools/convert_perf_script_to_tracing_json_test.py
|
| diff --git a/tools/convert_perf_script_to_tracing_json_test.py b/tools/convert_perf_script_to_tracing_json_test.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..5325f8d8b8f6c7050be2f0676b007223412d749b
|
| --- /dev/null
|
| +++ b/tools/convert_perf_script_to_tracing_json_test.py
|
| @@ -0,0 +1,240 @@
|
| +#!/usr/bin/python
|
| +# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +import convert_perf_script_to_tracing_json
|
| +import unittest
|
| +
|
| +class TestConverScript(unittest.TestCase):
|
| + def test_extract_function_name_basic(self):
|
| + line = (' 1835025 WebCore::NodeEventContext::handleLocalEvents' +
|
| + '(WebCore::Event*) const (/chrome)')
|
| + self.assertEqual(
|
| + convert_perf_script_to_tracing_json.extract_function_name(line),
|
| + 'WebCore::NodeEventContext::handleLocalEvents')
|
| +
|
| + def test_extract_function_name_basic_extra_spaces(self):
|
| + line = (' 1835025 WebCore::NodeEventContext::handleLocalEvents(' +
|
| + 'WebCore::Event*) const (/chrome) ')
|
| + self.assertEqual(
|
| + convert_perf_script_to_tracing_json.extract_function_name(line),
|
| + 'WebCore::NodeEventContext::handleLocalEvents')
|
| +
|
| + def test_extract_function_name_kallsyms(self):
|
| + line = ' ffffffff815de882 ([kernel.kallsyms])'
|
| + self.assertEqual(
|
| + convert_perf_script_to_tracing_json.extract_function_name(line),
|
| + 'ffffffff815de882')
|
| +
|
| + def test_extract_function_name_perf_map_file(self):
|
| + line = ' 3559d450634e (/tmp/perf-15260.map)'
|
| + self.assertEqual(
|
| + convert_perf_script_to_tracing_json.extract_function_name(line),
|
| + '3559d450634e')
|
| +
|
| + def test_extract_function_name_non_virtual_thunk(self):
|
| + line = (' 32dd68d non-virtual thunk to ' +
|
| + 'content::RenderWidgetCompositor::Animate(base::TimeTicks) (/chrome)')
|
| + self.assertEqual(
|
| + convert_perf_script_to_tracing_json.extract_function_name(line),
|
| + 'content::RenderWidgetCompositor::Animate')
|
| +
|
| + def test_extract_function_name_anonymous_namespace(self):
|
| + line = (' 32dd68d (anonymous namespace)::' +
|
| + 'RenderWidgetCompositor::Animate(base::TimeTicks) (/chrome)')
|
| + self.assertEqual(
|
| + convert_perf_script_to_tracing_json.extract_function_name(line),
|
| + 'RenderWidgetCompositor::Animate')
|
| +
|
| + # FIXME: What's the right answer here?
|
| + def test_extract_function_name_complex_templates(self):
|
| + line = (' 12a4908 base::internal::InvokeHelper<true, void, ' +
|
| + 'base::internal::RunnableAdapter<void (cc::ThreadProxy::*)(' +
|
| + 'scoped_ptr<cc::ThreadProxy::BeginMainFrameAndCommitState, ' +
|
| + 'base::DefaultDeleter<cc::ThreadProxy::BeginMainFrameAndCommitState>' +
|
| + ' >)>, void ()(base::WeakPtr<cc::ThreadProxy> const&, ' +
|
| + 'scoped_ptr<cc::ThreadProxy::BeginMainFrameAndCommitState, ' +
|
| + 'base::DefaultDeleter<cc::ThreadProxy::BeginMainFrameAndCommitState> ' +
|
| + '>)>::MakeItSo(base::internal::RunnableAdapter<void ' +
|
| + '(cc::ThreadProxy::*)(scoped_ptr<cc::ThreadProxy::' +
|
| + 'BeginMainFrameAndCommitState, base::DefaultDeleter<cc::ThreadProxy::' +
|
| + 'BeginMainFrameAndCommitState> >)>, base::WeakPtr<cc::ThreadProxy> ' +
|
| + 'const&, scoped_ptr<cc::ThreadProxy::BeginMainFrameAndCommitState, ' +
|
| + 'base::DefaultDeleter<cc::ThreadProxy::BeginMainFrameAndCommitState> >)' +
|
| + ' (/chrome)')
|
| + self.assertEqual(
|
| + convert_perf_script_to_tracing_json.extract_function_name(line),
|
| + ('base::internal::InvokeHelper<true, void, base::internal::' +
|
| + 'RunnableAdapter<void (cc::ThreadProxy::*)(scoped_ptr<cc::ThreadProxy' +
|
| + '::BeginMainFrameAndCommitState, base::DefaultDeleter<cc::ThreadProxy' +
|
| + '::BeginMainFrameAndCommitState> >)>, void ()(base::WeakPtr<cc::' +
|
| + 'ThreadProxy> const&, scoped_ptr<cc::ThreadProxy::' +
|
| + 'BeginMainFrameAndCommitState, base::DefaultDeleter<cc::ThreadProxy' +
|
| + '::BeginMainFrameAndCommitState> >)>::MakeItSo(base::internal::' +
|
| + 'RunnableAdapter<void (cc::ThreadProxy::*)'))
|
| +
|
| + def test_collapse_perf_script_output(self):
|
| + lines = [
|
| + '# this is a comment',
|
| + 'HTMLParserThrea 15260 cycles: ',
|
| + ' ffffffff8109e0fb ([kernel.kallsyms])',
|
| + ' ffffffff815de882 ([kernel.kallsyms])',
|
| + ' a5b836 content::ContentMain(a::b const&) (/chrome)',
|
| + ' 4279c9 ChromeMain (/chrome)',
|
| + ' 7fca67cce76d __libc_start_main (/libc-2.15.so)',
|
| + '',
|
| + ]
|
| + collapsed_lines = (
|
| + convert_perf_script_to_tracing_json.collapse_perf_script_output(lines))
|
| + stack = ('__libc_start_main;ChromeMain;content::ContentMain;' +
|
| + 'ffffffff815de882;ffffffff8109e0fb')
|
| + self.assertEqual(collapsed_lines, {
|
| + '15260': {
|
| + stack: 1,
|
| + }
|
| + })
|
| +
|
| + def test_compute_tree_basic(self):
|
| + stack = ('__libc_start_main;ChromeMain;content::ContentMain;' +
|
| + 'ffffffff815de882;ffffffff8109e0fb')
|
| + collapsed_lines = {
|
| + '15260': {
|
| + stack: 1,
|
| + }
|
| + }
|
| + self.assertEqual(
|
| + convert_perf_script_to_tracing_json.compute_tree(collapsed_lines), (
|
| + {
|
| + '__libc_start_main;15260': {
|
| + 'start_time': 0, 'children': {
|
| + 'ChromeMain;15260': {
|
| + 'start_time': 0, 'children': {
|
| + 'content::ContentMain;15260': {
|
| + 'start_time': 0, 'children': {
|
| + 'ffffffff815de882;15260': {
|
| + 'start_time': 0, 'children': {
|
| + 'ffffffff8109e0fb;15260': {
|
| + 'start_time': 0,
|
| + 'children': {},
|
| + 'end_time': 1
|
| + }
|
| + },
|
| + 'end_time': 1
|
| + }
|
| + },
|
| + 'end_time': 1
|
| + }
|
| + },
|
| + 'end_time': 1
|
| + }
|
| + },
|
| + 'end_time': 1
|
| + }
|
| + },
|
| + 1,
|
| + {'15260': 1}
|
| + ))
|
| +
|
| + def test_compute_tree_same_stack_different_threads(self):
|
| + stack = ('__libc_start_main;ChromeMain;content::ContentMain;' +
|
| + 'ffffffff815de882;ffffffff8109e0fb')
|
| + collapsed_lines = {
|
| + '15260': {
|
| + stack: 1,
|
| + },
|
| + '1234': {
|
| + stack: 1,
|
| + },
|
| + }
|
| + self.assertEqual(
|
| + convert_perf_script_to_tracing_json.compute_tree(collapsed_lines), (
|
| + {
|
| + '__libc_start_main;15260': {
|
| + 'start_time': 0, 'children': {
|
| + 'ChromeMain;15260': {
|
| + 'start_time': 0, 'children': {
|
| + 'content::ContentMain;15260': {
|
| + 'start_time': 0, 'children': {
|
| + 'ffffffff815de882;15260': {
|
| + 'start_time': 0, 'children': {
|
| + 'ffffffff8109e0fb;15260': {
|
| + 'start_time': 0, 'children': {}, 'end_time': 1
|
| + }
|
| + },
|
| + 'end_time': 1
|
| + }
|
| + },
|
| + 'end_time': 1
|
| + }
|
| + },
|
| + 'end_time': 1
|
| + }
|
| + },
|
| + 'end_time': 1
|
| + },
|
| + '__libc_start_main;1234': {
|
| + 'start_time': 0, 'children': {
|
| + 'ChromeMain;1234': {
|
| + 'start_time': 0, 'children': {
|
| + 'content::ContentMain;1234': {
|
| + 'start_time': 0, 'children': {
|
| + 'ffffffff815de882;1234': {
|
| + 'start_time': 0, 'children': {
|
| + 'ffffffff8109e0fb;1234': {
|
| + 'start_time': 0, 'children': {}, 'end_time': 1
|
| + }
|
| + },
|
| + 'end_time': 1
|
| + }
|
| + },
|
| + 'end_time': 1
|
| + }
|
| + },
|
| + 'end_time': 1
|
| + }
|
| + },
|
| + 'end_time': 1
|
| + },
|
| + },
|
| + 2,
|
| + {'15260': 1, '1234': 1}
|
| + ))
|
| +
|
| + def test_stringified_json_output(self):
|
| + lines = [
|
| + '# this is a comment',
|
| + 'HTMLParserThrea 15260 cycles: ',
|
| + ' ffffffff8109e0fb ([kernel.kallsyms])',
|
| + ' ffffffff815de882 ([kernel.kallsyms])',
|
| + ' a5b836 c::ContentMain(a::b const&) (/chrome)',
|
| + ' 4279c9 ChromeMain (/chrome)',
|
| + ' 7fca67cce76d __libc_start_main (/libc-2.15.so)',
|
| + '',
|
| + ]
|
| + self.assertEqual(
|
| + convert_perf_script_to_tracing_json.stringified_json_output(lines),
|
| + '[' +
|
| + '{"tid":"15260","ph":"B","pid":1,"name":"__libc_start_main","ts":0},' +
|
| + '{"tid":"15260","ph":"B","pid":1,"name":"ChromeMain","ts":0},' +
|
| + '{"tid":"15260","ph":"B","pid":1,"name":"c::ContentMain","ts":0},' +
|
| + '{"tid":"15260","ph":"B","pid":1,"name":"ffffffff815de882","ts":0},' +
|
| + '{"name":"ffffffff8109e0fb","args":{' +
|
| + '"process percent":"100.00%","thread percent":"100.00%"},' +
|
| + '"pid":1,"ts":0,"tid":"15260","dur":1,"ph":"X"},' +
|
| + '{"name":"ffffffff815de882","args":{' +
|
| + '"process percent":"100.00%","thread percent":"100.00%"},' +
|
| + '"pid":1,"ts":1,"tid":"15260","ph":"E"},' +
|
| + '{"name":"c::ContentMain","args":{' +
|
| + '"process percent":"100.00%","thread percent":"100.00%"},' +
|
| + '"pid":1,"ts":1,"tid":"15260","ph":"E"},' +
|
| + '{"name":"ChromeMain","args":{' +
|
| + '"process percent":"100.00%","thread percent":"100.00%"},' +
|
| + '"pid":1,"ts":1,"tid":"15260","ph":"E"},' +
|
| + '{"name":"__libc_start_main","args":{' +
|
| + '"process percent":"100.00%","thread percent":"100.00%"},' +
|
| + '"pid":1,"ts":1,"tid":"15260","ph":"E"}' +
|
| + ']')
|
| +
|
| +if __name__ == '__main__':
|
| + unittest.main()
|
|
|