Index: tools/memory_inspector/memory_inspector/classification/native_heap_classifier_unittest.py |
diff --git a/tools/memory_inspector/memory_inspector/classification/native_heap_classifier_unittest.py b/tools/memory_inspector/memory_inspector/classification/native_heap_classifier_unittest.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..977c4f76fd82d264bcb79429377b653af6e955ca |
--- /dev/null |
+++ b/tools/memory_inspector/memory_inspector/classification/native_heap_classifier_unittest.py |
@@ -0,0 +1,86 @@ |
+# Copyright 2014 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 unittest |
+ |
+from memory_inspector.classification import native_heap_classifier |
+from memory_inspector.core import native_heap |
+from memory_inspector.core import stacktrace |
+from memory_inspector.core import symbol |
+ |
+ |
+_TEST_RULES = """ |
+[ |
+{ |
+ 'name': 'content', |
+ 'stacktrace': r'content::', |
+ 'children': [ |
+ { |
+ 'name': 'browser', |
+ 'stacktrace': r'content::browser', |
+ }, |
+ { |
+ 'name': 'renderer', |
+ 'stacktrace': r'content::renderer', |
+ }, |
+ ], |
+}, |
+{ |
+ 'name': 'ashmem_in_skia', |
+ 'stacktrace': [r'sk::', r'ashmem::'], |
+}, |
+] |
+""" |
+ |
+_TEST_STACK_TRACES = [ |
+ (3, ['stack_frame_0::foo()', 'this_goes_under_totals_other']), |
+ (5, ['foo', 'content::browser::something()', 'bar']), |
+ (7, ['content::browser::something_else()']), |
+ (11, ['content::browser::something_else_more()', 'foo']), |
+ (13, ['foo', 'content::renderer::something()', 'bar']), |
+ (17, ['content::renderer::something_else()']), |
+ (19, ['content::renderer::something_else_more()', 'foo']), |
+ (23, ['content::something_different']), |
+ (29, ['foo', 'sk::something', 'not_ashsmem_goes_into_totals_other']), |
+ (31, ['foo', 'sk::something', 'foo::bar', 'sk::foo::ashmem::alloc()']), |
+ (37, ['foo', 'sk::something', 'sk::foo::ashmem::alloc()']), |
+ (43, ['foo::ashmem::alloc()', 'sk::foo', 'wrong_order_goes_into_totals']) |
+] |
+ |
+_EXPECTED_RESULTS = { |
+ 'Total': [238], |
+ 'Total::content': [95], |
+ 'Total::content::browser': [23], # 5 + 7 + 11. |
+ 'Total::content::renderer': [49], # 13 + 17 + 19. |
+ 'Total::content::content-other': [23], |
+ 'Total::ashmem_in_skia': [68], # 31 + 37. |
+ 'Total::Total-other': [75], # 3 + 29 + 43. |
+} |
+ |
+ |
+class NativeHeapClassifierTest(unittest.TestCase): |
+ def runTest(self): |
+ rule_tree = native_heap_classifier.LoadRules(_TEST_RULES) |
+ nheap = native_heap.NativeHeap() |
+ mock_addr = 0 |
+ for test_entry in _TEST_STACK_TRACES: |
+ mock_strace = stacktrace.Stacktrace() |
+ for mock_btstr in test_entry[1]: |
+ mock_addr += 4 # Addr is irrelevant, just keep it distinct. |
+ mock_frame = stacktrace.Frame(mock_addr) |
+ mock_frame.SetSymbolInfo(symbol.Symbol(mock_btstr)) |
+ mock_strace.Add(mock_frame) |
+ nheap.Add(native_heap.Allocation( |
+ size=test_entry[0], count=1, stack_trace=mock_strace)) |
+ |
+ res = native_heap_classifier.Classify(nheap, rule_tree) |
+ |
+ def CheckResult(node, prefix): |
+ node_name = prefix + node.name |
+ self.assertIn(node_name, _EXPECTED_RESULTS) |
+ self.assertEqual(node.values, _EXPECTED_RESULTS[node_name]) |
+ for child in node.children: |
+ CheckResult(child, node_name + '::') |
+ |
+ CheckResult(res.total, '') |