| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import cStringIO | 6 import cStringIO |
| 7 import logging | 7 import logging |
| 8 import os | 8 import os |
| 9 import sys | 9 import sys |
| 10 import textwrap | 10 import textwrap |
| 11 import unittest | 11 import unittest |
| 12 | 12 |
| 13 ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 13 BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| 14 sys.path.insert(0, ROOT_DIR) | 14 sys.path.append(BASE_PATH) |
| 15 | 15 |
| 16 try: | 16 from lib.bucket import Bucket |
| 17 from collections import OrderedDict # pylint: disable=E0611 | 17 from lib.ordered_dict import OrderedDict |
| 18 except ImportError: | 18 from lib.policy import Policy |
| 19 SIMPLEJSON_PATH = os.path.join(ROOT_DIR, os.pardir, os.pardir, 'third_party') | 19 from lib.symbol import SymbolMappingCache |
| 20 sys.path.insert(0, SIMPLEJSON_PATH) | 20 from lib.symbol import FUNCTION_SYMBOLS, SOURCEFILE_SYMBOLS, TYPEINFO_SYMBOLS |
| 21 from simplejson import OrderedDict | |
| 22 | 21 |
| 23 import dmprof | 22 import subcommands |
| 24 from find_runtime_symbols import FUNCTION_SYMBOLS | |
| 25 from find_runtime_symbols import SOURCEFILE_SYMBOLS | |
| 26 from find_runtime_symbols import TYPEINFO_SYMBOLS | |
| 27 | 23 |
| 28 | 24 |
| 29 class SymbolMappingCacheTest(unittest.TestCase): | 25 class SymbolMappingCacheTest(unittest.TestCase): |
| 30 class MockBucketSet(object): | 26 class MockBucketSet(object): |
| 31 def __init__(self, addresses): | 27 def __init__(self, addresses): |
| 32 self._addresses = addresses | 28 self._addresses = addresses |
| 33 | 29 |
| 34 def iter_addresses(self, symbol_type): # pylint: disable=W0613 | 30 def iter_addresses(self, symbol_type): # pylint: disable=W0613 |
| 35 for address in self._addresses: | 31 for address in self._addresses: |
| 36 yield address | 32 yield address |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 _TEST_FUNCTION_DICT = { | 65 _TEST_FUNCTION_DICT = { |
| 70 0x1: '0x0000000000000001', | 66 0x1: '0x0000000000000001', |
| 71 0x2: '0x0000000000000002', | 67 0x2: '0x0000000000000002', |
| 72 0x7fc33eebcaa4: '__gnu_cxx::new_allocator::allocate', | 68 0x7fc33eebcaa4: '__gnu_cxx::new_allocator::allocate', |
| 73 0x7fc33ef69242: 'void DispatchToMethod', | 69 0x7fc33ef69242: 'void DispatchToMethod', |
| 74 0x7fc33ef7bc3e: 'std::map::operator[]', | 70 0x7fc33ef7bc3e: 'std::map::operator[]', |
| 75 0x7fc34411f9d5: 'WTF::RefCounted::operator new', | 71 0x7fc34411f9d5: 'WTF::RefCounted::operator new', |
| 76 } | 72 } |
| 77 | 73 |
| 78 def test_update(self): | 74 def test_update(self): |
| 79 symbol_mapping_cache = dmprof.SymbolMappingCache() | 75 symbol_mapping_cache = SymbolMappingCache() |
| 80 cache_f = cStringIO.StringIO() | 76 cache_f = cStringIO.StringIO() |
| 81 cache_f.write(self._TEST_FUNCTION_CACHE) | 77 cache_f.write(self._TEST_FUNCTION_CACHE) |
| 82 | 78 |
| 83 # No update from self._TEST_FUNCTION_CACHE | 79 # No update from self._TEST_FUNCTION_CACHE |
| 84 symbol_mapping_cache.update( | 80 symbol_mapping_cache.update( |
| 85 FUNCTION_SYMBOLS, | 81 FUNCTION_SYMBOLS, |
| 86 self.MockBucketSet(self._TEST_FUNCTION_ADDRESS_LIST1), | 82 self.MockBucketSet(self._TEST_FUNCTION_ADDRESS_LIST1), |
| 87 self.MockSymbolFinder(self._TEST_FUNCTION_DICT), cache_f) | 83 self.MockSymbolFinder(self._TEST_FUNCTION_DICT), cache_f) |
| 88 for address in self._TEST_FUNCTION_ADDRESS_LIST1: | 84 for address in self._TEST_FUNCTION_ADDRESS_LIST1: |
| 89 self.assertEqual(self._TEST_FUNCTION_DICT[address], | 85 self.assertEqual(self._TEST_FUNCTION_DICT[address], |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 "name": "malloc-catch-all", | 153 "name": "malloc-catch-all", |
| 158 "stacktrace": ".*", | 154 "stacktrace": ".*", |
| 159 "allocator": "malloc" | 155 "allocator": "malloc" |
| 160 } | 156 } |
| 161 ], | 157 ], |
| 162 "version": "POLICY_DEEP_3" | 158 "version": "POLICY_DEEP_3" |
| 163 } | 159 } |
| 164 """) | 160 """) |
| 165 | 161 |
| 166 def test_load(self): | 162 def test_load(self): |
| 167 policy = dmprof.Policy.parse(cStringIO.StringIO(self._TEST_POLICY), 'json') | 163 policy = Policy.parse(cStringIO.StringIO(self._TEST_POLICY), 'json') |
| 168 self.assertTrue(policy) | 164 self.assertTrue(policy) |
| 169 self.assertEqual('POLICY_DEEP_3', policy.version) | 165 self.assertEqual('POLICY_DEEP_3', policy.version) |
| 170 | 166 |
| 171 def test_find(self): | 167 def test_find(self): |
| 172 policy = dmprof.Policy.parse(cStringIO.StringIO(self._TEST_POLICY), 'json') | 168 policy = Policy.parse(cStringIO.StringIO(self._TEST_POLICY), 'json') |
| 173 self.assertTrue(policy) | 169 self.assertTrue(policy) |
| 174 | 170 |
| 175 symbol_mapping_cache = self.MockSymbolMappingCache() | 171 symbol_mapping_cache = self.MockSymbolMappingCache() |
| 176 symbol_mapping_cache.add(FUNCTION_SYMBOLS, 0x1212, 'v8::create') | 172 symbol_mapping_cache.add(FUNCTION_SYMBOLS, 0x1212, 'v8::create') |
| 177 symbol_mapping_cache.add(FUNCTION_SYMBOLS, 0x1381, 'WebKit::create') | 173 symbol_mapping_cache.add(FUNCTION_SYMBOLS, 0x1381, 'WebKit::create') |
| 178 | 174 |
| 179 bucket1 = dmprof.Bucket([0x1212, 0x013], 'malloc', 0x29492, '_Z') | 175 bucket1 = Bucket([0x1212, 0x013], 'malloc', 0x29492, '_Z') |
| 180 bucket1.symbolize(symbol_mapping_cache) | 176 bucket1.symbolize(symbol_mapping_cache) |
| 181 bucket2 = dmprof.Bucket([0x18242, 0x1381], 'malloc', 0x9492, '_Z') | 177 bucket2 = Bucket([0x18242, 0x1381], 'malloc', 0x9492, '_Z') |
| 182 bucket2.symbolize(symbol_mapping_cache) | 178 bucket2.symbolize(symbol_mapping_cache) |
| 183 bucket3 = dmprof.Bucket([0x18242, 0x181], 'malloc', 0x949, '_Z') | 179 bucket3 = Bucket([0x18242, 0x181], 'malloc', 0x949, '_Z') |
| 184 bucket3.symbolize(symbol_mapping_cache) | 180 bucket3.symbolize(symbol_mapping_cache) |
| 185 | 181 |
| 186 self.assertEqual('malloc-v8', policy.find_malloc(bucket1)) | 182 self.assertEqual('malloc-v8', policy.find_malloc(bucket1)) |
| 187 self.assertEqual('malloc-WebKit', policy.find_malloc(bucket2)) | 183 self.assertEqual('malloc-WebKit', policy.find_malloc(bucket2)) |
| 188 self.assertEqual('malloc-catch-all', policy.find_malloc(bucket3)) | 184 self.assertEqual('malloc-catch-all', policy.find_malloc(bucket3)) |
| 189 | 185 |
| 190 | 186 |
| 191 class BucketsCommandTest(unittest.TestCase): | 187 class BucketsCommandTest(unittest.TestCase): |
| 192 def test(self): | 188 def test(self): |
| 193 with open(os.path.join(ROOT_DIR, 'tests', 'output', 'buckets')) as output_f: | 189 BUCKETS_PATH = os.path.join(BASE_PATH, 'tests', 'output', 'buckets') |
| 190 with open(BUCKETS_PATH) as output_f: |
| 194 expected = output_f.read() | 191 expected = output_f.read() |
| 195 | 192 |
| 196 out = cStringIO.StringIO() | 193 out = cStringIO.StringIO() |
| 197 | 194 |
| 198 command = dmprof.BucketsCommand() | 195 HEAP_PATH = os.path.join(BASE_PATH, 'tests', 'data', 'heap.01234.0001.heap') |
| 199 returncode = command.do([ | 196 subcommand = subcommands.BucketsCommand() |
| 200 'buckets', | 197 returncode = subcommand.do(['buckets', HEAP_PATH], out) |
| 201 os.path.join(ROOT_DIR, 'tests', 'data', 'heap.01234.0001.heap')], out) | |
| 202 self.assertEqual(0, returncode) | 198 self.assertEqual(0, returncode) |
| 203 self.assertEqual(expected, out.getvalue()) | 199 self.assertEqual(expected, out.getvalue()) |
| 204 | 200 |
| 205 | 201 |
| 206 class UploadCommandTest(unittest.TestCase): | 202 class UploadCommandTest(unittest.TestCase): |
| 207 def test(self): | 203 def test(self): |
| 208 command = dmprof.UploadCommand() | 204 MOCK_GSUTIL_PATH = os.path.join(BASE_PATH, 'tests', 'mock_gsutil.py') |
| 209 returncode = command.do([ | 205 HEAP_PATH = os.path.join(BASE_PATH, 'tests', 'data', 'heap.01234.0001.heap') |
| 206 subcommand = subcommands.UploadCommand() |
| 207 returncode = subcommand.do([ |
| 210 'upload', | 208 'upload', |
| 211 '--gsutil', | 209 '--gsutil', |
| 212 os.path.join(ROOT_DIR, 'tests', 'mock_gsutil.py'), | 210 MOCK_GSUTIL_PATH, |
| 213 os.path.join(ROOT_DIR, 'tests', 'data', 'heap.01234.0001.heap'), | 211 HEAP_PATH, |
| 214 'gs://test-storage/']) | 212 'gs://test-storage/']) |
| 215 self.assertEqual(0, returncode) | 213 self.assertEqual(0, returncode) |
| 216 | 214 |
| 217 | 215 |
| 218 if __name__ == '__main__': | 216 if __name__ == '__main__': |
| 219 logging.basicConfig( | 217 logging.basicConfig( |
| 220 level=logging.DEBUG if '-v' in sys.argv else logging.ERROR, | 218 level=logging.DEBUG if '-v' in sys.argv else logging.ERROR, |
| 221 format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s') | 219 format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s') |
| 222 unittest.main() | 220 unittest.main() |
| OLD | NEW |