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 |
new file mode 100755 |
index 0000000000000000000000000000000000000000..6658c30debdc3457bb660a71fabebb65631b51cb |
--- /dev/null |
+++ b/tools/deep_memory_profiler/tests/dmprof_test.py |
@@ -0,0 +1,106 @@ |
+#!/usr/bin/env python |
+# Copyright (c) 2012 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 cStringIO |
+import logging |
+import os |
+import sys |
+import unittest |
+ |
+ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
+sys.path.insert(0, ROOT_DIR) |
+ |
+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 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" |
+} |
+""" |
+ |
+ def test_load(self): |
+ policy = dmprof.Policy.parse(cStringIO.StringIO(self._TEST_POLICY), 'json') |
+ self.assertTrue(policy) |
+ self.assertEqual(policy.version, 'POLICY_DEEP_3') |
+ |
+ 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') |
+ |
+ bucket1 = dmprof.Bucket([0x1212, 0x013], False, 0x29492, '_Z') |
+ bucket1.symbolize(symbol_cache) |
+ bucket2 = dmprof.Bucket([0x18242, 0x1381], False, 0x9492, '_Z') |
+ bucket2.symbolize(symbol_cache) |
+ bucket3 = dmprof.Bucket([0x18242, 0x181], False, 0x949, '_Z') |
+ bucket3.symbolize(symbol_cache) |
+ |
+ self.assertEqual(policy.find(bucket1), 'malloc-v8') |
+ self.assertEqual(policy.find(bucket2), 'malloc-WebKit') |
+ self.assertEqual(policy.find(bucket3), 'malloc-catch-all') |
+ |
+ |
+if __name__ == '__main__': |
+ logging.basicConfig( |
+ level=logging.DEBUG if '-v' in sys.argv else logging.ERROR, |
+ format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s') |
+ unittest.main() |