| # Copyright 2022 The Pigweed Authors |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| # use this file except in compliance with the License. You may obtain a copy of |
| # the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations under |
| # the License. |
| """Tests for pw_ide.cpp""" |
| |
| import json |
| from pathlib import Path |
| from typing import List, Optional, Tuple, TypedDict, Union |
| import unittest |
| from unittest.mock import Mock, patch |
| |
| # pylint: disable=protected-access |
| from pw_ide.cpp import ( |
| _COMPDB_FILE_PREFIX, |
| _COMPDB_FILE_SEPARATOR, |
| _COMPDB_FILE_EXTENSION, |
| _COMPDB_CACHE_DIR_PREFIX, |
| _COMPDB_CACHE_DIR_SEPARATOR, |
| _target_and_executable_from_command, |
| compdb_generate_cache_file_path, |
| compdb_generate_file_path, |
| compdb_target_from_path, |
| CppCompilationDatabase, |
| CppCompileCommand, |
| CppCompileCommandDict, |
| InvalidTargetException, |
| MissingCompDbException, |
| aggregate_compilation_database_targets, |
| get_available_compdbs, |
| get_available_targets, |
| get_target, |
| process_compilation_database, |
| set_target, |
| ) |
| |
| from test_cases import PwIdeTestCase |
| |
| |
| class _TargetAndExecutableFromCommandTestCase(TypedDict): |
| command: str |
| target: Optional[str] |
| executable: Optional[str] |
| |
| |
| class TestTargetAndExecutableFromCommand(unittest.TestCase): |
| """Tests _target_and_executable_from_command""" |
| def run_test(self, command: str, expected_target: Optional[str], |
| expected_executable: Optional[str]) -> None: |
| (target, executable) = _target_and_executable_from_command(command) |
| self.assertEqual(target, expected_target) |
| self.assertEqual(executable, expected_executable) |
| |
| def test_correct_target_and_executable_with_gn_compile_command( |
| self) -> None: |
| """Test output against typical GN-generated compile commands.""" |
| |
| cases: List[_TargetAndExecutableFromCommandTestCase] = [ |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| 'arm-none-eabi-g++ -MMD -MF stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o.d -Wno-psabi -mabi=aapcs -mthumb --sysroot=../environment/cipd/packages/arm -specs=nano.specs -specs=nosys.specs -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Og -Wshadow -Wredundant-decls -u_printf_float -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -DPW_ARMV7M_ENABLE_FPU=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/assert_compatibility_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'target': 'stm32f429i_disc1_debug', |
| 'executable': 'arm-none-eabi-g++', |
| }, |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| '../environment/cipd/packages/pigweed/bin/clang++ -MMD -MF pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'target': 'pw_strict_host_clang_debug', |
| 'executable': 'clang++', |
| }, |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| "python ../pw_toolchain/py/pw_toolchain/clang_tidy.py --source-exclude 'third_party/.*' --source-exclude '.*packages/mbedtls.*' --source-exclude '.*packages/boringssl.*' --skip-include-path 'mbedtls/include' --skip-include-path 'mbedtls' --skip-include-path 'boringssl/src/include' --skip-include-path 'boringssl' --skip-include-path 'pw_tls_client/generate_test_data' --source-file ../pw_allocator/freelist.cc --source-root '../' --export-fixes pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/freelist.freelist.cc.o.yaml -- ../environment/cipd/packages/pigweed/bin/clang++ END_OF_INVOKER -MMD -MF pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/freelist.freelist.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_containers/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/freelist.cc -o pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/freelist.freelist.cc.o && touch pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/freelist.freelist.cc.o", |
| # pylint: enable=line-too-long |
| 'target': None, |
| 'executable': 'python', |
| }, |
| { |
| 'command': '', |
| 'target': None, |
| 'executable': None, |
| }, |
| ] |
| |
| for case in cases: |
| self.run_test(case['command'], case['target'], case['executable']) |
| |
| |
| class TestCppCompileCommand(unittest.TestCase): |
| """Tests CppCompileCommand""" |
| def test_post_init_frozen_attrs_set(self) -> None: |
| command_dict = { |
| # pylint: disable=line-too-long |
| 'command': |
| 'arm-none-eabi-g++ -MMD -MF stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o.d -Wno-psabi -mabi=aapcs -mthumb --sysroot=../environment/cipd/packages/arm -specs=nano.specs -specs=nosys.specs -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Og -Wshadow -Wredundant-decls -u_printf_float -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -DPW_ARMV7M_ENABLE_FPU=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/assert_compatibility_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc' |
| } |
| |
| expected_target = 'stm32f429i_disc1_debug' |
| expected_executable = 'arm-none-eabi-g++' |
| command = CppCompileCommand(**command_dict) |
| |
| self.assertEqual(command.target, expected_target) |
| self.assertEqual(command.executable, expected_executable) |
| |
| |
| class TestCppCompilationDatabase(PwIdeTestCase): |
| """Tests CppCompilationDatabase""" |
| def setUp(self): |
| self.fixture: List[CppCompileCommandDict] = [ |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| 'arm-none-eabi-g++ -MMD -MF stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o.d -Wno-psabi -mabi=aapcs -mthumb --sysroot=../environment/cipd/packages/arm -specs=nano.specs -specs=nosys.specs -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Og -Wshadow -Wredundant-decls -u_printf_float -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -DPW_ARMV7M_ENABLE_FPU=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/assert_compatibility_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc' |
| }, |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| '../environment/cipd/packages/pigweed/bin/clang++ -MMD -MF pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc' |
| }, |
| ] |
| |
| return super().setUp() |
| |
| def test_load_from_dicts(self): |
| compdb = CppCompilationDatabase.load(self.fixture) |
| self.assertCountEqual(compdb.as_dicts(), self.fixture) |
| |
| def test_load_from_json(self): |
| compdb = CppCompilationDatabase.load(json.dumps(self.fixture)) |
| self.assertCountEqual(compdb.as_dicts(), self.fixture) |
| |
| def test_load_from_path(self): |
| with self.make_temp_file( |
| f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_EXTENSION}', |
| json.dumps(self.fixture)) as (_, file_path): |
| path = file_path |
| |
| compdb = CppCompilationDatabase.load(path) |
| self.assertCountEqual(compdb.as_dicts(), self.fixture) |
| |
| def test_load_from_file_handle(self): |
| with self.make_temp_file( |
| f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_EXTENSION}', |
| json.dumps(self.fixture)) as (file, _): |
| compdb = CppCompilationDatabase.load(file) |
| |
| self.assertCountEqual(compdb.as_dicts(), self.fixture) |
| |
| |
| class TestCompDbGenerateFilePath(unittest.TestCase): |
| """Tests compdb_generate_file_path""" |
| def test_with_target_includes_target(self) -> None: |
| name = 'foo' |
| actual = str(compdb_generate_file_path('foo')) |
| expected = (f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_SEPARATOR}' |
| f'{name}{_COMPDB_FILE_EXTENSION}') |
| self.assertEqual(actual, expected) |
| |
| def test_without_target_omits_target(self) -> None: |
| actual = str(compdb_generate_file_path()) |
| expected = f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_EXTENSION}' |
| self.assertEqual(actual, expected) |
| |
| |
| class TestCompDbGenerateCacheFilePath(unittest.TestCase): |
| """Tests compdb_generate_cache_file_path""" |
| def test_with_target_includes_target(self) -> None: |
| name = 'foo' |
| actual = str(compdb_generate_cache_file_path('foo')) |
| expected = (f'{_COMPDB_CACHE_DIR_PREFIX}' |
| f'{_COMPDB_CACHE_DIR_SEPARATOR}{name}') |
| self.assertEqual(actual, expected) |
| |
| def test_without_target_omits_target(self) -> None: |
| actual = str(compdb_generate_cache_file_path()) |
| expected = f'{_COMPDB_CACHE_DIR_PREFIX}' |
| self.assertEqual(actual, expected) |
| |
| |
| class _CompDbTargetFromPathTestCase(TypedDict): |
| path: str |
| target: Optional[str] |
| |
| |
| class TestCompDbTargetFromPath(unittest.TestCase): |
| """Tests compdb_target_from_path""" |
| def run_test(self, path: Path, expected_target: Optional[str]) -> None: |
| target = compdb_target_from_path(path) |
| self.assertEqual(target, expected_target) |
| |
| def test_correct_target_from_path(self) -> None: |
| """Test that the expected target is extracted from the file path.""" |
| cases: List[_CompDbTargetFromPathTestCase] = [ |
| { |
| 'path': |
| (f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_SEPARATOR}' |
| f'pw_strict_host_clang_debug{_COMPDB_FILE_EXTENSION}'), |
| 'target': |
| 'pw_strict_host_clang_debug' |
| }, |
| { |
| 'path': (f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_SEPARATOR}' |
| f'stm32f429i_disc1_debug{_COMPDB_FILE_EXTENSION}'), |
| 'target': |
| 'stm32f429i_disc1_debug' |
| }, |
| { |
| 'path': (f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_SEPARATOR}' |
| f'{_COMPDB_FILE_EXTENSION}'), |
| 'target': |
| None |
| }, |
| { |
| 'path': 'foompile_barmmands.json', |
| 'target': None |
| }, |
| { |
| 'path': 'foompile_barmmands_target_x.json', |
| 'target': None |
| }, |
| { |
| 'path': '', |
| 'target': None |
| }, |
| ] |
| |
| for case in cases: |
| self.run_test(Path(case['path']), case['target']) |
| |
| |
| class TestGetAvailableCompDbs(PwIdeTestCase): |
| """Tests get_avaliable_compdbs""" |
| def test_finds_all_compdbs(self) -> None: |
| """Test that get_available_compdbs finds all compilation databases.""" |
| |
| targets = [ |
| 'pw_strict_host_clang_debug', |
| 'stm32f429i_disc1_debug', |
| ] |
| |
| # Simulate a dir with n compilation databases, m < n cache dirs, and |
| # symlinks set up. |
| files_data: List[Tuple[Union[Path, str], str]] = \ |
| [(compdb_generate_file_path(target), '') for target in targets] |
| |
| files_data.append((compdb_generate_cache_file_path(targets[0]), '')) |
| files_data.append((compdb_generate_file_path(), '')) |
| files_data.append((compdb_generate_cache_file_path(), '')) |
| |
| expected = [ |
| (f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_SEPARATOR}' |
| f'{targets[0]}{_COMPDB_FILE_EXTENSION}', |
| f'{_COMPDB_CACHE_DIR_PREFIX}{_COMPDB_CACHE_DIR_SEPARATOR}' |
| f'{targets[0]}'), |
| (f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_SEPARATOR}' |
| f'{targets[1]}{_COMPDB_FILE_EXTENSION}', None), |
| ] |
| |
| settings = self.make_ide_settings(targets=targets) |
| |
| with self.make_temp_files(files_data): |
| found_compdbs = get_available_compdbs(settings) |
| |
| # Strip out the temp dir path data. |
| get_name = lambda p: p.name if p is not None else None |
| found_compdbs_str = [(get_name(file), get_name(cache)) |
| for file, cache in found_compdbs] |
| |
| self.assertCountEqual(found_compdbs_str, expected) |
| |
| |
| class TestGetAvailableTargets(PwIdeTestCase): |
| """Tests get_available_targets""" |
| def test_finds_all_targets(self) -> None: |
| targets = [ |
| 'pw_strict_host_clang_debug', |
| 'stm32f429i_disc1_debug', |
| ] |
| |
| settings = self.make_ide_settings(targets=targets) |
| |
| with self.make_temp_file(compdb_generate_file_path(targets[0])), \ |
| self.make_temp_file(compdb_generate_file_path(targets[1])): |
| |
| found_targets = get_available_targets(settings) |
| |
| self.assertCountEqual(found_targets, targets) |
| |
| |
| class TestGetTarget(PwIdeTestCase): |
| """Tests get_target""" |
| @patch('os.readlink') |
| def test_finds_valid_target(self, mock_readlink: Mock) -> None: |
| target = 'pw_strict_host_clang_debug' |
| settings = self.make_ide_settings(targets=[target]) |
| mock_readlink.return_value = (f'{_COMPDB_FILE_PREFIX}' |
| f'{_COMPDB_CACHE_DIR_SEPARATOR}' |
| f'{target}{_COMPDB_FILE_EXTENSION}') |
| found_target = get_target(settings) |
| self.assertEqual(found_target, target) |
| |
| @patch('os.readlink') |
| def test_finds_valid_target_nested(self, mock_readlink: Mock) -> None: |
| target = 'pw_strict_host_clang_debug' |
| settings = self.make_ide_settings(targets=[target]) |
| mock_readlink.return_value = (f'/x/y/z/{_COMPDB_FILE_PREFIX}' |
| f'{_COMPDB_CACHE_DIR_SEPARATOR}' |
| f'{target}{_COMPDB_FILE_EXTENSION}') |
| found_target = get_target(settings) |
| self.assertEqual(found_target, target) |
| |
| def test_returns_none_with_no_symlink(self) -> None: |
| target = 'pw_strict_host_clang_debug' |
| settings = self.make_ide_settings(targets=[target]) |
| found_target = get_target(settings) |
| self.assertIsNone(found_target) |
| |
| |
| class TestSetTarget(PwIdeTestCase): |
| """Tests set_target""" |
| @patch('os.remove') |
| @patch('os.mkdir') |
| @patch('os.symlink') |
| def test_sets_valid_target_when_no_target_set(self, mock_symlink: Mock, |
| mock_mkdir: Mock, |
| mock_remove: Mock) -> None: |
| """Test the case where no symlinks have been set.""" |
| |
| target = 'pw_strict_host_clang_debug' |
| settings = self.make_ide_settings(targets=[target]) |
| compdb_symlink_path = compdb_generate_file_path() |
| cache_symlink_path = compdb_generate_cache_file_path() |
| |
| with self.make_temp_file(compdb_generate_file_path(target)): |
| set_target(target, settings) |
| |
| mock_mkdir.assert_any_call( |
| self.path_in_temp_dir(compdb_generate_cache_file_path(target))) |
| |
| mock_symlink.assert_any_call(*self.paths_in_temp_dir( |
| compdb_generate_file_path(target), compdb_symlink_path)) |
| |
| mock_symlink.assert_any_call(*self.paths_in_temp_dir( |
| compdb_generate_cache_file_path(target), cache_symlink_path)) |
| |
| mock_remove.assert_not_called() |
| |
| @patch('os.remove') |
| @patch('os.mkdir') |
| @patch('os.symlink') |
| def test_sets_valid_target_when_target_already_set( |
| self, mock_symlink: Mock, mock_mkdir: Mock, |
| mock_remove: Mock) -> None: |
| """Test the case where symlinks have been set, and now we're setting |
| them to a different target.""" |
| |
| targets = [ |
| 'pw_strict_host_clang_debug', |
| 'stm32f429i_disc1_debug', |
| ] |
| |
| settings = self.make_ide_settings(targets=targets) |
| compdb_symlink_path = compdb_generate_file_path() |
| cache_symlink_path = compdb_generate_cache_file_path() |
| |
| # Set the first target, which should initalize the symlinks. |
| with self.make_temp_file(compdb_generate_file_path(targets[0])), \ |
| self.make_temp_file(compdb_generate_file_path(targets[1])): |
| |
| set_target(targets[0], settings) |
| |
| mock_mkdir.assert_any_call( |
| self.path_in_temp_dir( |
| compdb_generate_cache_file_path(targets[0]))) |
| |
| mock_remove.assert_not_called() |
| |
| # Simulate symlink creation |
| with self.make_temp_file(compdb_symlink_path), \ |
| self.make_temp_file(cache_symlink_path): |
| |
| # Set the second target, which should replace the symlinks |
| set_target(targets[1], settings) |
| |
| mock_mkdir.assert_any_call( |
| self.path_in_temp_dir( |
| compdb_generate_cache_file_path(targets[1]))) |
| |
| mock_remove.assert_any_call( |
| self.path_in_temp_dir(compdb_symlink_path)) |
| |
| mock_remove.assert_any_call( |
| self.path_in_temp_dir(cache_symlink_path)) |
| |
| mock_symlink.assert_any_call(*self.paths_in_temp_dir( |
| compdb_generate_file_path(targets[1]), |
| compdb_symlink_path)) |
| |
| mock_symlink.assert_any_call(*self.paths_in_temp_dir( |
| compdb_generate_cache_file_path(targets[1]), |
| cache_symlink_path)) |
| |
| @patch('os.remove') |
| @patch('os.mkdir') |
| @patch('os.symlink') |
| def test_sets_valid_target_back_and_forth(self, mock_symlink: Mock, |
| mock_mkdir: Mock, |
| mock_remove: Mock) -> None: |
| """Test the case where symlinks have been set, we set them to a second |
| target, and now we're setting them back to the first target.""" |
| |
| targets = [ |
| 'pw_strict_host_clang_debug', |
| 'stm32f429i_disc1_debug', |
| ] |
| |
| settings = self.make_ide_settings(targets=targets) |
| compdb_symlink_path = compdb_generate_file_path() |
| cache_symlink_path = compdb_generate_cache_file_path() |
| |
| # Set the first target, which should initalize the symlinks |
| with self.make_temp_file(compdb_generate_file_path(targets[0])), \ |
| self.make_temp_file(compdb_generate_file_path(targets[1])): |
| |
| set_target(targets[0], settings) |
| |
| # Simulate symlink creation |
| with self.make_temp_file(compdb_symlink_path), \ |
| self.make_temp_file(cache_symlink_path): |
| |
| # Set the second target, which should replace the symlinks |
| set_target(targets[1], settings) |
| |
| # Reset mocks to clear events prior to those under test |
| mock_symlink.reset_mock() |
| mock_mkdir.reset_mock() |
| mock_remove.reset_mock() |
| |
| # Set the first target again, which should also replace the |
| # symlinks and reuse the existing cache folder |
| set_target(targets[0], settings) |
| |
| mock_mkdir.assert_any_call( |
| self.path_in_temp_dir( |
| compdb_generate_cache_file_path(targets[0]))) |
| |
| mock_remove.assert_any_call( |
| self.path_in_temp_dir(compdb_symlink_path)) |
| |
| mock_remove.assert_any_call( |
| self.path_in_temp_dir(cache_symlink_path)) |
| |
| mock_symlink.assert_any_call(*self.paths_in_temp_dir( |
| compdb_generate_file_path(targets[0]), |
| compdb_symlink_path)) |
| |
| mock_symlink.assert_any_call(*self.paths_in_temp_dir( |
| compdb_generate_cache_file_path(targets[0]), |
| cache_symlink_path)) |
| |
| @patch('os.symlink') |
| def test_invalid_target_not_in_defined_targets_raises( |
| self, mock_symlink: Mock): |
| target = 'pw_strict_host_clang_debug' |
| settings = self.make_ide_settings(targets=[target]) |
| |
| with self.make_temp_file(compdb_generate_file_path(target)), \ |
| self.assertRaises(InvalidTargetException): |
| |
| set_target('foo', settings) |
| mock_symlink.assert_not_called() |
| |
| @patch('os.symlink') |
| def test_invalid_target_not_in_available_targets_raises( |
| self, mock_symlink: Mock): |
| target = 'pw_strict_host_clang_debug' |
| settings = self.make_ide_settings(targets=[target]) |
| |
| with self.assertRaises(MissingCompDbException): |
| set_target(target, settings) |
| mock_symlink.assert_not_called() |
| |
| |
| class TestAggregateCompilationDatabaseTargets(PwIdeTestCase): |
| """Tests aggregate_compilation_database_targets""" |
| def test_gets_all_legitimate_targets(self): |
| """Test compilation target aggregation against a typical sample of raw |
| output from GN.""" |
| |
| targets = [ |
| 'pw_strict_host_clang_debug', |
| 'stm32f429i_disc1_debug', |
| ] |
| |
| raw_db: List[CppCompileCommandDict] = [ |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| 'arm-none-eabi-g++ -MMD -MF stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o.d -Wno-psabi -mabi=aapcs -mthumb --sysroot=../environment/cipd/packages/arm -specs=nano.specs -specs=nosys.specs -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Og -Wshadow -Wredundant-decls -u_printf_float -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -DPW_ARMV7M_ENABLE_FPU=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/assert_compatibility_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc' |
| }, |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| '../environment/cipd/packages/pigweed/bin/clang++ -MMD -MF pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc' |
| }, |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| "python ../pw_toolchain/py/pw_toolchain/clang_tidy.py --source-exclude 'third_party/.*' --source-exclude '.*packages/mbedtls.*' --source-exclude '.*packages/boringssl.*' --skip-include-path 'mbedtls/include' --skip-include-path 'mbedtls' --skip-include-path 'boringssl/src/include' --skip-include-path 'boringssl' --skip-include-path 'pw_tls_client/generate_test_data' --source-file ../pw_allocator/block.cc --source-root '../' --export-fixes pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o.yaml -- ../environment/cipd/packages/pigweed/bin/clang++ END_OF_INVOKER -MMD -MF pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o && touch pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o", |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc', |
| }, |
| ] |
| |
| aggregated_targets = aggregate_compilation_database_targets(raw_db) |
| self.assertCountEqual(aggregated_targets, targets) |
| |
| |
| class TestProcessCompilationDatabase(PwIdeTestCase): |
| """Tests process_compilation_database""" |
| def test_compilation_database_processed_correctly(self): |
| """Test compilation database processing against a typical sample of |
| raw output from GN.""" |
| |
| targets = [ |
| 'pw_strict_host_clang_debug', |
| 'stm32f429i_disc1_debug', |
| 'isosceles_debug', |
| ] |
| |
| settings = self.make_ide_settings(targets=targets) |
| |
| raw_db: List[CppCompileCommandDict] = [ |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| 'arm-none-eabi-g++ -MMD -MF stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o.d -Wno-psabi -mabi=aapcs -mthumb --sysroot=../environment/cipd/packages/arm -specs=nano.specs -specs=nosys.specs -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Og -Wshadow -Wredundant-decls -u_printf_float -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -DPW_ARMV7M_ENABLE_FPU=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/assert_compatibility_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc' |
| }, |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| '../environment/cipd/packages/pigweed/bin/isosceles-clang++ -MMD -MF isosceles_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc' |
| }, |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| '../environment/cipd/packages/pigweed/bin/clang++ -MMD -MF pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc' |
| }, |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| "python ../pw_toolchain/py/pw_toolchain/clang_tidy.py --source-exclude 'third_party/.*' --source-exclude '.*packages/mbedtls.*' --source-exclude '.*packages/boringssl.*' --skip-include-path 'mbedtls/include' --skip-include-path 'mbedtls' --skip-include-path 'boringssl/src/include' --skip-include-path 'boringssl' --skip-include-path 'pw_tls_client/generate_test_data' --source-file ../pw_allocator/block.cc --source-root '../' --export-fixes pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o.yaml -- ../environment/cipd/packages/pigweed/bin/clang++ END_OF_INVOKER -MMD -MF pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o && touch pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o", |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc', |
| }, |
| ] |
| |
| expected_compdbs = { |
| 'isosceles_debug': [ |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| '../environment/cipd/packages/pigweed/bin/isosceles-clang++ -MMD -MF isosceles_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc' |
| }, |
| ], |
| 'pw_strict_host_clang_debug': [ |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| '../environment/cipd/packages/pigweed/bin/clang++ -MMD -MF pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc' |
| }, |
| ], |
| 'stm32f429i_disc1_debug': [ |
| { |
| # pylint: disable=line-too-long |
| 'command': |
| 'arm-none-eabi-g++ -MMD -MF stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o.d -Wno-psabi -mabi=aapcs -mthumb --sysroot=../environment/cipd/packages/arm -specs=nano.specs -specs=nosys.specs -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Og -Wshadow -Wredundant-decls -u_printf_float -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -DPW_ARMV7M_ENABLE_FPU=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/assert_compatibility_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o', |
| # pylint: enable=line-too-long |
| 'directory': '/pigweed/pigweed/out', |
| 'file': '../pw_allocator/block.cc' |
| }, |
| ], |
| } |
| |
| compdbs = process_compilation_database(raw_db, settings) |
| compdbs_as_dicts = { |
| target: compdb.as_dicts() |
| for target, compdb in compdbs.items() |
| } |
| self.assertDictEqual(compdbs_as_dicts, expected_compdbs) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |