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 |