# 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()