Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(315)

Unified Diff: tools/deep_memory_profiler/tests/dmprof_test.py

Issue 11418130: Add a test for SymbolMappingCache in tools/deep_memory_profiler/dmprof.py. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/deep_memory_profiler/dmprof.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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__':
« no previous file with comments | « tools/deep_memory_profiler/dmprof.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698