• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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