| Index: tools/deep_memory_profiler/tests/dmprof_test.py
|
| diff --git a/tools/deep_memory_profiler/tests/dmprof_test.py b/tools/deep_memory_profiler/tests/dmprof_test.py
|
| index 6658c30debdc3457bb660a71fabebb65631b51cb..23eaaa75c1a0fdbebeee5357a8c12387ca7e7a99 100755
|
| --- a/tools/deep_memory_profiler/tests/dmprof_test.py
|
| +++ b/tools/deep_memory_profiler/tests/dmprof_test.py
|
| @@ -7,6 +7,7 @@ import cStringIO
|
| import logging
|
| import os
|
| import sys
|
| +import textwrap
|
| import unittest
|
|
|
| ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
| @@ -16,87 +17,159 @@ import dmprof
|
| from dmprof import FUNCTION_ADDRESS, TYPEINFO_ADDRESS
|
|
|
|
|
| -class MockSymbolCache(object):
|
| - def __init__(self):
|
| - self._symbol_caches = {FUNCTION_ADDRESS: {}, TYPEINFO_ADDRESS: {}}
|
| -
|
| - def add(self, address_type, address, symbol):
|
| - self._symbol_caches[address_type][address] = symbol
|
| -
|
| - def lookup(self, address_type, address):
|
| - symbol = self._symbol_caches[address_type].get(address)
|
| - return symbol if symbol else '0x%016x' % address
|
| +class SymbolMappingCacheTest(unittest.TestCase):
|
| + class MockBucketSet(object):
|
| + def __init__(self, addresses):
|
| + self._addresses = addresses
|
| +
|
| + def iter_addresses(self, address_type): # pylint: disable=W0613
|
| + for address in self._addresses:
|
| + yield address
|
| +
|
| + class MockSymbolFinder(object):
|
| + def __init__(self, mapping):
|
| + self._mapping = mapping
|
| +
|
| + def find(self, address_list):
|
| + return [self._mapping[address] for address in address_list]
|
| +
|
| + _TEST_FUNCTION_CACHE = textwrap.dedent("""\
|
| + 1 0x0000000000000001
|
| + 7fc33eebcaa4 __gnu_cxx::new_allocator::allocate
|
| + 7fc33ef69242 void DispatchToMethod
|
| + """)
|
| +
|
| + _EXPECTED_TEST_FUNCTION_CACHE = textwrap.dedent("""\
|
| + 1 0x0000000000000001
|
| + 7fc33eebcaa4 __gnu_cxx::new_allocator::allocate
|
| + 7fc33ef69242 void DispatchToMethod
|
| + 2 0x0000000000000002
|
| + 7fc33ef7bc3e std::map::operator[]
|
| + 7fc34411f9d5 WTF::RefCounted::operator new
|
| + """)
|
| +
|
| + _TEST_FUNCTION_ADDRESS_LIST1 = [
|
| + 0x1, 0x7fc33eebcaa4, 0x7fc33ef69242]
|
| +
|
| + _TEST_FUNCTION_ADDRESS_LIST2 = [
|
| + 0x1, 0x2, 0x7fc33eebcaa4, 0x7fc33ef69242, 0x7fc33ef7bc3e, 0x7fc34411f9d5]
|
| +
|
| + _TEST_FUNCTION_DICT = {
|
| + 0x1: '0x0000000000000001',
|
| + 0x2: '0x0000000000000002',
|
| + 0x7fc33eebcaa4: '__gnu_cxx::new_allocator::allocate',
|
| + 0x7fc33ef69242: 'void DispatchToMethod',
|
| + 0x7fc33ef7bc3e: 'std::map::operator[]',
|
| + 0x7fc34411f9d5: 'WTF::RefCounted::operator new',
|
| + }
|
| +
|
| + def test_update(self):
|
| + symbol_mapping_cache = dmprof.SymbolMappingCache()
|
| + cache_f = cStringIO.StringIO()
|
| + cache_f.write(self._TEST_FUNCTION_CACHE)
|
| +
|
| + # No update from self._TEST_FUNCTION_CACHE
|
| + symbol_mapping_cache.update(
|
| + FUNCTION_ADDRESS,
|
| + self.MockBucketSet(self._TEST_FUNCTION_ADDRESS_LIST1),
|
| + self.MockSymbolFinder(self._TEST_FUNCTION_DICT), cache_f)
|
| + for address in self._TEST_FUNCTION_ADDRESS_LIST1:
|
| + self.assertEqual(self._TEST_FUNCTION_DICT[address],
|
| + symbol_mapping_cache.lookup(FUNCTION_ADDRESS, address))
|
| + self.assertEqual(self._TEST_FUNCTION_CACHE, cache_f.getvalue())
|
| +
|
| + # Update to self._TEST_FUNCTION_ADDRESS_LIST2
|
| + symbol_mapping_cache.update(
|
| + FUNCTION_ADDRESS,
|
| + self.MockBucketSet(self._TEST_FUNCTION_ADDRESS_LIST2),
|
| + self.MockSymbolFinder(self._TEST_FUNCTION_DICT), cache_f)
|
| + for address in self._TEST_FUNCTION_ADDRESS_LIST2:
|
| + self.assertEqual(self._TEST_FUNCTION_DICT[address],
|
| + symbol_mapping_cache.lookup(FUNCTION_ADDRESS, address))
|
| + self.assertEqual(self._EXPECTED_TEST_FUNCTION_CACHE, cache_f.getvalue())
|
|
|
|
|
| class PolicyTest(unittest.TestCase):
|
| - _TEST_POLICY = """{
|
| - "components": [
|
| - "second",
|
| - "mmap-v8",
|
| - "malloc-v8",
|
| - "malloc-WebKit",
|
| - "mmap-catch-all",
|
| - "malloc-catch-all"
|
| - ],
|
| - "rules": [
|
| - {
|
| - "name": "second",
|
| - "stacktrace": "optional",
|
| - "allocator": "optional"
|
| - },
|
| - {
|
| - "name": "mmap-v8",
|
| - "stacktrace": ".*v8::.*",
|
| - "allocator": "mmap"
|
| - },
|
| - {
|
| - "name": "malloc-v8",
|
| - "stacktrace": ".*v8::.*",
|
| - "allocator": "malloc"
|
| - },
|
| - {
|
| - "name": "malloc-WebKit",
|
| - "stacktrace": ".*WebKit::.*",
|
| - "allocator": "malloc"
|
| - },
|
| - {
|
| - "name": "mmap-catch-all",
|
| - "stacktrace": ".*",
|
| - "allocator": "mmap"
|
| - },
|
| - {
|
| - "name": "malloc-catch-all",
|
| - "stacktrace": ".*",
|
| - "allocator": "malloc"
|
| - }
|
| - ],
|
| - "version": "POLICY_DEEP_3"
|
| -}
|
| -"""
|
| + class MockSymbolMappingCache(object):
|
| + def __init__(self):
|
| + self._symbol_caches = {FUNCTION_ADDRESS: {}, TYPEINFO_ADDRESS: {}}
|
| +
|
| + def add(self, address_type, address, symbol):
|
| + self._symbol_caches[address_type][address] = symbol
|
| +
|
| + def lookup(self, address_type, address):
|
| + symbol = self._symbol_caches[address_type].get(address)
|
| + return symbol if symbol else '0x%016x' % address
|
| +
|
| + _TEST_POLICY = textwrap.dedent("""\
|
| + {
|
| + "components": [
|
| + "second",
|
| + "mmap-v8",
|
| + "malloc-v8",
|
| + "malloc-WebKit",
|
| + "mmap-catch-all",
|
| + "malloc-catch-all"
|
| + ],
|
| + "rules": [
|
| + {
|
| + "name": "second",
|
| + "stacktrace": "optional",
|
| + "allocator": "optional"
|
| + },
|
| + {
|
| + "name": "mmap-v8",
|
| + "stacktrace": ".*v8::.*",
|
| + "allocator": "mmap"
|
| + },
|
| + {
|
| + "name": "malloc-v8",
|
| + "stacktrace": ".*v8::.*",
|
| + "allocator": "malloc"
|
| + },
|
| + {
|
| + "name": "malloc-WebKit",
|
| + "stacktrace": ".*WebKit::.*",
|
| + "allocator": "malloc"
|
| + },
|
| + {
|
| + "name": "mmap-catch-all",
|
| + "stacktrace": ".*",
|
| + "allocator": "mmap"
|
| + },
|
| + {
|
| + "name": "malloc-catch-all",
|
| + "stacktrace": ".*",
|
| + "allocator": "malloc"
|
| + }
|
| + ],
|
| + "version": "POLICY_DEEP_3"
|
| + }
|
| + """)
|
|
|
| def test_load(self):
|
| policy = dmprof.Policy.parse(cStringIO.StringIO(self._TEST_POLICY), 'json')
|
| self.assertTrue(policy)
|
| - self.assertEqual(policy.version, 'POLICY_DEEP_3')
|
| + self.assertEqual('POLICY_DEEP_3', policy.version)
|
|
|
| def test_find(self):
|
| policy = dmprof.Policy.parse(cStringIO.StringIO(self._TEST_POLICY), 'json')
|
| self.assertTrue(policy)
|
|
|
| - symbol_cache = MockSymbolCache()
|
| - symbol_cache.add(FUNCTION_ADDRESS, 0x1212, 'v8::create')
|
| - symbol_cache.add(FUNCTION_ADDRESS, 0x1381, 'WebKit::create')
|
| + symbol_mapping_cache = self.MockSymbolMappingCache()
|
| + symbol_mapping_cache.add(FUNCTION_ADDRESS, 0x1212, 'v8::create')
|
| + symbol_mapping_cache.add(FUNCTION_ADDRESS, 0x1381, 'WebKit::create')
|
|
|
| bucket1 = dmprof.Bucket([0x1212, 0x013], False, 0x29492, '_Z')
|
| - bucket1.symbolize(symbol_cache)
|
| + bucket1.symbolize(symbol_mapping_cache)
|
| bucket2 = dmprof.Bucket([0x18242, 0x1381], False, 0x9492, '_Z')
|
| - bucket2.symbolize(symbol_cache)
|
| + bucket2.symbolize(symbol_mapping_cache)
|
| bucket3 = dmprof.Bucket([0x18242, 0x181], False, 0x949, '_Z')
|
| - bucket3.symbolize(symbol_cache)
|
| + bucket3.symbolize(symbol_mapping_cache)
|
|
|
| - self.assertEqual(policy.find(bucket1), 'malloc-v8')
|
| - self.assertEqual(policy.find(bucket2), 'malloc-WebKit')
|
| - self.assertEqual(policy.find(bucket3), 'malloc-catch-all')
|
| + self.assertEqual('malloc-v8', policy.find(bucket1))
|
| + self.assertEqual('malloc-WebKit', policy.find(bucket2))
|
| + self.assertEqual('malloc-catch-all', policy.find(bucket3))
|
|
|
|
|
| if __name__ == '__main__':
|
|
|