Index: tools/ignition/linux_perf_report_test.py |
diff --git a/tools/ignition/linux_perf_report_test.py b/tools/ignition/linux_perf_report_test.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d9cef75dfff27564c22747d4984d902e1b45f36c |
--- /dev/null |
+++ b/tools/ignition/linux_perf_report_test.py |
@@ -0,0 +1,147 @@ |
+# Copyright 2016 the V8 project 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 linux_perf_report as ipr |
+import StringIO |
+import unittest |
+ |
+ |
+PERF_SCRIPT_OUTPUT = """ |
+# This line is a comment |
+# This should be ignored too |
+# |
+# cdefab01 aRandomSymbol::Name(to, be, ignored) |
+ |
+ 00000000 firstSymbol |
+ 00000123 secondSymbol |
+ |
+ 01234567 foo |
+ abcdef76 BytecodeHandler:bar |
+ 76543210 baz |
+ |
+# Indentation shouldn't matter (neither should this line) |
+ |
+ 01234567 foo |
+ abcdef76 BytecodeHandler:bar |
+ 76543210 baz |
+ |
+ 01234567 beep |
+ abcdef76 BytecodeHandler:bar |
+ 76543210 baz |
+ |
+ 01234567 hello |
+ abcdef76 v8::internal::Compiler |
+ 00000000 Stub:CEntryStub |
+ 76543210 world |
+ 11111111 BytecodeHandler:nope |
+ |
+ 00000000 Lost |
+ 11111111 Builtin:InterpreterEntryTrampoline |
+ 22222222 bar |
+ |
+ 11111111 Builtin:InterpreterEntryTrampoline |
+ 22222222 bar |
+""" |
+ |
+ |
+class LinuxPerfReportTest(unittest.TestCase): |
+ def test_collapsed_callchains_generator(self): |
+ perf_stream = StringIO.StringIO(PERF_SCRIPT_OUTPUT) |
+ callchains = list(ipr.collapsed_callchains_generator(perf_stream)) |
+ self.assertListEqual(callchains, [ |
+ ["foo", "BytecodeHandler:bar"], |
+ ["foo", "BytecodeHandler:bar"], |
+ ["beep", "BytecodeHandler:bar"], |
+ ["[entry trampoline]"], |
+ ]) |
+ |
+ def test_collapsed_callchains_generator_show_other(self): |
+ perf_stream = StringIO.StringIO(PERF_SCRIPT_OUTPUT) |
+ callchains = list(ipr.collapsed_callchains_generator(perf_stream, |
+ show_all=True)) |
+ self.assertListEqual(callchains, [ |
+ ['firstSymbol', 'secondSymbol', '[other]'], |
+ ["foo", "BytecodeHandler:bar"], |
+ ["foo", "BytecodeHandler:bar"], |
+ ["beep", "BytecodeHandler:bar"], |
+ ["hello", "v8::internal::Compiler", "[compiler]"], |
+ ["Lost", "[misattributed]"], |
+ ["[entry trampoline]"], |
+ ]) |
+ |
+ def test_calculate_samples_count_per_callchain(self): |
+ counters = ipr.calculate_samples_count_per_callchain([ |
+ ["foo", "BytecodeHandler:bar"], |
+ ["foo", "BytecodeHandler:bar"], |
+ ["beep", "BytecodeHandler:bar"], |
+ ["hello", "v8::internal::Compiler", "[compiler]"], |
+ ]) |
+ self.assertItemsEqual(counters, [ |
+ ('BytecodeHandler:bar;foo', 2), |
+ ('BytecodeHandler:bar;beep', 1), |
+ ('[compiler];v8::internal::Compiler;hello', 1), |
+ ]) |
+ |
+ def test_calculate_samples_count_per_callchain(self): |
+ counters = ipr.calculate_samples_count_per_callchain([ |
+ ["foo", "BytecodeHandler:bar"], |
+ ["foo", "BytecodeHandler:bar"], |
+ ["beep", "BytecodeHandler:bar"], |
+ ]) |
+ self.assertItemsEqual(counters, [ |
+ ('BytecodeHandler:bar;foo', 2), |
+ ('BytecodeHandler:bar;beep', 1), |
+ ]) |
+ |
+ def test_calculate_samples_count_per_handler_show_compile(self): |
+ counters = ipr.calculate_samples_count_per_handler([ |
+ ["foo", "BytecodeHandler:bar"], |
+ ["foo", "BytecodeHandler:bar"], |
+ ["beep", "BytecodeHandler:bar"], |
+ ["hello", "v8::internal::Compiler", "[compiler]"], |
+ ]) |
+ self.assertItemsEqual(counters, [ |
+ ("bar", 3), |
+ ("[compiler]", 1) |
+ ]) |
+ |
+ def test_calculate_samples_count_per_handler_(self): |
+ counters = ipr.calculate_samples_count_per_handler([ |
+ ["foo", "BytecodeHandler:bar"], |
+ ["foo", "BytecodeHandler:bar"], |
+ ["beep", "BytecodeHandler:bar"], |
+ ]) |
+ self.assertItemsEqual(counters, [("bar", 3)]) |
+ |
+ def test_multiple_handlers(self): |
+ perf_stream = StringIO.StringIO(""" |
+ 0000 foo(bar) |
+ 1234 BytecodeHandler:first |
+ 5678 a::random::call<to>(something, else) |
+ 9abc BytecodeHandler:second |
+ def0 otherIrrelevant(stuff) |
+ 1111 entrypoint |
+ """) |
+ callchains = list(ipr.collapsed_callchains_generator(perf_stream, False)) |
+ self.assertListEqual(callchains, [ |
+ ["foo", "BytecodeHandler:first"], |
+ ]) |
+ |
+ def test_compiler_symbols_regex(self): |
+ compiler_symbols = [ |
+ "v8::internal::Parser", |
+ "v8::internal::(anonymous namespace)::Compile", |
+ "v8::internal::Compiler::foo", |
+ ] |
+ for compiler_symbol in compiler_symbols: |
+ self.assertTrue(ipr.COMPILER_SYMBOLS_RE.match(compiler_symbol)) |
+ |
+ def test_strip_function_parameters(self): |
+ def should_match(signature, name): |
+ self.assertEqual(ipr.strip_function_parameters(signature), name) |
+ |
+ should_match("foo(bar)", "foo"), |
+ should_match("Foo(foomatic::(anonymous)::bar(baz))", "Foo"), |
+ should_match("v8::(anonymous ns)::bar<thing(with, parentheses)>(baz, poe)", |
+ "v8::(anonymous ns)::bar<thing(with, parentheses)>") |