Formatting: Format all python code with black.
This CL is probably not what you're looking for, it's only
automated formatting. Ignore it with
`git blame --ignore-rev <revision>` for this commit.
BUG=b:233893248
TEST=CQ
Change-Id: I66591d7a738d241aed3290138c0f68065ab10a6d
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/3879174
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Tested-by: Alex Klein <saklein@chromium.org>
diff --git a/scripts/tricium_clang_tidy_unittest.py b/scripts/tricium_clang_tidy_unittest.py
index c0791fe..9fe83d7 100644
--- a/scripts/tricium_clang_tidy_unittest.py
+++ b/scripts/tricium_clang_tidy_unittest.py
@@ -20,477 +20,531 @@
class Replacement(NamedTuple):
- """A YAML `tricium_clang_tidy.TidyReplacement`.
+ """A YAML `tricium_clang_tidy.TidyReplacement`.
- The data contained in YAML is slightly different than what `TidyReplacement`s
- carry.
- """
- file_path: str
- text: str
- offset: int
- length: int
+ The data contained in YAML is slightly different than what `TidyReplacement`s
+ carry.
+ """
+
+ file_path: str
+ text: str
+ offset: int
+ length: int
class Note(NamedTuple):
- """A clang-tidy `note` from the YAML file."""
- message: str
- file_path: str
- file_offset: int
+ """A clang-tidy `note` from the YAML file."""
+
+ message: str
+ file_path: str
+ file_offset: int
-def default_tidy_diagnostic(file_path='/tidy/file.c',
- line_number=1,
- diag_name='${diag_name}',
- message='${message}',
- replacements=(),
- expansion_locs=()):
- """Creates a TidyDiagnostic with reasonable defaults.
+def default_tidy_diagnostic(
+ file_path="/tidy/file.c",
+ line_number=1,
+ diag_name="${diag_name}",
+ message="${message}",
+ replacements=(),
+ expansion_locs=(),
+):
+ """Creates a TidyDiagnostic with reasonable defaults.
- Defaults here and yaml_diagnostic are generally intended to match where
- possible.
- """
- return tricium_clang_tidy.TidyDiagnostic(
- file_path=file_path,
- line_number=line_number,
- diag_name=diag_name,
- message=message,
- replacements=replacements,
- expansion_locs=expansion_locs)
+ Defaults here and yaml_diagnostic are generally intended to match where
+ possible.
+ """
+ return tricium_clang_tidy.TidyDiagnostic(
+ file_path=file_path,
+ line_number=line_number,
+ diag_name=diag_name,
+ message=message,
+ replacements=replacements,
+ expansion_locs=expansion_locs,
+ )
-def yaml_diagnostic(name='${diag_name}',
- message='${message}',
- file_path='/tidy/file.c',
- file_offset=1,
- replacements=(),
- notes=()):
- """Creates a diagnostic serializable as YAML with reasonable defaults."""
- result = {
- 'DiagnosticName': name,
- 'DiagnosticMessage': {
- 'Message': message,
- 'FilePath': file_path,
- 'FileOffset': file_offset,
- },
- }
+def yaml_diagnostic(
+ name="${diag_name}",
+ message="${message}",
+ file_path="/tidy/file.c",
+ file_offset=1,
+ replacements=(),
+ notes=(),
+):
+ """Creates a diagnostic serializable as YAML with reasonable defaults."""
+ result = {
+ "DiagnosticName": name,
+ "DiagnosticMessage": {
+ "Message": message,
+ "FilePath": file_path,
+ "FileOffset": file_offset,
+ },
+ }
- if replacements:
- result['DiagnosticMessage']['Replacements'] = [{
- 'FilePath': x.file_path,
- 'Offset': x.offset,
- 'Length': x.length,
- 'ReplacementText': x.text,
- } for x in replacements]
+ if replacements:
+ result["DiagnosticMessage"]["Replacements"] = [
+ {
+ "FilePath": x.file_path,
+ "Offset": x.offset,
+ "Length": x.length,
+ "ReplacementText": x.text,
+ }
+ for x in replacements
+ ]
- if notes:
- result['Notes'] = [{
- 'Message': x.message,
- 'FilePath': x.file_path,
- 'FileOffset': x.file_offset,
- } for x in notes]
+ if notes:
+ result["Notes"] = [
+ {
+ "Message": x.message,
+ "FilePath": x.file_path,
+ "FileOffset": x.file_offset,
+ }
+ for x in notes
+ ]
- return result
+ return result
def mocked_nop_realpath(f):
- """Mocks os.path.realpath to just return its argument."""
+ """Mocks os.path.realpath to just return its argument."""
- @mock.patch.object(os.path, 'realpath')
- @mock.patch.object(Path, 'resolve')
- def inner(self, replace_mock, realpath_mock, *args, **kwargs):
- """Mocker for realpath."""
- identity = lambda x: x
- realpath_mock.side_effect = identity
- replace_mock.side_effect = identity
- return f(self, *args, **kwargs)
+ @mock.patch.object(os.path, "realpath")
+ @mock.patch.object(Path, "resolve")
+ def inner(self, replace_mock, realpath_mock, *args, **kwargs):
+ """Mocker for realpath."""
+ identity = lambda x: x
+ realpath_mock.side_effect = identity
+ replace_mock.side_effect = identity
+ return f(self, *args, **kwargs)
- return inner
+ return inner
def mocked_readonly_open(contents=None, default=None):
- """Mocks out open() so it always returns things from |contents|.
+ """Mocks out open() so it always returns things from |contents|.
- Writing to open'ed files is not supported.
+ Writing to open'ed files is not supported.
- Args:
- contents: a |dict| mapping |file_path| => file_contents.
- default: a default string to return if the given |file_path| doesn't
- exist in |contents|.
+ Args:
+ contents: a |dict| mapping |file_path| => file_contents.
+ default: a default string to return if the given |file_path| doesn't
+ exist in |contents|.
- Returns:
- |contents[file_path]| if it exists; otherwise, |default|.
+ Returns:
+ |contents[file_path]| if it exists; otherwise, |default|.
- Raises:
- If |default| is None and |contents[file_path]| does not exist, this will
- raise a |ValueError|.
- """
+ Raises:
+ If |default| is None and |contents[file_path]| does not exist, this will
+ raise a |ValueError|.
+ """
- if contents is None:
- contents = {}
+ if contents is None:
+ contents = {}
- def inner(f):
- """mocked_open impl."""
+ def inner(f):
+ """mocked_open impl."""
- @mock.mock_open()
- def inner_inner(self, open_mock, *args, **kwargs):
- """the impl of mocked_readonly_open's impl!"""
+ @mock.mock_open()
+ def inner_inner(self, open_mock, *args, **kwargs):
+ """the impl of mocked_readonly_open's impl!"""
- def get_data(file_path, mode='r', encoding=None):
- """the impl of the impl of mocked_readonly_open's impl!!"""
- data = contents.get(file_path, default)
- if data is None:
- raise ValueError('No %r file was found; options were %r' %
- (file_path, sorted(contents.keys())))
+ def get_data(file_path, mode="r", encoding=None):
+ """the impl of the impl of mocked_readonly_open's impl!!"""
+ data = contents.get(file_path, default)
+ if data is None:
+ raise ValueError(
+ "No %r file was found; options were %r"
+ % (file_path, sorted(contents.keys()))
+ )
- assert mode == 'r', f"File mode {mode} isn't supported."
- if encoding is None:
- return io.BytesIO(data)
- return io.StringIO(data)
+ assert mode == "r", f"File mode {mode} isn't supported."
+ if encoding is None:
+ return io.BytesIO(data)
+ return io.StringIO(data)
- open_mock.side_effect = get_data
+ open_mock.side_effect = get_data
- def get_data_stream(file_path):
- return io.StringIO(get_data(file_path))
+ def get_data_stream(file_path):
+ return io.StringIO(get_data(file_path))
- open_mock.side_effect = get_data_stream
- return f(self, *args, **kwargs)
+ open_mock.side_effect = get_data_stream
+ return f(self, *args, **kwargs)
- return inner_inner
+ return inner_inner
- return inner
+ return inner
class TriciumClangTidyTests(cros_test_lib.MockTestCase):
- """Various tests for tricium support."""
+ """Various tests for tricium support."""
- def test_tidy_diagnostic_path_normalization(self):
- expanded_from = tricium_clang_tidy.TidyExpandedFrom(
- file_path=Path('/old2/foo'),
- line_number=2,
- )
- diag = default_tidy_diagnostic(
- file_path=Path('/old/foo'),
- expansion_locs=(expanded_from,),
- )
+ def test_tidy_diagnostic_path_normalization(self):
+ expanded_from = tricium_clang_tidy.TidyExpandedFrom(
+ file_path=Path("/old2/foo"),
+ line_number=2,
+ )
+ diag = default_tidy_diagnostic(
+ file_path=Path("/old/foo"),
+ expansion_locs=(expanded_from,),
+ )
- normalized = diag.normalize_paths_to('/new')
- self.assertEqual(
- normalized,
- diag._replace(
- file_path=Path('../old/foo'),
- expansion_locs=(expanded_from._replace(
- file_path=Path('../old2/foo')),),
- ),
- )
-
- def test_line_offest_map_works(self):
- # (input_char, line_number_of_char, line_offset_of_char)
- line_offset_pairs = [
- ('a', 1, 0),
- ('b', 1, 1),
- ('\n', 1, 2),
- ('c', 2, 0),
- ('\n', 2, 1),
- ('\n', 3, 0),
- ('d', 4, 0),
- ('', 4, 1),
- ('', 4, 2),
- ]
- text = tricium_clang_tidy.LineOffsetMap.for_text(''.join(
- x for x, _, _ in line_offset_pairs))
- for offset, (_, line_number, line_offset) in enumerate(line_offset_pairs):
- self.assertEqual(text.get_line_number(offset), line_number)
- self.assertEqual(text.get_line_offset(offset), line_offset)
-
- def test_package_ebuild_resolution(self):
- run_mock = self.StartPatcher(cros_test_lib.RunCommandMock())
- run_mock.SetDefaultCmdResult(stdout='${package1_ebuild}\n')
- ebuilds = tricium_clang_tidy.resolve_package_ebuilds(
- '${board}',
- [
- 'package1',
- 'package2.ebuild',
- ],
- )
-
- run_mock.assertCommandContains(['equery-${board}', 'w', 'package1'],
- check=True,
- stdout=subprocess.PIPE,
- encoding='utf-8')
- self.assertEqual(ebuilds, ['${package1_ebuild}', 'package2.ebuild'])
-
- @mocked_readonly_open(default='')
- def test_parse_tidy_invocation_returns_exception_on_error(
- self, read_file_mock):
- oh_no = ValueError('${oh_no}!')
- read_file_mock.side_effect = oh_no
- result = tricium_clang_tidy.parse_tidy_invocation(
- Path('/some/file/that/doesnt/exist.json'))
- self.assertIn(str(oh_no), str(result))
-
- @mocked_readonly_open({
- '/file/path.json':
- json.dumps({
- 'exit_code': 1,
- 'executable': '${clang_tidy}',
- 'args': ['foo', 'bar'],
- 'lint_target': '${target}',
- 'stdstreams': 'brrrrrrr',
- 'wd': '/path/to/wd',
- }),
- # |yaml.dumps| doesn't exist, but json parses cleanly as yaml, so...
- '/file/path.yaml':
- json.dumps({
- 'Diagnostics': [
- yaml_diagnostic(
- name='some-diag',
- message='${message}',
- file_path='',
- ),
- ]
- }),
- })
- def test_parse_tidy_invocation_functions_on_success(self):
- result = tricium_clang_tidy.parse_tidy_invocation('/file/path.json')
- # If we got an |Exception|, print it out.
- self.assertNotIsInstance(result, tricium_clang_tidy.Error)
- meta, info = result
- self.assertEqual(
- meta,
- tricium_clang_tidy.InvocationMetadata(
- exit_code=1,
- invocation=['${clang_tidy}', 'foo', 'bar'],
- lint_target='${target}',
- stdstreams='brrrrrrr',
- wd='/path/to/wd',
- ),
- )
-
- self.assertEqual(
- info,
- [
- default_tidy_diagnostic(
- diag_name='some-diag',
- message='${message}',
- file_path='',
+ normalized = diag.normalize_paths_to("/new")
+ self.assertEqual(
+ normalized,
+ diag._replace(
+ file_path=Path("../old/foo"),
+ expansion_locs=(
+ expanded_from._replace(file_path=Path("../old2/foo")),
+ ),
),
- ],
- )
+ )
- @mocked_nop_realpath
- @mocked_readonly_open(default='')
- def test_parse_fixes_file_absolutizes_paths(self):
- results = tricium_clang_tidy.parse_tidy_fixes_file(
- '/tidy', {
- 'Diagnostics': [
- yaml_diagnostic(file_path='foo.c'),
- yaml_diagnostic(file_path='/tidy/bar.c'),
- yaml_diagnostic(file_path=''),
+ def test_line_offest_map_works(self):
+ # (input_char, line_number_of_char, line_offset_of_char)
+ line_offset_pairs = [
+ ("a", 1, 0),
+ ("b", 1, 1),
+ ("\n", 1, 2),
+ ("c", 2, 0),
+ ("\n", 2, 1),
+ ("\n", 3, 0),
+ ("d", 4, 0),
+ ("", 4, 1),
+ ("", 4, 2),
+ ]
+ text = tricium_clang_tidy.LineOffsetMap.for_text(
+ "".join(x for x, _, _ in line_offset_pairs)
+ )
+ for offset, (_, line_number, line_offset) in enumerate(
+ line_offset_pairs
+ ):
+ self.assertEqual(text.get_line_number(offset), line_number)
+ self.assertEqual(text.get_line_offset(offset), line_offset)
+
+ def test_package_ebuild_resolution(self):
+ run_mock = self.StartPatcher(cros_test_lib.RunCommandMock())
+ run_mock.SetDefaultCmdResult(stdout="${package1_ebuild}\n")
+ ebuilds = tricium_clang_tidy.resolve_package_ebuilds(
+ "${board}",
+ [
+ "package1",
+ "package2.ebuild",
],
- })
- file_paths = [x.file_path for x in results]
- self.assertEqual(file_paths, ['/tidy/foo.c', '/tidy/bar.c', ''])
+ )
- @mocked_nop_realpath
- @mocked_readonly_open({
- '/tidy/foo.c': '',
- '/tidy/foo.h': 'a\n\n',
- })
- def test_parse_fixes_file_interprets_offsets_correctly(self):
- results = tricium_clang_tidy.parse_tidy_fixes_file(
- '/tidy', {
- 'Diagnostics': [
- yaml_diagnostic(file_path='/tidy/foo.c', file_offset=1),
- yaml_diagnostic(file_path='/tidy/foo.c', file_offset=2),
- yaml_diagnostic(file_path='/tidy/foo.h', file_offset=1),
- yaml_diagnostic(file_path='/tidy/foo.h', file_offset=2),
- yaml_diagnostic(file_path='/tidy/foo.h', file_offset=3),
+ run_mock.assertCommandContains(
+ ["equery-${board}", "w", "package1"],
+ check=True,
+ stdout=subprocess.PIPE,
+ encoding="utf-8",
+ )
+ self.assertEqual(ebuilds, ["${package1_ebuild}", "package2.ebuild"])
+
+ @mocked_readonly_open(default="")
+ def test_parse_tidy_invocation_returns_exception_on_error(
+ self, read_file_mock
+ ):
+ oh_no = ValueError("${oh_no}!")
+ read_file_mock.side_effect = oh_no
+ result = tricium_clang_tidy.parse_tidy_invocation(
+ Path("/some/file/that/doesnt/exist.json")
+ )
+ self.assertIn(str(oh_no), str(result))
+
+ @mocked_readonly_open(
+ {
+ "/file/path.json": json.dumps(
+ {
+ "exit_code": 1,
+ "executable": "${clang_tidy}",
+ "args": ["foo", "bar"],
+ "lint_target": "${target}",
+ "stdstreams": "brrrrrrr",
+ "wd": "/path/to/wd",
+ }
+ ),
+ # |yaml.dumps| doesn't exist, but json parses cleanly as yaml, so...
+ "/file/path.yaml": json.dumps(
+ {
+ "Diagnostics": [
+ yaml_diagnostic(
+ name="some-diag",
+ message="${message}",
+ file_path="",
+ ),
+ ]
+ }
+ ),
+ }
+ )
+ def test_parse_tidy_invocation_functions_on_success(self):
+ result = tricium_clang_tidy.parse_tidy_invocation("/file/path.json")
+ # If we got an |Exception|, print it out.
+ self.assertNotIsInstance(result, tricium_clang_tidy.Error)
+ meta, info = result
+ self.assertEqual(
+ meta,
+ tricium_clang_tidy.InvocationMetadata(
+ exit_code=1,
+ invocation=["${clang_tidy}", "foo", "bar"],
+ lint_target="${target}",
+ stdstreams="brrrrrrr",
+ wd="/path/to/wd",
+ ),
+ )
+
+ self.assertEqual(
+ info,
+ [
+ default_tidy_diagnostic(
+ diag_name="some-diag",
+ message="${message}",
+ file_path="",
+ ),
],
- })
- file_locations = [(x.file_path, x.line_number) for x in results]
- self.assertEqual(file_locations, [
- ('/tidy/foo.c', 1),
- ('/tidy/foo.c', 1),
- ('/tidy/foo.h', 1),
- ('/tidy/foo.h', 2),
- ('/tidy/foo.h', 3),
- ])
+ )
- @mocked_nop_realpath
- @mocked_readonly_open({'/tidy/foo.c': 'a \n\n'})
- def test_parse_fixes_file_handles_replacements(self):
- results = list(
- tricium_clang_tidy.parse_tidy_fixes_file(
- '/tidy', {
- 'Diagnostics': [
- yaml_diagnostic(
- file_path='/tidy/foo.c',
- file_offset=1,
- replacements=[
- Replacement(
- file_path='foo.c',
- text='whee',
- offset=2,
- length=2,
- ),
- ],
- ),
+ @mocked_nop_realpath
+ @mocked_readonly_open(default="")
+ def test_parse_fixes_file_absolutizes_paths(self):
+ results = tricium_clang_tidy.parse_tidy_fixes_file(
+ "/tidy",
+ {
+ "Diagnostics": [
+ yaml_diagnostic(file_path="foo.c"),
+ yaml_diagnostic(file_path="/tidy/bar.c"),
+ yaml_diagnostic(file_path=""),
],
- }))
- self.assertEqual(len(results), 1, results)
- self.assertEqual(
- results[0].replacements,
- (tricium_clang_tidy.TidyReplacement(
- new_text='whee',
- start_line=1,
- end_line=3,
- start_char=2,
- end_char=0,
- ),),
- )
+ },
+ )
+ file_paths = [x.file_path for x in results]
+ self.assertEqual(file_paths, ["/tidy/foo.c", "/tidy/bar.c", ""])
- @mocked_nop_realpath
- @mocked_readonly_open({'/whee.c': '', '/whee.h': '\n\n'})
- def test_parse_fixes_file_handles_macro_expansions(self):
- results = list(
- tricium_clang_tidy.parse_tidy_fixes_file(
- '/tidy', {
- 'Diagnostics': [
- yaml_diagnostic(
- file_path='/whee.c',
- file_offset=1,
- notes=[
- Note(
- message='not relevant',
- file_path='/whee.c',
- file_offset=1,
- ),
- Note(
- message='expanded from macro "Foo"',
- file_path='/whee.h',
- file_offset=9,
- ),
- ],
- ),
+ @mocked_nop_realpath
+ @mocked_readonly_open(
+ {
+ "/tidy/foo.c": "",
+ "/tidy/foo.h": "a\n\n",
+ }
+ )
+ def test_parse_fixes_file_interprets_offsets_correctly(self):
+ results = tricium_clang_tidy.parse_tidy_fixes_file(
+ "/tidy",
+ {
+ "Diagnostics": [
+ yaml_diagnostic(file_path="/tidy/foo.c", file_offset=1),
+ yaml_diagnostic(file_path="/tidy/foo.c", file_offset=2),
+ yaml_diagnostic(file_path="/tidy/foo.h", file_offset=1),
+ yaml_diagnostic(file_path="/tidy/foo.h", file_offset=2),
+ yaml_diagnostic(file_path="/tidy/foo.h", file_offset=3),
],
- }))
- self.assertEqual(len(results), 1, results)
- self.assertEqual(
- results[0].expansion_locs,
- (tricium_clang_tidy.TidyExpandedFrom(
- file_path='/whee.h',
- line_number=3,
- ),),
- )
+ },
+ )
+ file_locations = [(x.file_path, x.line_number) for x in results]
+ self.assertEqual(
+ file_locations,
+ [
+ ("/tidy/foo.c", 1),
+ ("/tidy/foo.c", 1),
+ ("/tidy/foo.h", 1),
+ ("/tidy/foo.h", 2),
+ ("/tidy/foo.h", 3),
+ ],
+ )
- @mock.patch.object(Path, 'glob')
- @mock.patch.object(tricium_clang_tidy, 'parse_tidy_invocation')
- def test_collect_lints_functions(self, parse_invocation_mock, glob_mock):
- glob_mock.return_value = ('/lint/foo.json', '/lint/bar.json')
+ @mocked_nop_realpath
+ @mocked_readonly_open({"/tidy/foo.c": "a \n\n"})
+ def test_parse_fixes_file_handles_replacements(self):
+ results = list(
+ tricium_clang_tidy.parse_tidy_fixes_file(
+ "/tidy",
+ {
+ "Diagnostics": [
+ yaml_diagnostic(
+ file_path="/tidy/foo.c",
+ file_offset=1,
+ replacements=[
+ Replacement(
+ file_path="foo.c",
+ text="whee",
+ offset=2,
+ length=2,
+ ),
+ ],
+ ),
+ ],
+ },
+ )
+ )
+ self.assertEqual(len(results), 1, results)
+ self.assertEqual(
+ results[0].replacements,
+ (
+ tricium_clang_tidy.TidyReplacement(
+ new_text="whee",
+ start_line=1,
+ end_line=3,
+ start_char=2,
+ end_char=0,
+ ),
+ ),
+ )
- diag_1 = default_tidy_diagnostic()
- diag_2 = diag_1._replace(line_number=diag_1.line_number + 1)
- diag_3 = diag_2._replace(line_number=diag_2.line_number + 1)
+ @mocked_nop_realpath
+ @mocked_readonly_open({"/whee.c": "", "/whee.h": "\n\n"})
+ def test_parse_fixes_file_handles_macro_expansions(self):
+ results = list(
+ tricium_clang_tidy.parse_tidy_fixes_file(
+ "/tidy",
+ {
+ "Diagnostics": [
+ yaml_diagnostic(
+ file_path="/whee.c",
+ file_offset=1,
+ notes=[
+ Note(
+ message="not relevant",
+ file_path="/whee.c",
+ file_offset=1,
+ ),
+ Note(
+ message='expanded from macro "Foo"',
+ file_path="/whee.h",
+ file_offset=9,
+ ),
+ ],
+ ),
+ ],
+ },
+ )
+ )
+ self.assertEqual(len(results), 1, results)
+ self.assertEqual(
+ results[0].expansion_locs,
+ (
+ tricium_clang_tidy.TidyExpandedFrom(
+ file_path="/whee.h",
+ line_number=3,
+ ),
+ ),
+ )
- # Because we want to test unique'ing, ensure these aren't equal.
- all_diags = [diag_1, diag_2, diag_3]
- self.assertEqual(sorted(all_diags), sorted(set(all_diags)))
+ @mock.patch.object(Path, "glob")
+ @mock.patch.object(tricium_clang_tidy, "parse_tidy_invocation")
+ def test_collect_lints_functions(self, parse_invocation_mock, glob_mock):
+ glob_mock.return_value = ("/lint/foo.json", "/lint/bar.json")
- per_file_lints = {
- '/lint/foo.json': {diag_1, diag_2},
- '/lint/bar.json': {diag_2, diag_3},
- }
+ diag_1 = default_tidy_diagnostic()
+ diag_2 = diag_1._replace(line_number=diag_1.line_number + 1)
+ diag_3 = diag_2._replace(line_number=diag_2.line_number + 1)
- def parse_invocation_side_effect(json_file):
- self.assertIn(json_file, per_file_lints)
- meta = mock.Mock()
- meta.exit_code = 0
- return meta, per_file_lints[json_file]
+ # Because we want to test unique'ing, ensure these aren't equal.
+ all_diags = [diag_1, diag_2, diag_3]
+ self.assertEqual(sorted(all_diags), sorted(set(all_diags)))
- parse_invocation_mock.side_effect = parse_invocation_side_effect
+ per_file_lints = {
+ "/lint/foo.json": {diag_1, diag_2},
+ "/lint/bar.json": {diag_2, diag_3},
+ }
- with multiprocessing.pool.ThreadPool(1) as yaml_pool:
- lints = tricium_clang_tidy.collect_lints(Path('/lint'), yaml_pool)
+ def parse_invocation_side_effect(json_file):
+ self.assertIn(json_file, per_file_lints)
+ meta = mock.Mock()
+ meta.exit_code = 0
+ return meta, per_file_lints[json_file]
- self.assertEqual(set(all_diags), lints)
+ parse_invocation_mock.side_effect = parse_invocation_side_effect
- def test_filter_tidy_lints_filters_nothing_by_default(self):
- basis = default_tidy_diagnostic()
- diag2 = default_tidy_diagnostic(line_number=basis.line_number + 1)
- diags = [basis, diag2]
- diags.sort()
+ with multiprocessing.pool.ThreadPool(1) as yaml_pool:
+ lints = tricium_clang_tidy.collect_lints(Path("/lint"), yaml_pool)
- self.assertEqual(
- diags,
- tricium_clang_tidy.filter_tidy_lints(
- only_files=None,
- git_repo_base=None,
- diags=diags,
- ),
- )
+ self.assertEqual(set(all_diags), lints)
- def test_filter_tidy_lints_filters_paths_outside_of_only_files(self):
- in_only_files = default_tidy_diagnostic(file_path='foo.c')
- out_of_only_files = default_tidy_diagnostic(file_path='bar.c')
- self.assertEqual(
- [in_only_files],
- tricium_clang_tidy.filter_tidy_lints(
- only_files={Path('foo.c')},
- git_repo_base=None,
- diags=[in_only_files, out_of_only_files],
- ),
- )
+ def test_filter_tidy_lints_filters_nothing_by_default(self):
+ basis = default_tidy_diagnostic()
+ diag2 = default_tidy_diagnostic(line_number=basis.line_number + 1)
+ diags = [basis, diag2]
+ diags.sort()
- def test_filter_tidy_lints_normalizes_to_git_repo_baes(self):
- git = default_tidy_diagnostic(file_path='/git/foo.c')
- nogit = default_tidy_diagnostic(file_path='/nogit/bar.c')
- self.assertEqual(
- [git.normalize_paths_to('/git')],
- tricium_clang_tidy.filter_tidy_lints(
- only_files=None,
- git_repo_base=Path('/git'),
- diags=[git, nogit],
- ),
- )
+ self.assertEqual(
+ diags,
+ tricium_clang_tidy.filter_tidy_lints(
+ only_files=None,
+ git_repo_base=None,
+ diags=diags,
+ ),
+ )
- def test_filter_tidy_lints_normalizes_and_restricts_properly(self):
- git_and_only = default_tidy_diagnostic(file_path='/git/foo.c')
- git_and_noonly = default_tidy_diagnostic(file_path='/git/bar.c')
- self.assertEqual(
- [git_and_only.normalize_paths_to('/git')],
- tricium_clang_tidy.filter_tidy_lints(
- only_files={Path('/git/foo.c')},
- git_repo_base=Path('/git'),
- diags=[git_and_only, git_and_noonly],
- ),
- )
+ def test_filter_tidy_lints_filters_paths_outside_of_only_files(self):
+ in_only_files = default_tidy_diagnostic(file_path="foo.c")
+ out_of_only_files = default_tidy_diagnostic(file_path="bar.c")
+ self.assertEqual(
+ [in_only_files],
+ tricium_clang_tidy.filter_tidy_lints(
+ only_files={Path("foo.c")},
+ git_repo_base=None,
+ diags=[in_only_files, out_of_only_files],
+ ),
+ )
- @mock.patch.object(osutils, 'CopyDirContents')
- @mock.patch.object(osutils, 'SafeMakedirs')
- def test_lint_generation_functions(self, safe_makedirs_mock,
- copy_dir_contents_mock):
- run_mock = self.StartPatcher(cros_test_lib.PopenMock())
- run_mock.SetDefaultCmdResult()
+ def test_filter_tidy_lints_normalizes_to_git_repo_baes(self):
+ git = default_tidy_diagnostic(file_path="/git/foo.c")
+ nogit = default_tidy_diagnostic(file_path="/nogit/bar.c")
+ self.assertEqual(
+ [git.normalize_paths_to("/git")],
+ tricium_clang_tidy.filter_tidy_lints(
+ only_files=None,
+ git_repo_base=Path("/git"),
+ diags=[git, nogit],
+ ),
+ )
- # Mock mkdtemp last, since PopenMock() makes a tempdir.
- mkdtemp_mock = self.PatchObject(tempfile, 'mkdtemp')
- mkdtemp_path = '/path/to/temp/dir'
- mkdtemp_mock.return_value = mkdtemp_path
- with mock.patch.object(osutils, 'RmDir') as rmdir_mock:
- dir_name = str(
- tricium_clang_tidy.generate_lints('${board}', '/path/to/the.ebuild'))
- self.assertEqual(mkdtemp_path, dir_name)
+ def test_filter_tidy_lints_normalizes_and_restricts_properly(self):
+ git_and_only = default_tidy_diagnostic(file_path="/git/foo.c")
+ git_and_noonly = default_tidy_diagnostic(file_path="/git/bar.c")
+ self.assertEqual(
+ [git_and_only.normalize_paths_to("/git")],
+ tricium_clang_tidy.filter_tidy_lints(
+ only_files={Path("/git/foo.c")},
+ git_repo_base=Path("/git"),
+ diags=[git_and_only, git_and_noonly],
+ ),
+ )
- rmdir_mock.assert_called_with(
- tricium_clang_tidy.LINT_BASE, ignore_missing=True, sudo=True)
- safe_makedirs_mock.assert_called_with(
- tricium_clang_tidy.LINT_BASE, 0o777, sudo=True)
+ @mock.patch.object(osutils, "CopyDirContents")
+ @mock.patch.object(osutils, "SafeMakedirs")
+ def test_lint_generation_functions(
+ self, safe_makedirs_mock, copy_dir_contents_mock
+ ):
+ run_mock = self.StartPatcher(cros_test_lib.PopenMock())
+ run_mock.SetDefaultCmdResult()
- desired_env = dict(os.environ)
- desired_env['WITH_TIDY'] = 'tricium'
- run_mock.assertCommandContains(
- ['ebuild-${board}', '/path/to/the.ebuild', 'clean', 'compile'],
- env=desired_env)
+ # Mock mkdtemp last, since PopenMock() makes a tempdir.
+ mkdtemp_mock = self.PatchObject(tempfile, "mkdtemp")
+ mkdtemp_path = "/path/to/temp/dir"
+ mkdtemp_mock.return_value = mkdtemp_path
+ with mock.patch.object(osutils, "RmDir") as rmdir_mock:
+ dir_name = str(
+ tricium_clang_tidy.generate_lints(
+ "${board}", "/path/to/the.ebuild"
+ )
+ )
+ self.assertEqual(mkdtemp_path, dir_name)
- copy_dir_contents_mock.assert_called_with(tricium_clang_tidy.LINT_BASE,
- dir_name)
+ rmdir_mock.assert_called_with(
+ tricium_clang_tidy.LINT_BASE, ignore_missing=True, sudo=True
+ )
+ safe_makedirs_mock.assert_called_with(
+ tricium_clang_tidy.LINT_BASE, 0o777, sudo=True
+ )
+
+ desired_env = dict(os.environ)
+ desired_env["WITH_TIDY"] = "tricium"
+ run_mock.assertCommandContains(
+ ["ebuild-${board}", "/path/to/the.ebuild", "clean", "compile"],
+ env=desired_env,
+ )
+
+ copy_dir_contents_mock.assert_called_with(
+ tricium_clang_tidy.LINT_BASE, dir_name
+ )