Index: tools/memory_inspector/memory_inspector/classification/mmap_classifier_unittest.py |
diff --git a/tools/memory_inspector/memory_inspector/classification/mmap_classifier_unittest.py b/tools/memory_inspector/memory_inspector/classification/mmap_classifier_unittest.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..af1cc7b645c7eb511510ff12afe971dc47a68839 |
--- /dev/null |
+++ b/tools/memory_inspector/memory_inspector/classification/mmap_classifier_unittest.py |
@@ -0,0 +1,106 @@ |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import unittest |
+ |
+from memory_inspector.classification import mmap_classifier |
+from memory_inspector.core import memory_map |
+ |
+ |
+_TEST_RULES = """ |
+[ |
+{ |
+ 'name': 'anon', |
+ 'mmap_file': r'^\[anon', |
+ 'children': [ |
+ { |
+ 'name': 'jit', |
+ 'mmap_prot': 'r-x', |
+ }, |
+ ], |
+}, |
+{ |
+ 'name': 'dev', |
+ 'mmap_file': r'^/dev', |
+ 'children': [ |
+ { |
+ 'name': 'gpu', |
+ 'mmap_file': r'/gpu', |
+ }, |
+ ], |
+}, |
+{ |
+ 'name': 'lib', |
+ 'mmap_file': r'.so$', |
+ 'children': [ |
+ { |
+ 'name': 'data', |
+ 'mmap_prot': 'rw', |
+ }, |
+ { |
+ 'name': 'text', |
+ 'mmap_prot': 'r-x', |
+ }, |
+ ], |
+}, |
+] |
+""" |
+ |
+_TEST_MMAPS = [ |
+# START END PROT FILE P.Dirt P.Clean S.Dirt S.Clean |
+ (0x00000, 0x03fff, 'rw--', '[anon]', 4096, 0, 4096, 0), |
+ (0x04000, 0x07fff, 'rw--', '/lib/1.so', 8192, 0, 0, 0), |
+ (0x08000, 0x0bfff, 'r-x-', '/lib/1.so', 4096, 8192, 0, 0), |
+ (0x0c000, 0x0ffff, 'rw--', '/lib/2.so', 0, 0, 4096, 8192), |
+ (0x10000, 0x13fff, 'r-x-', '/lib/2.so', 0, 12288, 0, 4096), |
+ (0x14000, 0x17fff, 'rw--', '/dev/gpu/1', 4096, 0, 0, 0), |
+ (0x18000, 0x1bfff, 'rw--', '/dev/gpu/2', 8192, 0, 4096, 0), |
+ (0x1c000, 0x1ffff, 'rw--', '/dev/foo', 0, 4096, 0, 8192), |
+ (0x20000, 0x23fff, 'r-x-', '[anon:jit]', 8192, 0, 4096, 0), |
+ (0x24000, 0x27fff, 'r---', 'OTHER', 0, 0, 8192, 0), |
+] |
+ |
+_EXPECTED_RESULTS = { |
+ 'Total': [36864, 24576, 24576, 20480], |
+ 'Total::anon': [12288, 0, 8192, 0], |
+ 'Total::anon::jit': [8192, 0, 4096, 0], |
+ 'Total::anon::anon-other': [4096, 0, 4096, 0], |
+ 'Total::dev': [12288, 4096, 4096, 8192], |
+ 'Total::dev::gpu': [12288, 0, 4096, 0], |
+ 'Total::dev::dev-other': [0, 4096, 0, 8192], |
+ 'Total::lib': [12288, 20480, 4096, 12288], |
+ 'Total::lib::data': [8192, 0, 4096, 8192], |
+ 'Total::lib::text': [4096, 20480, 0, 4096], |
+ 'Total::lib::lib-other': [0, 0, 0, 0], |
+ 'Total::Total-other': [0, 0, 8192, 0], |
+} |
+ |
+ |
+ |
+class MmapClassifierTest(unittest.TestCase): |
+ def runTest(self): |
+ rule_tree = mmap_classifier.LoadRules(_TEST_RULES) |
+ mmap = memory_map.Map() |
+ for m in _TEST_MMAPS: |
+ mmap.Add(memory_map.MapEntry( |
+ m[0], m[1], m[2], m[3], 0, m[4], m[5], m[6], m[7])) |
+ |
+ res = mmap_classifier.Classify(mmap, rule_tree) |
+ |
+ def CheckResult(node, prefix): |
+ node_name = prefix + node.name |
+ self.assertIn(node_name, _EXPECTED_RESULTS) |
+ subtotal = node.values[0] |
+ values = node.values[1:] |
+ |
+ # First check that the subtotal matches clean + dirty + shared + priv. |
+ self.assertEqual(subtotal, values[0] + values[1] + values[2] + values[3]) |
+ |
+ # Then check that the single values match the expectations. |
+ self.assertEqual(values, _EXPECTED_RESULTS[node_name]) |
+ |
+ for child in node.children: |
+ CheckResult(child, node_name + '::') |
+ |
+ CheckResult(res.total, '') |