blob: 9ede88ff659e80155143ee18ea1a674a0a19f1e1 [file] [log] [blame]
# 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
)
# 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
)
# 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()