8000 SPDX-2.2 validation by armintaenzertng · Pull Request #490 · spdx/tools-python · GitHub
[go: up one dir, main page]

Skip to content

SPDX-2.2 validation #490

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

Merged
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
Prev Previous commit
Next Next commit
[issue-463] add validation of v2.2 mandatory file fields
Signed-off-by: Armin Tänzer <armin.taenzer@tngtech.com>

[issue-463] fix file validation tests

Signed-off-by: Armin Tänzer <armin.taenzer@tngtech.com>
  • Loading branch information
armintaenzertng committed Feb 2, 2023
commit 07a80f567edb683a70da37007b493ca3ebbea794
23 changes: 17 additions & 6 deletions src/spdx/validation/file_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,32 +20,32 @@
from spdx.validation.validation_message import ValidationMessage, ValidationContext, SpdxElementType


def validate_files(files: List[File], document: Optional[Document] = None) -> List[ValidationMessage]:
def validate_files(files: List[File], version: str, document: Optional[Document] = None) -> List[ValidationMessage]:
validation_messages = []
if document:
for file in files:
validation_messages.extend(validate_file_within_document(file, document))
validation_messages.extend(validate_file_within_document(file, version, document))
else:
for file in files:
validation_messages.extend(validate_file(file))
validation_messages.extend(validate_file(file, version))

return validation_messages


def validate_file_within_document(file: File, document: Document) -> List[ValidationMessage]:
def validate_file_within_document(file: File, version: str, document: Document) -> List[ValidationMessage]:
validation_messages: List[ValidationMessage] = []
context = ValidationContext(spdx_id=file.spdx_id, parent_id=document.creation_info.spdx_id,
element_type=SpdxElementType.FILE, full_element=file)

for message in validate_spdx_id(file.spdx_id, document):
validation_messages.append(ValidationMessage(message, context))

validation_messages.extend(validate_file(file, context))
validation_messages.extend(validate_file(file, version, context))

return validation_messages


def validate_file(file: File, context: Optional[ValidationContext] = None) -> List[ValidationMessage]:
def validate_file(file: File, version: str, context: Optional[ValidationContext] = None) -> List[ValidationMessage]:
validation_messages = []
if not context:
context = ValidationContext(spdx_id=file.spdx_id, element_type=SpdxElementType.FILE, full_element=file)
Expand All @@ -69,4 +69,15 @@ def validate_file(file: File, context: Optional[ValidationContext] = None) -> Li

validation_messages.extend(validate_license_expressions(file.license_info_in_file))

if version == "SPDX-2.2":
if file.license_concluded is None:
validation_messages.append(
ValidationMessage(f"license_concluded is mandatory in SPDX-2.2", context))
if not file.license_info_in_file:
validation_messages.append(
ValidationMessage(f"license_info_in_file is mandatory in SPDX-2.2", context))
if file.copyright_text is None:
validation_messages.append(
ValidationMessage(f"copyright_text is mandatory in SPDX-2.2", context))

return validation_messages
22 changes: 19 additions & 3 deletions tests/spdx/validation/test_file_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,19 @@
# limitations under the License.

from typing import List
from unittest import TestCase

import pytest

from spdx.model.checksum import Checksum, ChecksumAlgorithm
from spdx.validation.file_validator import validate_file_within_document
from spdx.validation.file_validator import validate_file_within_document, validate_file
from spdx.validation.validation_message import ValidationMessage, ValidationContext, SpdxElementType
from tests.spdx.fixtures import file_fixture, document_fixture


def test_valid_file():
file = file_fixture()
validation_messages: List[ValidationMessage] = validate_file_within_document(file, document_fixture())
validation_messages: List[ValidationMessage] = validate_file_within_document(file, "SPDX-2.3", document_fixture())

assert validation_messages == []

Expand All @@ -35,7 +36,7 @@ def test_valid_file():
f'checksums must contain a SHA1 algorithm checksum, but only contains: [<ChecksumAlgorithm.MD2: 13>]')
])
def test_invalid_file(file_input, spdx_id, expected_message):
validation_messages: List[ValidationMessage] = validate_file_within_document(file_input, document_fixture())
validation_messages: List[ValidationMessage] = validate_file_within_document(file_input, "SPDX-2.3", document_fixture())

expected = ValidationMessage(expected_message,
ValidationContext(spdx_id=spdx_id,
Expand All @@ -44,3 +45,18 @@ def test_invalid_file(file_input, spdx_id, expected_message):
full_element=file_input))

assert validation_messages == [expected]


def test_v2_2mandatory_fields():
file = file_fixture(license_concluded=None, license_info_in_file=[], copyright_text=None)

assert validate_file(file, "SPDX-2.3") == []

validation_messages: List[ValidationMessage] = validate_file(file, "SPDX-2.2")

context = ValidationContext(spdx_id=file.spdx_id, element_type=SpdxElementType.FILE, full_element=file)
mandatory_fields = ["license_concluded", "license_info_in_file", "copyright_text"]
expected = [ValidationMessage(f"{field} is mandatory in SPDX-2.2", context) for field in mandatory_fields]

TestCase().assertCountEqual(validation_messages, expected)

0