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 |