# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Unit tests for code_coverage_utils_test.py.""" # pylint: disable=protected-access import os import tempfile import unittest from pylib.utils import code_coverage_utils from py_utils import tempfile_ext import mock # pylint: disable=import-error class MockDevicePathExists: def __init__(self, value): self._path_exists = value def PathExists(self, directory, retries): # pylint: disable=unused-argument return self._path_exists class CodeCoverageUtilsTest(unittest.TestCase): @mock.patch('subprocess.check_output') def testMergeCoverageFiles(self, mock_sub): with tempfile_ext.NamedTemporaryDirectory() as cov_tempd: pro_tempd = os.path.join(cov_tempd, 'profraw') os.mkdir(pro_tempd) profdata = tempfile.NamedTemporaryFile( dir=pro_tempd, delete=False, suffix=code_coverage_utils._PROFRAW_FILE_EXTENSION) code_coverage_utils.MergeClangCoverageFiles(cov_tempd, pro_tempd) # Merged file should be deleted. self.assertFalse(os.path.exists(profdata.name)) self.assertTrue(mock_sub.called) @mock.patch('os.path.isfile', return_value=True) @mock.patch('shutil.rmtree') @mock.patch('pylib.utils.code_coverage_utils.PullClangCoverageFiles') @mock.patch('pylib.utils.code_coverage_utils.MergeClangCoverageFiles') def testPullAndMaybeMergeClangCoverageFiles(self, mock_merge_function, mock_pull_function, mock_rmtree, _): mock_device = MockDevicePathExists(True) code_coverage_utils.PullAndMaybeMergeClangCoverageFiles( mock_device, 'device_coverage_dir', 'output_dir', 'output_subfolder_name') mock_pull_function.assert_called_with(mock_device, 'device_coverage_dir', 'output_dir/output_subfolder_name') mock_merge_function.assert_called_with( 'output_dir', 'output_dir/output_subfolder_name/device_coverage_dir') self.assertTrue(mock_rmtree.called) @mock.patch('os.path.isfile', return_value=True) @mock.patch('shutil.rmtree') @mock.patch('pylib.utils.code_coverage_utils.PullClangCoverageFiles') @mock.patch('pylib.utils.code_coverage_utils.MergeClangCoverageFiles') def testPullAndMaybeMergeClangCoverageFilesNoPull(self, mock_merge_function, mock_pull_function, mock_rmtree, _): mock_device = MockDevicePathExists(False) code_coverage_utils.PullAndMaybeMergeClangCoverageFiles( mock_device, 'device_coverage_dir', 'output_dir', 'output_subfolder_name') self.assertFalse(mock_pull_function.called) self.assertFalse(mock_merge_function.called) self.assertFalse(mock_rmtree.called) @mock.patch('os.path.isfile', return_value=False) @mock.patch('shutil.rmtree') @mock.patch('pylib.utils.code_coverage_utils.PullClangCoverageFiles') @mock.patch('pylib.utils.code_coverage_utils.MergeClangCoverageFiles') def testPullAndMaybeMergeClangCoverageFilesNoMerge(self, mock_merge_function, mock_pull_function, mock_rmtree, _): mock_device = MockDevicePathExists(True) code_coverage_utils.PullAndMaybeMergeClangCoverageFiles( mock_device, 'device_coverage_dir', 'output_dir', 'output_subfolder_name') mock_pull_function.assert_called_with(mock_device, 'device_coverage_dir', 'output_dir/output_subfolder_name') self.assertFalse(mock_merge_function.called) self.assertFalse(mock_rmtree.called) if __name__ == '__main__': unittest.main(verbosity=2)