mirror of https://github.com/ARMmbed/mbed-os.git
166 lines
6.3 KiB
Python
166 lines
6.3 KiB
Python
# mbed SDK
|
|
# Copyright (c) 2019 ARM Limited
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
# 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
|
|
#
|
|
# http://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.
|
|
|
|
import unittest
|
|
from os.path import dirname, join, basename
|
|
from tools.resources import Resources, FileType, MBED_LIB_FILENAME
|
|
from tools.notifier.mock import MockNotifier
|
|
|
|
SRC_PATHS = {
|
|
'': join(dirname(__file__), 'source'),
|
|
# The online compiler uses a similar mapping, with the `.lib` suffix.
|
|
'mbed-os': join(dirname(__file__), 'mbed-os.lib'),
|
|
}
|
|
|
|
|
|
class ResourcesTest(unittest.TestCase):
|
|
"""
|
|
Tests for Resources objects
|
|
"""
|
|
|
|
def setUp(self):
|
|
"""
|
|
Called before each test case
|
|
|
|
:return:
|
|
"""
|
|
def test_basic_scan(self):
|
|
"""
|
|
Verify that the ordering of Target info addition and directory addition
|
|
does not matter, so long as all the Target info and all directories are
|
|
added.
|
|
"""
|
|
first = Resources(MockNotifier())
|
|
first._add_labels('TARGET', ['K64F'])
|
|
first._add_labels('TARGET', ['FRDM'])
|
|
for name, loc in SRC_PATHS.items():
|
|
print(name, loc)
|
|
first.add_directory(loc, into_path=name)
|
|
assert("main.cpp" in first.get_file_names(FileType.CPP_SRC))
|
|
|
|
def test_add_target_info(self):
|
|
"""
|
|
Verify that the ordering of Target info addition and directory addition
|
|
does not matter, so long as all the Target info and all directories are
|
|
added.
|
|
"""
|
|
first = Resources(MockNotifier())
|
|
middle = Resources(MockNotifier())
|
|
last = Resources(MockNotifier())
|
|
first._add_labels('TARGET', ['K64F'])
|
|
first._add_labels('TARGET', ['FRDM'])
|
|
middle._add_labels('TARGET', ['FRDM'])
|
|
for name, loc in SRC_PATHS.items():
|
|
first.add_directory(loc, into_path=name)
|
|
middle.add_directory(loc, into_path=name)
|
|
last.add_directory(loc, into_path=name)
|
|
middle._add_labels('TARGET', ['K64F'])
|
|
last._add_labels('TARGET', ['K64F'])
|
|
last._add_labels('TARGET', ['FRDM'])
|
|
for ftype in Resources.ALL_FILE_TYPES:
|
|
assert(set(first.get_file_refs(ftype))
|
|
== set(middle.get_file_refs(ftype)))
|
|
assert(set(last.get_file_refs(ftype))
|
|
== set(middle.get_file_refs(ftype)))
|
|
|
|
def test_detect_duplicates(self):
|
|
"""
|
|
Verify that detect_duplicates finds all of the duplicate object files
|
|
in the scanned tree.
|
|
"""
|
|
notifier = MockNotifier()
|
|
first = Resources(notifier)
|
|
first._add_labels('TARGET', ['K64F'])
|
|
for name, loc in SRC_PATHS.items():
|
|
first.add_directory(loc, into_path=name)
|
|
notifier.messages = []
|
|
first.detect_duplicates()
|
|
error_messages = "\n".join(
|
|
m['message'] for m in notifier.messages if m['type'] == 'tool_error'
|
|
)
|
|
assert(" eggs.o " in error_messages)
|
|
first._add_labels('TARGET', ['FRDM'])
|
|
first.detect_duplicates()
|
|
error_messages = "\n".join(
|
|
m['message'] for m in notifier.messages if m['type'] == 'tool_error'
|
|
)
|
|
assert(" eggs.o " in error_messages)
|
|
assert(" not-main.o " in error_messages)
|
|
assert(" main.o " in error_messages)
|
|
|
|
def test_filter_by_all_libraries(self):
|
|
"""
|
|
Assert something
|
|
"""
|
|
res = Resources(MockNotifier(), collect_ignores=True)
|
|
res._add_labels('TARGET', ['K64F', 'FRDM'])
|
|
for name, loc in SRC_PATHS.items():
|
|
res.add_directory(loc, into_path=name)
|
|
res.filter_by_libraries(res.get_file_refs(FileType.JSON))
|
|
assert("main.cpp" in res.get_file_names(FileType.CPP_SRC))
|
|
lib_dirs = (
|
|
dirname(name) or "." for name in
|
|
res.get_file_names(FileType.JSON)
|
|
)
|
|
assert(not any(dir in res.ignored_dirs for dir in lib_dirs))
|
|
|
|
def test_filter_by_bm_lib(self):
|
|
res = Resources(MockNotifier(), collect_ignores=True)
|
|
res._add_labels('TARGET', ['K64F', 'FRDM'])
|
|
for name, loc in SRC_PATHS.items():
|
|
res.add_directory(loc, into_path=name)
|
|
libs = [
|
|
ref for ref in res.get_file_refs(FileType.JSON)
|
|
if basename(ref.name) == MBED_LIB_FILENAME
|
|
]
|
|
filter_by = [
|
|
ref for ref in libs
|
|
if join("platform", "bm", "mbed_lib.json") in ref.name
|
|
]
|
|
res.filter_by_libraries(filter_by)
|
|
assert("main.cpp" not in res.get_file_names(FileType.CPP_SRC))
|
|
assert(
|
|
join("mbed-os", "platform", "bm", "bm.cpp")
|
|
in res.get_file_names(FileType.CPP_SRC)
|
|
)
|
|
assert(
|
|
join("mbed-os", "TARGET_FRDM", "not-main.cpp")
|
|
in res.get_file_names(FileType.CPP_SRC)
|
|
)
|
|
inc_names = [dirname(name) or "." for name, _ in filter_by]
|
|
assert(not any(d in res.ignored_dirs for d in inc_names))
|
|
excluded_libs = set(libs) - set(filter_by)
|
|
exc_names = [dirname(name) or "." for name, _ in excluded_libs]
|
|
assert(all(e in res.ignored_dirs for e in exc_names))
|
|
|
|
def test_only_one_linker_script(self):
|
|
"""
|
|
Verify that when multiple linker scripts are added to a resource object,
|
|
only the last one added is used.
|
|
"""
|
|
resources = Resources(MockNotifier())
|
|
linker_scripts = ["first_linker_script.sct", "second_linker_script.sct"]
|
|
for linker_script in linker_scripts:
|
|
resources.add_file_ref(FileType.LD_SCRIPT, linker_script, linker_script)
|
|
|
|
assert(len(resources.get_file_refs(FileType.LD_SCRIPT)) == 1)
|
|
assert(resources.get_file_refs(FileType.LD_SCRIPT)[-1].name == linker_scripts[-1])
|
|
assert(resources.get_file_refs(FileType.LD_SCRIPT)[-1].path == linker_scripts[-1])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|