blob: 2c404d62c567d1fb978a6a44aaa8b1f6ccd844f2 [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2022 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for check_clang_diags."""
import unittest
from unittest import mock
from cros_utils import bugs
import check_clang_diags
# pylint: disable=protected-access
class Test(unittest.TestCase):
"""Test class."""
def test_process_new_diagnostics_ignores_new_tools(self):
new_state, new_diags = check_clang_diags._process_new_diagnostics(
old={},
new={'clang': ['-Wone', '-Wtwo']},
)
self.assertEqual(new_state, {'clang': ['-Wone', '-Wtwo']})
self.assertEqual(new_diags, {})
def test_process_new_diagnostics_is_a_nop_when_no_changes(self):
new_state, new_diags = check_clang_diags._process_new_diagnostics(
old={'clang': ['-Wone', '-Wtwo']},
new={'clang': ['-Wone', '-Wtwo']},
)
self.assertEqual(new_state, {'clang': ['-Wone', '-Wtwo']})
self.assertEqual(new_diags, {})
def test_process_new_diagnostics_ignores_removals_and_readds(self):
new_state, new_diags = check_clang_diags._process_new_diagnostics(
old={'clang': ['-Wone', '-Wtwo']},
new={'clang': ['-Wone']},
)
self.assertEqual(new_diags, {})
new_state, new_diags = check_clang_diags._process_new_diagnostics(
old=new_state,
new={'clang': ['-Wone', '-Wtwo']},
)
self.assertEqual(new_state, {'clang': ['-Wone', '-Wtwo']})
self.assertEqual(new_diags, {})
def test_process_new_diagnostics_complains_when_warnings_are_added(self):
new_state, new_diags = check_clang_diags._process_new_diagnostics(
old={'clang': ['-Wone']},
new={'clang': ['-Wone', '-Wtwo']},
)
self.assertEqual(new_state, {'clang': ['-Wone', '-Wtwo']})
self.assertEqual(new_diags, {'clang': ['-Wtwo']})
@mock.patch.object(bugs, 'CreateNewBug')
def test_bugs_are_created_as_expected(self, create_new_bug_mock):
check_clang_diags._file_bugs_for_new_diags({
'clang': ['-Wone'],
'clang-tidy': ['bugprone-foo'],
})
expected_calls = [
mock.call(
component_id=bugs.WellKnownComponents.CrOSToolchainPublic,
title='Investigate clang check `-Wone`',
body='\n'.join((
'It seems that the `-Wone` check was recently added to clang.',
"It's probably good to TAL at whether this check would be good",
'for us to enable in e.g., platform2, or across ChromeOS.',
)),
assignee=check_clang_diags._DEFAULT_ASSIGNEE,
cc=check_clang_diags._DEFAULT_CCS,
),
mock.call(
component_id=bugs.WellKnownComponents.CrOSToolchainPublic,
title='Investigate clang-tidy check `bugprone-foo`',
body='\n'.join((
'It seems that the `bugprone-foo` check was recently added to '
'clang-tidy.',
"It's probably good to TAL at whether this check would be good",
'for us to enable in e.g., platform2, or across ChromeOS.',
)),
assignee=check_clang_diags._DEFAULT_ASSIGNEE,
cc=check_clang_diags._DEFAULT_CCS,
),
]
# Don't assertEqual the lists, since the diff is really hard to read for
# that.
for actual, expected in zip(create_new_bug_mock.call_args_list,
expected_calls):
self.assertEqual(actual, expected)
self.assertEqual(len(create_new_bug_mock.call_args_list),
len(expected_calls))
if __name__ == '__main__':
unittest.main()