diff --git a/.travis.yml b/.travis.yml index 8fcd24a86c..dd96d456a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ python: script: - PYTHONPATH=. python tools/test/config_test/config_test.py + - PYTHONPATH=. python tools/test/build_api/build_api_test.py - python tools/test/pylint.py - py.test tools/test/toolchains/api.py - python tools/test/memap/memap_test.py @@ -21,3 +22,4 @@ install: - sudo pip install pytest - sudo pip install pylint - sudo pip install hypothesis + - sudo pip install mock diff --git a/tools/build_api.py b/tools/build_api.py index 60b7a8b0d2..c48b442da4 100644 --- a/tools/build_api.py +++ b/tools/build_api.py @@ -303,7 +303,7 @@ def prepare_toolchain(src_paths, target, toolchain_name, src_paths = [src_paths[0]] + list(set(src_paths[1:])) # If the configuration object was not yet created, create it now - config = config or Config(target, src_paths) + config = config or Config(target, src_paths, app_config=app_config) target = config.target # Toolchain instance diff --git a/tools/test/build_api/build_api_test.py b/tools/test/build_api/build_api_test.py index 97c2f1cf21..a3353929ea 100644 --- a/tools/test/build_api/build_api_test.py +++ b/tools/test/build_api/build_api_test.py @@ -16,8 +16,10 @@ limitations under the License. """ import unittest -from mock import patch -from tools.build_api import prepare_toolchain, build_project, build_library +from collections import namedtuple +from mock import patch, MagicMock +from tools.build_api import prepare_toolchain, build_project, build_library,\ + scan_resources """ Tests for build_api.py @@ -47,7 +49,30 @@ class BuildApiTests(unittest.TestCase): """ pass - @patch('tools.config.Config.__init__') + @patch('tools.toolchains.arm.ARM_STD.parse_dependencies', + return_value=["foo"]) + @patch('tools.toolchains.mbedToolchain.need_update', + side_effect=[i % 2 for i in range(3000)]) + @patch('os.mkdir') + @patch('tools.toolchains.exists', return_value=True) + @patch('tools.utils.run_cmd', return_value=("", "", 0)) + def test_always_complete_build(self, *_): + with MagicMock() as notify: + toolchain = prepare_toolchain(self.src_paths, self.target, + self.toolchain_name, notify=notify) + + res = scan_resources(self.src_paths, toolchain) + + toolchain.RESPONSE_FILES=False + toolchain.config_processed = True + toolchain.config_file = "junk" + toolchain.compile_sources(res, self.build_path) + + assert any('percent' in msg[0] and msg[0]['percent'] == 100.0 + for _, msg, _ in notify.mock_calls if msg) + + + @patch('tools.build_api.Config') def test_prepare_toolchain_app_config(self, mock_config_init): """ Test that prepare_toolchain uses app_config correctly @@ -56,15 +81,18 @@ class BuildApiTests(unittest.TestCase): :return: """ app_config = "app_config" - mock_config_init.return_value = None + mock_config_init.return_value = namedtuple("Config", "target")( + namedtuple("Target", + "init_hooks name features core")(lambda _, __ : None, + "Junk", [], "Cortex-M3")) prepare_toolchain(self.src_paths, self.target, self.toolchain_name, app_config=app_config) - mock_config_init.assert_called_with(self.target, self.src_paths, - app_config=app_config) + mock_config_init.assert_called_once_with(self.target, self.src_paths, + app_config=app_config) - @patch('tools.config.Config.__init__') + @patch('tools.build_api.Config') def test_prepare_toolchain_no_app_config(self, mock_config_init): """ Test that prepare_toolchain correctly deals with no app_config @@ -72,12 +100,15 @@ class BuildApiTests(unittest.TestCase): :param mock_config_init: mock of Config __init__ :return: """ - mock_config_init.return_value = None + mock_config_init.return_value = namedtuple("Config", "target")( + namedtuple("Target", + "init_hooks name features core")(lambda _, __ : None, + "Junk", [], "Cortex-M3")) prepare_toolchain(self.src_paths, self.target, self.toolchain_name) - mock_config_init.assert_called_with(self.target, self.src_paths, - app_config=None) + mock_config_init.assert_called_once_with(self.target, self.src_paths, + app_config=None) @patch('tools.build_api.scan_resources') @patch('tools.build_api.mkdir') diff --git a/tools/toolchains/__init__.py b/tools/toolchains/__init__.py index 849665861e..6438a76221 100644 --- a/tools/toolchains/__init__.py +++ b/tools/toolchains/__init__.py @@ -760,6 +760,7 @@ class mbedToolchain: 'chroot': self.CHROOT }) else: + self.compiled += 1 objects.append(object) # Use queues/multiprocessing if cpu count is higher than setting