| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/python | |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 """Unittests for the core backends modules.""" | |
| 7 | |
| 8 import logging | |
| 9 import os | |
| 10 import sys | |
| 11 import unittest | |
| 12 | |
| 13 sys.path.append(os.path.abspath(os.path.join(__file__, os.pardir, os.pardir))) | |
| 14 | |
| 15 from memory_inspector.core import backends | |
| 16 from memory_inspector.core import memory_map | |
| 17 from memory_inspector.core import stacktrace | |
| 18 | |
| 19 | |
| 20 class MockDevice(backends.Device): # pylint: disable=W0223 | |
| 21 def __init__(self, backend, device_id): | |
| 22 super(MockDevice, self).__init__(backend) | |
| 23 self.device_id = device_id | |
| 24 | |
| 25 @property | |
| 26 def name(self): | |
| 27 return "Mock Device %s" % self.device_id | |
| 28 | |
| 29 @property | |
| 30 def id(self): | |
| 31 return self.device_id | |
| 32 | |
| 33 | |
| 34 class MockBackend(backends.Backend): | |
| 35 _SETTINGS = {'key_1': 'key descritpion 1'} | |
| 36 def __init__(self, backend_name): | |
| 37 super(MockBackend, self).__init__(MockBackend._SETTINGS) | |
| 38 self.backend_name = backend_name | |
| 39 | |
| 40 def EnumerateDevices(self): | |
| 41 yield MockDevice(self, 'device-1') | |
| 42 yield MockDevice(self, 'device-2') | |
| 43 | |
| 44 @property | |
| 45 def name(self): | |
| 46 return self.backend_name | |
| 47 | |
| 48 | |
| 49 class BackendRegisterTest(unittest.TestCase): | |
| 50 def runTest(self): | |
| 51 mock_backend_1 = MockBackend('mock-backend-1') | |
| 52 mock_backend_2 = MockBackend('mock-backend-2') | |
| 53 self.assertEqual(mock_backend_1.settings['key_1'], 'key descritpion 1') | |
| 54 backends.Register(mock_backend_1) | |
| 55 backends.Register(mock_backend_2) | |
| 56 devices = list(backends.ListDevices()) | |
| 57 self.assertEqual(len(devices), 4) | |
| 58 self.assertIsNotNone(backends.GetDevice('mock-backend-1', 'device-1')) | |
| 59 self.assertIsNotNone(backends.GetDevice('mock-backend-1', 'device-2')) | |
| 60 self.assertIsNotNone(backends.GetDevice('mock-backend-2', 'device-1')) | |
| 61 self.assertIsNotNone(backends.GetDevice('mock-backend-2', 'device-1')) | |
| 62 self.assertTrue('key_1' in mock_backend_1.settings) | |
| 63 | |
| 64 | |
| 65 class MemoryMapTest(unittest.TestCase): | |
| 66 def runTest(self): | |
| 67 mmap = memory_map.Map() | |
| 68 map_entry1 = memory_map.MapEntry(4096, 8191, 'rw--', '/foo', 0) | |
| 69 map_entry2 = memory_map.MapEntry(65536, 81919, 'rw--', '/bar', 4096) | |
| 70 | |
| 71 # Test the de-offset logic. | |
| 72 self.assertEqual(map_entry1.GetRelativeOffset(4096), 0) | |
| 73 self.assertEqual(map_entry1.GetRelativeOffset(4100), 4) | |
| 74 self.assertEqual(map_entry2.GetRelativeOffset(65536), 4096) | |
| 75 | |
| 76 # Test the page-resident logic. | |
| 77 map_entry2.resident_pages = [5] # 5 -> 101b. | |
| 78 self.assertTrue(map_entry2.IsPageResident(0)) | |
| 79 self.assertFalse(map_entry2.IsPageResident(1)) | |
| 80 self.assertTrue(map_entry2.IsPageResident(2)) | |
| 81 | |
| 82 # Test the lookup logic. | |
| 83 mmap.Add(map_entry1) | |
| 84 mmap.Add(map_entry2) | |
| 85 self.assertIsNone(mmap.Lookup(1024)) | |
| 86 self.assertEqual(mmap.Lookup(4096), map_entry1) | |
| 87 self.assertEqual(mmap.Lookup(6000), map_entry1) | |
| 88 self.assertEqual(mmap.Lookup(8191), map_entry1) | |
| 89 self.assertIsNone(mmap.Lookup(8192)) | |
| 90 self.assertIsNone(mmap.Lookup(65535)) | |
| 91 self.assertEqual(mmap.Lookup(65536), map_entry2) | |
| 92 self.assertEqual(mmap.Lookup(67000), map_entry2) | |
| 93 self.assertEqual(mmap.Lookup(81919), map_entry2) | |
| 94 self.assertIsNone(mmap.Lookup(81920)) | |
| 95 | |
| 96 | |
| 97 class StacktraceTest(unittest.TestCase): | |
| 98 def runTest(self): | |
| 99 st = stacktrace.Stacktrace() | |
| 100 frame_1 = stacktrace.Frame(20) | |
| 101 frame_2 = stacktrace.Frame(24) | |
| 102 frame_2.SetExecFileInfo('/foo/bar.so', 0) | |
| 103 self.assertEqual(frame_2.exec_file_name, 'bar.so') | |
| 104 st.Add(frame_1) | |
| 105 st.Add(frame_1) | |
| 106 st.Add(frame_2) | |
| 107 st.Add(frame_1) | |
| 108 self.assertEqual(st.depth, 4) | |
| 109 | |
| 110 | |
| 111 if __name__ == '__main__': | |
| 112 logging.basicConfig( | |
| 113 level=logging.DEBUG if '-v' in sys.argv else logging.ERROR, | |
| 114 format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s') | |
| 115 unittest.main() | |
| OLD | NEW |