native_heap_classifier_unittest.py revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1# Copyright 2014 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import unittest 6 7from memory_inspector.classification import native_heap_classifier 8from memory_inspector.core import native_heap 9from memory_inspector.core import stacktrace 10from memory_inspector.core import symbol 11 12 13_TEST_RULES = """ 14[ 15{ 16 'name': 'content', 17 'stacktrace': r'content::', 18 'children': [ 19 { 20 'name': 'browser', 21 'stacktrace': r'content::browser', 22 }, 23 { 24 'name': 'renderer', 25 'stacktrace': r'content::renderer', 26 }, 27 ], 28}, 29{ 30 'name': 'ashmem_in_skia', 31 'stacktrace': [r'sk::', r'ashmem::'], 32}, 33] 34""" 35 36_TEST_STACK_TRACES = [ 37 (3, ['stack_frame_0::foo()', 'this_goes_under_totals_other']), 38 (5, ['foo', 'content::browser::something()', 'bar']), 39 (7, ['content::browser::something_else()']), 40 (11, ['content::browser::something_else_more()', 'foo']), 41 (13, ['foo', 'content::renderer::something()', 'bar']), 42 (17, ['content::renderer::something_else()']), 43 (19, ['content::renderer::something_else_more()', 'foo']), 44 (23, ['content::something_different']), 45 (29, ['foo', 'sk::something', 'not_ashsmem_goes_into_totals_other']), 46 (31, ['foo', 'sk::something', 'foo::bar', 'sk::foo::ashmem::alloc()']), 47 (37, ['foo', 'sk::something', 'sk::foo::ashmem::alloc()']), 48 (43, ['foo::ashmem::alloc()', 'sk::foo', 'wrong_order_goes_into_totals']) 49] 50 51_EXPECTED_RESULTS = { 52 'Total': [238], 53 'Total::content': [95], 54 'Total::content::browser': [23], # 5 + 7 + 11. 55 'Total::content::renderer': [49], # 13 + 17 + 19. 56 'Total::content::content-other': [23], 57 'Total::ashmem_in_skia': [68], # 31 + 37. 58 'Total::Total-other': [75], # 3 + 29 + 43. 59} 60 61 62class NativeHeapClassifierTest(unittest.TestCase): 63 def runTest(self): 64 rule_tree = native_heap_classifier.LoadRules(_TEST_RULES) 65 nheap = native_heap.NativeHeap() 66 mock_addr = 0 67 for test_entry in _TEST_STACK_TRACES: 68 mock_strace = stacktrace.Stacktrace() 69 for mock_btstr in test_entry[1]: 70 mock_addr += 4 # Addr is irrelevant, just keep it distinct. 71 mock_frame = stacktrace.Frame(mock_addr) 72 mock_frame.SetSymbolInfo(symbol.Symbol(mock_btstr)) 73 mock_strace.Add(mock_frame) 74 nheap.Add(native_heap.Allocation( 75 size=test_entry[0], count=1, stack_trace=mock_strace)) 76 77 res = native_heap_classifier.Classify(nheap, rule_tree) 78 79 def CheckResult(node, prefix): 80 node_name = prefix + node.name 81 self.assertIn(node_name, _EXPECTED_RESULTS) 82 self.assertEqual(node.values, _EXPECTED_RESULTS[node_name]) 83 for child in node.children: 84 CheckResult(child, node_name + '::') 85 86 CheckResult(res.total, '')