Skip to content

Commit bb4a265

Browse files
[issue-378] implement invalidation of duplicated SPDX Ids
Signed-off-by: Armin Tänzer <armin.taenzer@tngtech.com>
1 parent e25467f commit bb4a265

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/spdx/validation/document_validator.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from spdx.validation.package_validator import validate_packages
2222
from spdx.validation.relationship_validator import validate_relationships
2323
from spdx.validation.snippet_validator import validate_snippets
24+
from spdx.validation.spdx_id_validators import get_list_of_all_spdx_ids
2425
from spdx.validation.validation_message import ValidationMessage, ValidationContext, SpdxElementType
2526

2627

@@ -74,4 +75,16 @@ def validate_full_spdx_document(document: Document, spdx_version: str = None) ->
7475
ValidationContext(spdx_id=document_id,
7576
element_type=SpdxElementType.DOCUMENT)))
7677

78+
all_spdx_ids: List[str] = get_list_of_all_spdx_ids(document)
79+
auxiliary_set = set()
80+
duplicated_spdx_ids = set(
81+
spdx_id for spdx_id in all_spdx_ids if spdx_id in auxiliary_set or auxiliary_set.add(spdx_id))
82+
83+
if duplicated_spdx_ids:
84+
validation_messages.append(
85+
ValidationMessage(
86+
f"every spdx_id must be unique within the document, but found the following duplicates: {sorted(duplicated_spdx_ids)}",
87+
context)
88+
)
89+
7790
return validation_messages

tests/spdx/validation/test_document_validator.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from spdx.model.document import Document, CreationInfo
1717
from spdx.validation.document_validator import validate_full_spdx_document
1818
from spdx.validation.validation_message import ValidationMessage, ValidationContext, SpdxElementType
19-
from tests.spdx.fixtures import document_fixture, creation_info_fixture
19+
from tests.spdx.fixtures import document_fixture, creation_info_fixture, file_fixture, package_fixture, snippet_fixture
2020

2121

2222
def test_valid_document():
@@ -56,3 +56,18 @@ def test_spdx_version_handling(creation_info: CreationInfo, version_input: str,
5656
assert validation_messages == expected
5757

5858
# TODO: https://github.com/spdx/tools-python/issues/375
59+
60+
61+
def test_duplicated_spdx_ids():
62+
document = document_fixture(
63+
files=[file_fixture(spdx_id="SPDXRef-File"), file_fixture(spdx_id="SPDXRef-2"), file_fixture(spdx_id="SPDXRef-3")],
64+
packages=[package_fixture(spdx_id="SPDXRef-2"), package_fixture(spdx_id="SPDXRef-DOCUMENT")],
65+
snippets=[snippet_fixture(spdx_id="SPDXRef-2"), snippet_fixture(spdx_id="SPDXRef-3")])
66+
67+
context = ValidationContext(spdx_id=document.creation_info.spdx_id, element_type=SpdxElementType.DOCUMENT)
68+
69+
validation_messages: List[ValidationMessage] = validate_full_spdx_document(document)
70+
71+
assert validation_messages == [ValidationMessage(
72+
"every spdx_id must be unique within the document, but found the following duplicates: ['SPDXRef-2', 'SPDXRef-3', 'SPDXRef-DOCUMENT']",
73+
context)]

0 commit comments

Comments
 (0)