1# Copyright 2014 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import unittest
6
7from memory_inspector.core import memory_map
8
9
10class MemoryMapTest(unittest.TestCase):
11  def runTest(self):
12    mmap = memory_map.Map()
13    map_entry1 = memory_map.MapEntry(4096, 8191, 'rw--', '/foo', 0)
14    map_entry2 = memory_map.MapEntry(65536, 81919, 'rw--', '/bar', 4096)
15
16    # Test the file de-offset logic.
17    self.assertEqual(map_entry1.GetRelativeFileOffset(4096), 0)
18    self.assertEqual(map_entry1.GetRelativeFileOffset(4100), 4)
19    self.assertEqual(map_entry2.GetRelativeFileOffset(65536), 4096)
20
21    # Test the mm de-offset logic (address to relative page_index + offset).
22    self.assertEqual(map_entry1.GetRelativeMMOffset(4096), (0, 0))
23    self.assertEqual(map_entry1.GetRelativeMMOffset(4097), (0, 1))
24    self.assertEqual(map_entry1.GetRelativeMMOffset(8191), (0, 4095))
25    self.assertEqual(map_entry2.GetRelativeMMOffset(69632), (1, 0))
26    self.assertEqual(map_entry2.GetRelativeMMOffset(69633), (1, 1))
27    self.assertEqual(map_entry2.GetRelativeMMOffset(81919), (3, 4095))
28
29    # Test the page-resident logic.
30    map_entry2.resident_pages = [5] # 5 -> 101b.
31    self.assertTrue(map_entry2.IsPageResident(0))
32    self.assertFalse(map_entry2.IsPageResident(1))
33    self.assertTrue(map_entry2.IsPageResident(2))
34
35    # Test the lookup logic.
36    mmap.Add(map_entry1)
37    mmap.Add(map_entry2)
38    self.assertIsNone(mmap.Lookup(1024))
39    self.assertEqual(mmap.Lookup(4096), map_entry1)
40    self.assertEqual(mmap.Lookup(6000), map_entry1)
41    self.assertEqual(mmap.Lookup(8191), map_entry1)
42    self.assertIsNone(mmap.Lookup(8192))
43    self.assertIsNone(mmap.Lookup(65535))
44    self.assertEqual(mmap.Lookup(65536), map_entry2)
45    self.assertEqual(mmap.Lookup(67000), map_entry2)
46    self.assertEqual(mmap.Lookup(81919), map_entry2)
47    self.assertIsNone(mmap.Lookup(81920))
48