OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. |
| 5 |
| 6 import cStringIO |
| 7 import logging |
| 8 import os |
| 9 import sys |
| 10 import unittest |
| 11 |
| 12 ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| 13 sys.path.insert(0, ROOT_DIR) |
| 14 |
| 15 import dmprof |
| 16 from dmprof import FUNCTION_ADDRESS, TYPEINFO_ADDRESS |
| 17 |
| 18 |
| 19 class MockSymbolCache(object): |
| 20 def __init__(self): |
| 21 self._symbol_caches = {FUNCTION_ADDRESS: {}, TYPEINFO_ADDRESS: {}} |
| 22 |
| 23 def add(self, address_type, address, symbol): |
| 24 self._symbol_caches[address_type][address] = symbol |
| 25 |
| 26 def lookup(self, address_type, address): |
| 27 symbol = self._symbol_caches[address_type].get(address) |
| 28 return symbol if symbol else '0x%016x' % address |
| 29 |
| 30 |
| 31 class PolicyTest(unittest.TestCase): |
| 32 _TEST_POLICY = """{ |
| 33 "components": [ |
| 34 "second", |
| 35 "mmap-v8", |
| 36 "malloc-v8", |
| 37 "malloc-WebKit", |
| 38 "mmap-catch-all", |
| 39 "malloc-catch-all" |
| 40 ], |
| 41 "rules": [ |
| 42 { |
| 43 "name": "second", |
| 44 "stacktrace": "optional", |
| 45 "allocator": "optional" |
| 46 }, |
| 47 { |
| 48 "name": "mmap-v8", |
| 49 "stacktrace": ".*v8::.*", |
| 50 "allocator": "mmap" |
| 51 }, |
| 52 { |
| 53 "name": "malloc-v8", |
| 54 "stacktrace": ".*v8::.*", |
| 55 "allocator": "malloc" |
| 56 }, |
| 57 { |
| 58 "name": "malloc-WebKit", |
| 59 "stacktrace": ".*WebKit::.*", |
| 60 "allocator": "malloc" |
| 61 }, |
| 62 { |
| 63 "name": "mmap-catch-all", |
| 64 "stacktrace": ".*", |
| 65 "allocator": "mmap" |
| 66 }, |
| 67 { |
| 68 "name": "malloc-catch-all", |
| 69 "stacktrace": ".*", |
| 70 "allocator": "malloc" |
| 71 } |
| 72 ], |
| 73 "version": "POLICY_DEEP_3" |
| 74 } |
| 75 """ |
| 76 |
| 77 def test_load(self): |
| 78 policy = dmprof.Policy.parse(cStringIO.StringIO(self._TEST_POLICY), 'json') |
| 79 self.assertTrue(policy) |
| 80 self.assertEqual(policy.version, 'POLICY_DEEP_3') |
| 81 |
| 82 def test_find(self): |
| 83 policy = dmprof.Policy.parse(cStringIO.StringIO(self._TEST_POLICY), 'json') |
| 84 self.assertTrue(policy) |
| 85 |
| 86 symbol_cache = MockSymbolCache() |
| 87 symbol_cache.add(FUNCTION_ADDRESS, 0x1212, 'v8::create') |
| 88 symbol_cache.add(FUNCTION_ADDRESS, 0x1381, 'WebKit::create') |
| 89 |
| 90 bucket1 = dmprof.Bucket([0x1212, 0x013], False, 0x29492, '_Z') |
| 91 bucket1.symbolize(symbol_cache) |
| 92 bucket2 = dmprof.Bucket([0x18242, 0x1381], False, 0x9492, '_Z') |
| 93 bucket2.symbolize(symbol_cache) |
| 94 bucket3 = dmprof.Bucket([0x18242, 0x181], False, 0x949, '_Z') |
| 95 bucket3.symbolize(symbol_cache) |
| 96 |
| 97 self.assertEqual(policy.find(bucket1), 'malloc-v8') |
| 98 self.assertEqual(policy.find(bucket2), 'malloc-WebKit') |
| 99 self.assertEqual(policy.find(bucket3), 'malloc-catch-all') |
| 100 |
| 101 |
| 102 if __name__ == '__main__': |
| 103 logging.basicConfig( |
| 104 level=logging.DEBUG if '-v' in sys.argv else logging.ERROR, |
| 105 format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s') |
| 106 unittest.main() |
OLD | NEW |