1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)# found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import unittest
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from memory_inspector.classification import rules
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)_TEST_RULE = """
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)[
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  'name': '1',
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  'mmap-file': r'/foo/1',
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  'foo': 'bar',
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  'children': [
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     {
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       'name': '1/1',
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       'mmap-file': r'/foo/1/1',
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       'children': []
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     },
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     {
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       'name': '1/2',
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       'mmap-file': r'/foo/1/2',
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     },
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ]
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)},
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  'name': '2',
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  'mmap-file': r'/bar/2',
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  'children': [
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     {
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       'name': '2/1',
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       'mmap-file': r'/bar/2/1',
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     },
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     {
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       'name': '2/2',
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       'mmap-file': r'/bar/2/2',
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       'children': [
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)         {
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           'name': '2/2/1',
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           'mmap-file': r'/bar/2/2/1',
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)         },
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)         {
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           'name': '2/2/2',
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           'mmap-file': r'/bar/2/2/2',
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)         },
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       ]
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     },
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     {
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       'name': '2/3',
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       'mmap-file': r'/bar/3',
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     },
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ]
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)},
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)]
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)"""
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class RulesTest(unittest.TestCase):
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  def runTest(self):
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    rt = rules.Load(_TEST_RULE, MockRule)
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(rt.name, 'Total')
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(len(rt.children), 3)
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    node1 = rt.children[0]
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    node2 = rt.children[1]
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    node3 = rt.children[2]
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    # Check 1-st level leaves.
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node1.name, '1')
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node1.filters['mmap-file'], '/foo/1')
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node1.filters['foo'], 'bar')
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node2.name, '2')
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node2.filters['mmap-file'], '/bar/2')
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node3.name, 'Total-other')
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    # Check 2-nd level leaves and their children.
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(len(node1.children), 3)
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node1.children[0].name, '1/1')
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node1.children[1].name, '1/2')
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node1.children[2].name, '1-other')
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(len(node2.children), 4)
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node2.children[0].name, '2/1')
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(len(node2.children[0].children), 0)
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node2.children[1].name, '2/2')
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(len(node2.children[1].children), 3)
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node2.children[2].name, '2/3')
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(len(node2.children[2].children), 0)
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(node2.children[3].name, '2-other')
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual(len(node2.children[3].children), 0)
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class MockRule(rules.Rule):
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  def __init__(self, name, filters):
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    super(MockRule, self).__init__(name)
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.filters = filters