Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

database: multiple bugfixes #393

Merged
merged 13 commits into from
Sep 6, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions Pipfile
Javagedes marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.11"
2 changes: 1 addition & 1 deletion edk2toollib/database/queries/unused_component_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,4 @@ def _recurse_inf(self, inf, table, library_list):
library_list.append(inf)

for inf in result["LIBRARIES_USED"]:
self._recurse_inf(inf, table, library_list)
self._recurse_inf(inf[1], table, library_list)
25 changes: 18 additions & 7 deletions edk2toollib/database/tables/instanced_inf_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,9 @@ def _parse_inf_recursively(

logging.debug(f" Parsing Library: [{inf}]")
visited.append(inf)
library_instances = []
library_instance_list = []
library_class_list = []


#
# 0. Use the existing parser to parse the INF file. This parser parses an INF as an independent file
Expand All @@ -137,20 +139,29 @@ def _parse_inf_recursively(
# any overrides for this component
#
for lib in infp.get_libraries(self.arch):
lib = lib.split(" ")[0].lower()
library_instances.append(self._lib_to_instance(lib, scope, library_dict, override_dict))
lib = lib.split(" ")[0]
library_instance_list.append(self._lib_to_instance(lib.lower(), scope, library_dict, override_dict))
library_class_list.append(lib)
# Append all NULL library instances
for null_lib in override_dict["NULL"]:
library_instances.append(null_lib)
library_instance_list.append(null_lib)
library_class_list.append("NULL")

library_instances = list(filter(lambda lib: lib is not None, library_instances))
to_parse = list(filter(lambda lib: lib is not None, library_instance_list))

# Time to visit in libraries that we have not visited yet.
to_return = []
for library in filter(lambda lib: lib not in visited, library_instances):
for library in filter(lambda lib: lib not in visited, to_parse):
to_return += self._parse_inf_recursively(library, component,
library_dict, override_dict, scope, visited)

# Transform path to edk2 relative form (POSIX)
def to_posix(path):
if path is None:
return None
return Path(path).as_posix()
library_instance_list = list(map(to_posix, library_instance_list))

# Return Paths as posix paths, which is Edk2 standard.
to_return.append({
"DSC": Path(self.dsc).name,
Expand All @@ -160,7 +171,7 @@ def _parse_inf_recursively(
"MODULE_TYPE": infp.Dict["MODULE_TYPE"],
"ARCH": scope.split(".")[0].upper(),
"SOURCES_USED": list(map(lambda p: Path(p).as_posix(), infp.Sources)),
"LIBRARIES_USED": list(map(lambda p: Path(p).as_posix(), library_instances)),
"LIBRARIES_USED": list(zip(library_class_list, library_instance_list)),
"PROTOCOLS_USED": [], # TODO
"GUIDS_USED": [], # TODO
"PPIS_USED": [], # TODO
Expand Down
2 changes: 1 addition & 1 deletion tests.unit/database/test_component_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def test_simple_component(empty_tree: Tree):
result = db.search(ComponentQuery(component = "TestDriver1"))
assert len(result) == 1

assert sorted(result[0]['LIBRARIES_USED']) == sorted(['TestPkg/Library/TestLib2.inf', 'TestPkg/Library/TestLib3.inf'])
assert sorted(result[0]['LIBRARIES_USED']) == sorted([('TestCls','TestPkg/Library/TestLib2.inf'), ('NULL','TestPkg/Library/TestLib3.inf')])

result = db.search(ComponentQuery(component = "NonExistantDriver"))
assert len(result) == 0
10 changes: 5 additions & 5 deletions tests.unit/database/test_instanced_inf_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,8 @@ def test_library_override(empty_tree: Tree):
# Ensure the Test Driver is using TestLib2 from the override and the NULL library was added
for row in db.table("instanced_inf").all():
if (row["NAME"] == Path(comp1).stem
and Path(lib2).as_posix() in row["LIBRARIES_USED"]
and Path(lib3).as_posix() in row["LIBRARIES_USED"]):
and ("TestCls", Path(lib2).as_posix()) in row["LIBRARIES_USED"]
and ("NULL", Path(lib3).as_posix()) in row["LIBRARIES_USED"]):
break
else:
assert False
Expand Down Expand Up @@ -172,7 +172,7 @@ def test_scoped_libraries1(empty_tree: Tree):
# For each driver, verify that the the driver number (1, 2, 3) uses the corresponding lib number (1, 2, 3)
for row in db.table("instanced_inf").all():
if "COMPONENT" not in row: # Only care about looking at drivers, which do not have a component
assert row["NAME"].replace("Driver", "Lib") in row["LIBRARIES_USED"][0]
assert row["NAME"].replace("Driver", "Lib") in row["LIBRARIES_USED"][0][1]

def test_scoped_libraries2(empty_tree: Tree):
"""Ensure that the correct libraries in regards to scoping.
Expand Down Expand Up @@ -207,7 +207,7 @@ def test_scoped_libraries2(empty_tree: Tree):

for row in db.table("instanced_inf").all():
if "COMPONENT" not in row:
assert row["NAME"].replace("Driver", "Lib") in row["LIBRARIES_USED"][0]
assert row["NAME"].replace("Driver", "Lib") in row["LIBRARIES_USED"][0][1]

def test_missing_library(empty_tree: Tree, caplog):
"""Test when a library is missing."""
Expand Down Expand Up @@ -294,4 +294,4 @@ def test_skip_library_with_unsupported_module_type(empty_tree: Tree):
component_list = db.table("instanced_inf").search(~Query().COMPONENT.exists())
assert len(component_list) == 2
for component in component_list:
assert component["LIBRARIES_USED"][0] == Path(testlib2).as_posix()
assert component["LIBRARIES_USED"][0] == ("TestCls", Path(testlib2).as_posix())