aboutsummaryrefslogtreecommitdiff
path: root/pw_build/py/project_builder_prefs_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'pw_build/py/project_builder_prefs_test.py')
-rw-r--r--pw_build/py/project_builder_prefs_test.py129
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()