1c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu#!/usr/bin/python2
2c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
3c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu# Copyright 2016 The Chromium OS Authors. All rights reserved.
4c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu# Use of this source code is governed by a BSD-style license that can be
5c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu# found in the LICENSE file.
6c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu"""Unit tests for the utility module."""
7c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
8c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescuimport collections
9c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescuimport csv
10c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescuimport unittest
11c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
12c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescuimport utils
13c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
14c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
15c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescuclass UtilsTest(unittest.TestCase):
16c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu  """Test class for utility module."""
17c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
18c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu  def __init__(self, *args, **kwargs):
19c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    super(UtilsTest, self).__init__(*args, **kwargs)
20c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self._pprof_top_csv_file = 'testdata/input/pprof_top_csv/file1.csv'
21c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self._pprof_top_file = 'testdata/input/pprof_top/file1.pprof'
22c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self._pprof_tree_csv_file = 'testdata/input/pprof_tree_csv/file1.csv'
23c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self._pprof_tree_file = 'testdata/input/pprof_tree/file1.pprof'
24c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self._pairwise_inclusive_count_test_file = \
25c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        'testdata/input/pairwise_inclusive_count_test.csv'
26c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self._pairwise_inclusive_count_reference_file = \
27c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        'testdata/input/pairwise_inclusive_count_reference.csv'
28c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self._inclusive_count_test_file = \
29c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu       'testdata/input/inclusive_count_test.csv'
30c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self._inclusive_count_reference_file = \
31c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        'testdata/input/inclusive_count_reference.csv'
32c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
33c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu  def testParseFunctionGroups(self):
34c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    cwp_function_groups_lines = \
35c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        ['group1 /a\n', 'group2 /b\n', 'group3 /c\n', 'group4 /d\n']
36c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    expected_output = [('group1', '/a'), ('group2', '/b'), ('group3', '/c'),
37c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu                       ('group4', '/d')]
38c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    result = utils.ParseFunctionGroups(cwp_function_groups_lines)
39c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
40c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self.assertListEqual(expected_output, result)
41c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
42c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu  def testParsePProfTopOutput(self):
43c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    result_pprof_top_output = utils.ParsePprofTopOutput(self._pprof_top_file)
44c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    expected_pprof_top_output = {}
45c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
46c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    with open(self._pprof_top_csv_file) as input_file:
47c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu      statistics_reader = csv.DictReader(input_file, delimiter=',')
48c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
49c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu      for statistic in statistics_reader:
50c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        if statistic['file']:
51c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu          function_key = ','.join([statistic['function'], statistic['file']])
52c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        else:
53c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu          function_key = statistic['function']
54c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        expected_pprof_top_output[function_key] = \
55c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu            (statistic['flat'], statistic['flat_p'], statistic['sum_p'],
56c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu             statistic['cum'], statistic['cum_p'])
57c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
58c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self.assertDictEqual(result_pprof_top_output, expected_pprof_top_output)
59c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
60c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu  def testParsePProfTreeOutput(self):
61c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    result_pprof_tree_output = utils.ParsePprofTreeOutput(self._pprof_tree_file)
62c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    expected_pprof_tree_output = collections.defaultdict(dict)
63c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
64c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    with open(self._pprof_tree_csv_file) as input_file:
65c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu      statistics_reader = csv.DictReader(input_file, delimiter=',')
66c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
67c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu      for statistic in statistics_reader:
68c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        parent_function_key = \
69c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu            ','.join([statistic['parent_function'],
70c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu                      statistic['parent_function_file']])
71c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        child_function_key = \
72c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu            ','.join([statistic['child_function'],
73c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu                      statistic['child_function_file']])
74c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
75c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        expected_pprof_tree_output[parent_function_key][child_function_key] = \
76c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu            float(statistic['inclusive_count_fraction'])
77c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
78c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self.assertDictEqual(result_pprof_tree_output, expected_pprof_tree_output)
79c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
80c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu  def testParseCWPInclusiveCountFile(self):
81c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    expected_inclusive_statistics_test = \
82c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        {'func_i,/c/d/file_i': ('i', 5, 4.4, utils.EXTRA_FUNCTION),
83c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu         'func_j,/e/file_j': ('j', 6, 5.5, utils.EXTRA_FUNCTION),
84c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu         'func_f,/a/b/file_f': ('f', 4, 2.3, utils.EXTRA_FUNCTION),
85c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu         'func_h,/c/d/file_h': ('h', 1, 3.3, utils.EXTRA_FUNCTION),
86c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu         'func_k,/e/file_k': ('k', 7, 6.6, utils.EXTRA_FUNCTION),
87c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu         'func_g,/a/b/file_g': ('g', 2, 2.2, utils.EXTRA_FUNCTION)}
88c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    expected_inclusive_statistics_reference = \
89c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        {'func_i,/c/d/file_i': ('i', 5, 4.0, utils.EXTRA_FUNCTION),
90c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu         'func_j,/e/file_j': ('j', 6, 5.0, utils.EXTRA_FUNCTION),
91c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu         'func_f,/a/b/file_f': ('f', 1, 1.0, utils.EXTRA_FUNCTION),
92c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu         'func_l,/e/file_l': ('l', 7, 6.0, utils.EXTRA_FUNCTION),
93c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu         'func_h,/c/d/file_h': ('h', 4, 3.0, utils.EXTRA_FUNCTION),
94c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu         'func_g,/a/b/file_g': ('g', 5, 4.4, utils.EXTRA_FUNCTION)}
95c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    result_inclusive_statistics_test = \
96c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        utils.ParseCWPInclusiveCountFile(self._inclusive_count_test_file)
97c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    result_inclusive_statistics_reference = \
98c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        utils.ParseCWPInclusiveCountFile(self._inclusive_count_reference_file)
99c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
100c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self.assertDictEqual(result_inclusive_statistics_test,
101c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu                         expected_inclusive_statistics_test)
102c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self.assertDictEqual(result_inclusive_statistics_reference,
103c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu                         expected_inclusive_statistics_reference)
104c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
105c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu  def testParseCWPPairwiseInclusiveCountFile(self):
106c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    expected_pairwise_inclusive_statistics_test = {
107c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        'func_f': {'func_g,/a/b/file_g2': 0.01,
108c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu                   'func_h,/c/d/file_h': 0.02,
109c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu                   'func_i,/c/d/file_i': 0.03},
110c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        'func_g': {'func_j,/e/file_j': 0.4,
111c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu                   'func_m,/e/file_m': 0.6}
112c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    }
113c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    expected_pairwise_inclusive_statistics_reference = {
114c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        'func_f': {'func_g,/a/b/file_g': 0.1,
115c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu                   'func_h,/c/d/file_h': 0.2,
116c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu                   'func_i,/c/d/file_i': 0.3},
117c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        'func_g': {'func_j,/e/file_j': 0.4}
118c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    }
119c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    result_pairwise_inclusive_statistics_test = \
120c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        utils.ParseCWPPairwiseInclusiveCountFile(
121c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu            self._pairwise_inclusive_count_test_file)
122c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    result_pairwise_inclusive_statistics_reference = \
123c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu        utils.ParseCWPPairwiseInclusiveCountFile(
124c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu            self._pairwise_inclusive_count_reference_file)
125c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
126c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self.assertDictEqual(result_pairwise_inclusive_statistics_test,
127c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu                         expected_pairwise_inclusive_statistics_test)
128c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu    self.assertDictEqual(result_pairwise_inclusive_statistics_reference,
129c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu                         expected_pairwise_inclusive_statistics_reference)
130c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
131c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu
132c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescuif __name__ == '__main__':
133c7faa09f456ca5c651ac373ad897aa4be6ad2717Evelina Dumitrescu  unittest.main()
134