1# Copyright 2023 The Chromium Authors 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4"""Unit tests for code_coverage_utils_test.py.""" 5 6# pylint: disable=protected-access 7 8import os 9import tempfile 10import unittest 11 12from pylib.utils import code_coverage_utils 13from py_utils import tempfile_ext 14 15import mock # pylint: disable=import-error 16 17 18class MockDevicePathExists: 19 def __init__(self, value): 20 self._path_exists = value 21 22 def PathExists(self, directory, retries): # pylint: disable=unused-argument 23 return self._path_exists 24 25 26class CodeCoverageUtilsTest(unittest.TestCase): 27 @mock.patch('subprocess.check_output') 28 def testMergeCoverageFiles(self, mock_sub): 29 with tempfile_ext.NamedTemporaryDirectory() as cov_tempd: 30 pro_tempd = os.path.join(cov_tempd, 'profraw') 31 os.mkdir(pro_tempd) 32 profdata = tempfile.NamedTemporaryFile( 33 dir=pro_tempd, 34 delete=False, 35 suffix=code_coverage_utils._PROFRAW_FILE_EXTENSION) 36 code_coverage_utils.MergeClangCoverageFiles(cov_tempd, pro_tempd) 37 # Merged file should be deleted. 38 self.assertFalse(os.path.exists(profdata.name)) 39 self.assertTrue(mock_sub.called) 40 41 @mock.patch('os.path.isfile', return_value=True) 42 @mock.patch('shutil.rmtree') 43 @mock.patch('pylib.utils.code_coverage_utils.PullClangCoverageFiles') 44 @mock.patch('pylib.utils.code_coverage_utils.MergeClangCoverageFiles') 45 def testPullAndMaybeMergeClangCoverageFiles(self, mock_merge_function, 46 mock_pull_function, mock_rmtree, 47 _): 48 mock_device = MockDevicePathExists(True) 49 code_coverage_utils.PullAndMaybeMergeClangCoverageFiles( 50 mock_device, 'device_coverage_dir', 'output_dir', 51 'output_subfolder_name') 52 mock_pull_function.assert_called_with(mock_device, 'device_coverage_dir', 53 'output_dir/output_subfolder_name') 54 mock_merge_function.assert_called_with( 55 'output_dir', 'output_dir/output_subfolder_name/device_coverage_dir') 56 self.assertTrue(mock_rmtree.called) 57 58 @mock.patch('os.path.isfile', return_value=True) 59 @mock.patch('shutil.rmtree') 60 @mock.patch('pylib.utils.code_coverage_utils.PullClangCoverageFiles') 61 @mock.patch('pylib.utils.code_coverage_utils.MergeClangCoverageFiles') 62 def testPullAndMaybeMergeClangCoverageFilesNoPull(self, mock_merge_function, 63 mock_pull_function, 64 mock_rmtree, _): 65 mock_device = MockDevicePathExists(False) 66 code_coverage_utils.PullAndMaybeMergeClangCoverageFiles( 67 mock_device, 'device_coverage_dir', 'output_dir', 68 'output_subfolder_name') 69 self.assertFalse(mock_pull_function.called) 70 self.assertFalse(mock_merge_function.called) 71 self.assertFalse(mock_rmtree.called) 72 73 @mock.patch('os.path.isfile', return_value=False) 74 @mock.patch('shutil.rmtree') 75 @mock.patch('pylib.utils.code_coverage_utils.PullClangCoverageFiles') 76 @mock.patch('pylib.utils.code_coverage_utils.MergeClangCoverageFiles') 77 def testPullAndMaybeMergeClangCoverageFilesNoMerge(self, mock_merge_function, 78 mock_pull_function, 79 mock_rmtree, _): 80 mock_device = MockDevicePathExists(True) 81 code_coverage_utils.PullAndMaybeMergeClangCoverageFiles( 82 mock_device, 'device_coverage_dir', 'output_dir', 83 'output_subfolder_name') 84 mock_pull_function.assert_called_with(mock_device, 'device_coverage_dir', 85 'output_dir/output_subfolder_name') 86 self.assertFalse(mock_merge_function.called) 87 self.assertFalse(mock_rmtree.called) 88 89 90if __name__ == '__main__': 91 unittest.main(verbosity=2) 92