# Copyright 2021 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. """Components Tests.""" import pathlib import unittest import xml.etree.ElementTree from itertools import chain from pw_build_mcuxpresso.components import Project # pylint: disable=missing-function-docstring # pylint: disable=line-too-long class ParseDefinesTest(unittest.TestCase): """parse_defines tests.""" def test_parse_defines(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) defines = project.components["test"].defines self.assertCountEqual( defines, ['TEST_WITH_VALUE=1', 'TEST_WITHOUT_VALUE'] ) def test_no_defines(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) defines = project.components["test"].defines self.assertCountEqual(defines, []) def test_device_cores(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None, "CORE0") defines = project.components["test"].defines self.assertCountEqual(defines, ['TEST_WITH_CORE', 'TEST_WITHOUT_CORES']) class ParseIncludePathsTest(unittest.TestCase): """parse_include_paths tests.""" def test_parse_include_paths(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) include_paths = project.components["test"].include_dirs self.assertCountEqual( include_paths, [pathlib.Path("example"), pathlib.Path("asm")] ) def test_with_base_path(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) include_paths = project.components["test"].include_dirs self.assertCountEqual( include_paths, [pathlib.Path('src/example'), pathlib.Path('src/asm')], ) def test_unknown_type(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) include_paths = project.components["test"].include_dirs self.assertCountEqual(include_paths, []) def test_no_include_paths(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) include_paths = project.components["test"].include_dirs self.assertCountEqual(include_paths, []) def test_device_cores(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None, "CORE0") include_paths = project.components["test"].include_dirs self.assertCountEqual( include_paths, [pathlib.Path('with_core'), pathlib.Path('without_cores')], ) class ParseHeadersTest(unittest.TestCase): """parse_headers tests.""" def test_parse_headers(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) headers = project.components["test"].headers self.assertCountEqual( headers, [ pathlib.Path('include/test.h'), pathlib.Path('include/test_types.h'), ], ) def test_with_base_path(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) headers = project.components["test"].headers self.assertCountEqual( headers, [ pathlib.Path('src/include/test.h'), pathlib.Path('src/include/test_types.h'), ], ) def test_multiple_sets(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) headers = project.components["test"].headers self.assertCountEqual( headers, [ pathlib.Path('include/test.h'), pathlib.Path('internal/test_types.h'), ], ) def test_no_headers(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) headers = project.components["test"].headers self.assertCountEqual(headers, []) def test_device_cores(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None, "CORE0") headers = project.components["test"].headers self.assertCountEqual( headers, [ pathlib.Path('with_core/test.h'), pathlib.Path('without_cores/test.h'), ], ) class ParseSourcesTest(unittest.TestCase): """parse_sources tests.""" def test_parse_sources(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) sources = project.components["test"].sources self.assertCountEqual( sources, [pathlib.Path('src/main.cc'), pathlib.Path('src/test.cc')] ) def test_with_base_path(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) sources = project.components["test"].sources self.assertCountEqual( sources, [pathlib.Path('src/app/main.cc'), pathlib.Path('src/app/test.cc')], ) def test_multiple_sets(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) sources = project.components["test"].sources self.assertCountEqual( sources, [ pathlib.Path('shared/test.cc'), pathlib.Path('lib/test.c'), pathlib.Path('app/main.cc'), pathlib.Path('startup/boot.s'), ], ) def test_unknown_type(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) sources = project.components["test"].sources self.assertCountEqual(sources, []) def test_no_sources(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) sources = project.components["test"].sources self.assertCountEqual(sources, []) def test_device_cores(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None, "CORE0") sources = project.components["test"].sources self.assertCountEqual( sources, [ pathlib.Path('with_core/main.cc'), pathlib.Path('without_cores/main.cc'), ], ) class ParseLibsTest(unittest.TestCase): """parse_libs tests.""" def test_parse_libs(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) libs = project.components["test"].libs self.assertCountEqual( libs, [pathlib.Path('gcc/libtest.a'), pathlib.Path('gcc/libtest_arm.a')], ) def test_with_base_path(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) libs = project.components["test"].libs self.assertCountEqual( libs, [ pathlib.Path('src/gcc/libtest.a'), pathlib.Path('src/gcc/libtest_arm.a'), ], ) def test_multiple_sets(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) libs = project.components["test"].libs self.assertCountEqual( libs, [pathlib.Path('gcc/libtest.a'), pathlib.Path('arm/libtest_arm.a')], ) def test_multiple_toolchains(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) libs = project.components["test"].libs self.assertCountEqual( libs, [pathlib.Path('gcc/libtest.a')], ) def test_no_libs(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) libs = project.components["test"].libs self.assertCountEqual(libs, []) def test_device_cores(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None, "CORE0") libs = project.components["test"].libs self.assertCountEqual( libs, [ pathlib.Path('with_core/libtest.a'), pathlib.Path('without_cores/libtest.a'), ], ) class ParseDependenciesTest(unittest.TestCase): """parse_dependencies tests.""" def test_component_dependency(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) dependencies = project.components["test"].dependencies self.assertCountEqual(dependencies, {'foo'}) def test_all(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], None) dependencies = project.components["test"].dependencies self.assertCountEqual(dependencies, {'foo', 'bar', 'baz'}) def test_any_of(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["test", "foo"], None) dependencies = project.components["test"].dependencies self.assertCountEqual(dependencies, {'foo'}) def test_any_of_inside_all(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project( [manifest], pathlib.Path.cwd(), ["test", "frodo", "bilbo"], None ) dependencies = project.components["test"].dependencies self.assertCountEqual( dependencies, {'foo', 'bar', 'baz', 'frodo', 'bilbo'} ) def test_no_dependencies(self): test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project([manifest], pathlib.Path.cwd(), ["*"], ["gandalf"]) dependencies = project.components["test"].dependencies self.assertCountEqual(dependencies, []) class ProjectTest(unittest.TestCase): """Project tests.""" def test_create_project(self): """test creating a project.""" test_manifest_xml = ''' ''' manifest = ( xml.etree.ElementTree.fromstring(test_manifest_xml), pathlib.Path.cwd() / "manifest.xml", ) project = Project( [manifest], pathlib.Path.cwd(), ["test", "frodo"], ["baz"], "CORE0", ) components = project.components.values() component_ids = (component.id for component in components) self.assertCountEqual( component_ids, ['test', 'frodo', 'bilbo', 'foo', 'bar'] ) defines = chain.from_iterable( component.defines for component in components ) self.assertCountEqual(defines, ['FRODO', 'BILBO', 'FOO', 'BAR']) include_dirs = chain.from_iterable( component.include_dirs for component in components ) self.assertCountEqual( include_dirs, [ pathlib.Path('frodo/include'), pathlib.Path('bilbo/include'), pathlib.Path('foo/include'), pathlib.Path('bar/include'), ], ) headers = chain.from_iterable( component.headers for component in components ) self.assertCountEqual( headers, [ pathlib.Path('frodo/include/frodo.h'), pathlib.Path('bilbo/include/bilbo.h'), pathlib.Path('foo/include/foo.h'), pathlib.Path('foo/include/core0.h'), pathlib.Path('foo/include/common.h'), pathlib.Path('bar/include/bar.h'), ], ) sources = chain.from_iterable( component.sources for component in components ) self.assertCountEqual( sources, [ pathlib.Path('frodo/src/frodo.cc'), pathlib.Path('bilbo/src/bilbo.cc'), pathlib.Path('foo/src/foo.cc'), pathlib.Path('foo/src/core0.cc'), pathlib.Path('foo/src/common.cc'), pathlib.Path('bar/src/bar.cc'), ], ) libs = chain.from_iterable(component.libs for component in components) self.assertCountEqual(libs, [pathlib.Path('frodo/libonering.a')]) if __name__ == '__main__': unittest.main()