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 re
6import unittest
7
8from memory_inspector.classification import results
9from memory_inspector.classification import rules
10
11
12class ResultsTest(unittest.TestCase):
13  def runTest(self):
14    rules_dict = [
15      {
16        'name': 'a*',
17        'regex': '^a.*',
18        'children': [
19          {
20            'name': 'az*',
21            'regex': '^az.*'
22          }
23        ]
24      },
25      {
26        'name': 'b*',
27        'regex': '^b.*',
28      },
29    ]
30
31    rule = rules.Load(str(rules_dict), MockRegexMatchingRule)
32    result = results.AggreatedResults(rule, keys=['X', 'Y'])
33    self.assertEqual(result.total.name, 'Total')
34    self.assertEqual(len(result.total.children), 3)
35    self.assertEqual(result.total.children[0].name, 'a*')
36    self.assertEqual(result.total.children[1].name, 'b*')
37    self.assertEqual(result.total.children[2].name, 'Total-other')
38    self.assertEqual(result.total.children[0].children[0].name, 'az*')
39    self.assertEqual(result.total.children[0].children[1].name, 'a*-other')
40
41    result.AddToMatchingNodes('aa1', [1, 2])  # -> a*
42    result.AddToMatchingNodes('aa2', [3, 4])  # -> a*
43    result.AddToMatchingNodes('az', [5, 6])  # -> a*/az*
44    result.AddToMatchingNodes('z1', [7, 8])  # -> T-other
45    result.AddToMatchingNodes('b1', [9, 10])  # -> b*
46    result.AddToMatchingNodes('b2', [11, 12])  # -> b*
47    result.AddToMatchingNodes('z2', [13, 14])  # -> T-other
48
49    self.assertEqual(result.total.values, [49, 56])
50    self.assertEqual(result.total.children[0].values, [9, 12])
51    self.assertEqual(result.total.children[1].values, [20, 22])
52    self.assertEqual(result.total.children[0].children[0].values, [5, 6])
53    self.assertEqual(result.total.children[0].children[1].values, [4, 6])
54    self.assertEqual(result.total.children[2].values, [20, 22])
55
56
57class MockRegexMatchingRule(rules.Rule):
58  def __init__(self, name, filters):
59    super(MockRegexMatchingRule, self).__init__(name)
60    self._regex = filters['regex']
61
62  def Match(self, s):
63    return bool(re.match(self._regex, s))