diff options
Diffstat (limited to 'pw_build/py/project_builder_prefs_test.py')
-rw-r--r-- | pw_build/py/project_builder_prefs_test.py | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/pw_build/py/project_builder_prefs_test.py b/pw_build/py/project_builder_prefs_test.py new file mode 100644 index 000000000..f128bee2b --- /dev/null +++ b/pw_build/py/project_builder_prefs_test.py @@ -0,0 +1,129 @@ +# 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_build.project_builder_prefs""" + +import argparse +import copy +from pathlib import Path +import tempfile +from typing import Any, Dict +import unittest +from unittest.mock import MagicMock + +from pw_build.project_builder_argparse import add_project_builder_arguments +from pw_build.project_builder_prefs import ( + ProjectBuilderPrefs, + _DEFAULT_CONFIG, + load_defaults_from_argparse, +) + + +def _create_tempfile(content: str) -> Path: + with tempfile.NamedTemporaryFile( + prefix=f'{__package__}', delete=False + ) as output_file: + output_file.write(content.encode('UTF-8')) + return Path(output_file.name) + + +class TestProjectBuilderPrefs(unittest.TestCase): + """Tests for ProjectBuilderPrefs.""" + + def setUp(self): + self.maxDiff = None # pylint: disable=invalid-name + + def test_load_no_existing_files(self) -> None: + # Create a prefs instance with no loaded config. + prefs = ProjectBuilderPrefs( + load_argparse_arguments=add_project_builder_arguments, + project_file=False, + project_user_file=False, + user_file=False, + ) + # Construct an expected result config. + expected_config: Dict[Any, Any] = {} + expected_config.update(_DEFAULT_CONFIG) + expected_config.update( + load_defaults_from_argparse(add_project_builder_arguments) + ) + + self.assertEqual( + prefs._config, expected_config # pylint: disable=protected-access + ) + + def test_apply_command_line_args(self) -> None: + """Check command line args are applied to watch preferences.""" + # Load default command line arg values. + defaults_from_argparse = load_defaults_from_argparse( + add_project_builder_arguments + ) + + # Create a prefs instance with the test config file. + prefs = ProjectBuilderPrefs( + load_argparse_arguments=add_project_builder_arguments, + project_file=False, + project_user_file=False, + user_file=False, + ) + + # Construct an expected result config. + expected_config: Dict[Any, Any] = copy.copy(_DEFAULT_CONFIG) + expected_config.update(defaults_from_argparse) + + # pylint: disable=protected-access + prefs._update_config = MagicMock( # type: ignore + wraps=prefs._update_config + ) + # pylint: enable=protected-access + + args_dict = copy.deepcopy(defaults_from_argparse) + changed_args = { + 'jobs': 8, + 'colors': False, + 'build_system_commands': [ + ['out', 'bazel build'], + ['out', 'bazel test'], + ], + } + args_dict.update(changed_args) + + prefs.apply_command_line_args(argparse.Namespace(**args_dict)) + + # apply_command_line_args modifies build_system_commands to match the + # prefs dict format. + changed_args['build_system_commands'] = { + 'default': {'commands': [{'command': 'ninja', 'extra_args': []}]}, + 'out': { + 'commands': [ + {'command': 'bazel', 'extra_args': ['build']}, + {'command': 'bazel', 'extra_args': ['test']}, + ], + }, + } + + # Check that only args changed from their defaults are applied. + # pylint: disable=protected-access + prefs._update_config.assert_called_once_with(changed_args) + # pylint: enable=protected-access + + # Check the result includes the project_config settings and the + # changed_args. + expected_config.update(changed_args) + # pylint: disable=protected-access + self.assertEqual(prefs._config, expected_config) + # pylint: enable=protected-access + + +if __name__ == '__main__': + unittest.main() |