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