blob: b3e0d6724c666953d84b33ae731b6fac405c3011 [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
# Copyright 2023 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for SpdxWriter."""
import json
import unittest
from unittest import mock
from file_access import FileAccess
from spdx_writer import SpdxWriter
from gn_label import GnLabel
class SpdxWriterTest(unittest.TestCase):
writer: SpdxWriter
def setUp(self) -> None:
self.maxDiff = None
self.mock_file_access = mock.MagicMock(spec=FileAccess)
self.writer = SpdxWriter.create(
root_package_name="root pkg",
file_access=self.mock_file_access,
)
return super().setUp()
def test_empty_doc(self) -> None:
self.writer.save_to_string()
self.assertEqual(
self.writer.save_to_string(),
"""{
"spdxVersion": "SPDX-2.2",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "root pkg",
"documentNamespace": "",
"creationInfo": {
"creators": [
"Tool: spdx_writer.py"
]
},
"dataLicense": "CC0-1.0",
"documentDescribes": [
"SPDXRef-Package-0"
],
"packages": [
{
"SPDXID": "SPDXRef-Package-0",
"name": "root pkg"
}
],
"relationships": [],
"hasExtractedLicensingInfos": []
}""",
)
def test_add_package_with_licenses(self) -> None:
self.mock_file_access.read_text.side_effect = (
lambda label: f"TEXT FROM {label.path_str}"
)
self.writer.add_package_with_licenses(
public_package_name="Foo Pkg",
license_labels=(GnLabel.from_str("//foo/license"),),
collection_hints=["unit test"],
)
self.writer.add_package_with_licenses(
public_package_name="Bar Pkg",
license_labels=(
GnLabel.from_str("//bar/license"),
GnLabel.from_str("//bar/license2"),
),
collection_hints=["unit test"],
)
# Add again - should have no effect
self.writer.add_package_with_licenses(
public_package_name="Foo Pkg",
license_labels=(GnLabel.from_str("//foo/license"),),
collection_hints=["unit test"],
)
self.assertEqual(
self.writer.save_to_string(),
"""{
"spdxVersion": "SPDX-2.2",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "root pkg",
"documentNamespace": "",
"creationInfo": {
"creators": [
"Tool: spdx_writer.py"
]
},
"dataLicense": "CC0-1.0",
"documentDescribes": [
"SPDXRef-Package-0",
"SPDXRef-Package-1",
"SPDXRef-Package-2",
"SPDXRef-Package-3"
],
"packages": [
{
"SPDXID": "SPDXRef-Package-2",
"name": "Bar Pkg",
"licenseConcluded": "LicenseRef-0dcba69b66f45540d511c563444945d3 AND LicenseRef-739e71ca1f5d900c23c830d2cf935551",
"_hint": [
"unit test"
]
},
{
"SPDXID": "SPDXRef-Package-1",
"name": "Foo Pkg",
"licenseConcluded": "LicenseRef-4d3799f5b92cbb6482396246f83fac64",
"_hint": [
"unit test"
]
},
{
"SPDXID": "SPDXRef-Package-3",
"name": "Foo Pkg",
"licenseConcluded": "LicenseRef-4d3799f5b92cbb6482396246f83fac64",
"_hint": [
"unit test"
]
},
{
"SPDXID": "SPDXRef-Package-0",
"name": "root pkg"
}
],
"relationships": [
{
"spdxElementId": "SPDXRef-Package-0",
"relatedSpdxElement": "SPDXRef-Package-1",
"relationshipType": "CONTAINS"
},
{
"spdxElementId": "SPDXRef-Package-0",
"relatedSpdxElement": "SPDXRef-Package-2",
"relationshipType": "CONTAINS"
},
{
"spdxElementId": "SPDXRef-Package-0",
"relatedSpdxElement": "SPDXRef-Package-3",
"relationshipType": "CONTAINS"
}
],
"hasExtractedLicensingInfos": [
{
"name": "Bar Pkg",
"licenseId": "LicenseRef-0dcba69b66f45540d511c563444945d3",
"extractedText": "TEXT FROM bar/license2",
"crossRefs": [
{
"url": "https://cs.opensource.google/fuchsia/fuchsia/+/main:bar/license2"
}
],
"_hint": [
"unit test"
]
},
{
"name": "Bar Pkg",
"licenseId": "LicenseRef-739e71ca1f5d900c23c830d2cf935551",
"extractedText": "TEXT FROM bar/license",
"crossRefs": [
{
"url": "https://cs.opensource.google/fuchsia/fuchsia/+/main:bar/license"
}
],
"_hint": [
"unit test"
]
},
{
"name": "Foo Pkg",
"licenseId": "LicenseRef-4d3799f5b92cbb6482396246f83fac64",
"extractedText": "TEXT FROM foo/license",
"crossRefs": [
{
"url": "https://cs.opensource.google/fuchsia/fuchsia/+/main:foo/license"
}
],
"_hint": [
"unit test"
]
}
]
}""",
)
def test_nested_spdx_document(self) -> None:
nested_doc_spdx_json = json.loads(
"""{
"spdxVersion": "SPDX-2.2",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "some project",
"documentNamespace": "",
"creationInfo": {
"creators": [ "unknown" ]
},
"documentDescribes": [
"SPDXRef-Package-A",
"SPDXRef-Package-B"
],
"packages": [
{
"SPDXID": "SPDXRef-Package-A",
"name": "Pkg A",
"licenseConcluded": "LicenseRef-1"
},
{
"SPDXID": "SPDXRef-Package-B",
"name": "Pkg B",
"licenseConcluded": "LicenseRef-2"
}
],
"relationships": [
{
"spdxElementId": "SPDXRef-Package-A",
"relatedSpdxElement": "SPDXRef-Package-B",
"relationshipType": "CONTAINS"
}
],
"hasExtractedLicensingInfos": [
{
"name": "License A",
"licenseId": "LicenseRef-1",
"extractedText": "License text 1"
},
{
"name": "License B",
"licenseId": "LicenseRef-2",
"extractedText": "License text 2"
}
]
}"""
)
self.mock_file_access.read_json.return_value = nested_doc_spdx_json
self.writer.add_package_with_licenses(
public_package_name="Sub Project",
license_labels=(
GnLabel.from_str("//some/path/to/license.spdx.json"),
),
collection_hints=["unit test"],
)
self.assertEqual(
self.writer.save_to_string(),
"""{
"spdxVersion": "SPDX-2.2",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "root pkg",
"documentNamespace": "",
"creationInfo": {
"creators": [
"Tool: spdx_writer.py"
]
},
"dataLicense": "CC0-1.0",
"documentDescribes": [
"SPDXRef-Package-0",
"SPDXRef-Package-1",
"SPDXRef-Package-2",
"SPDXRef-Package-3"
],
"packages": [
{
"SPDXID": "SPDXRef-Package-2",
"name": "Pkg A",
"licenseConcluded": "LicenseRef-767eeeb3caf0024a6910b45885880f56"
},
{
"SPDXID": "SPDXRef-Package-3",
"name": "Pkg B",
"licenseConcluded": "LicenseRef-a76019994a4981e5870988c499093775"
},
{
"SPDXID": "SPDXRef-Package-1",
"name": "Sub Project",
"_hint": [
"unit test"
]
},
{
"SPDXID": "SPDXRef-Package-0",
"name": "root pkg"
}
],
"relationships": [
{
"spdxElementId": "SPDXRef-Package-0",
"relatedSpdxElement": "SPDXRef-Package-1",
"relationshipType": "CONTAINS"
},
{
"spdxElementId": "SPDXRef-Package-1",
"relatedSpdxElement": "SPDXRef-Package-2",
"relationshipType": "CONTAINS"
},
{
"spdxElementId": "SPDXRef-Package-2",
"relatedSpdxElement": "SPDXRef-Package-3",
"relationshipType": "CONTAINS"
}
],
"hasExtractedLicensingInfos": [
{
"name": "License A",
"licenseId": "LicenseRef-767eeeb3caf0024a6910b45885880f56",
"extractedText": "License text 1"
},
{
"name": "License B",
"licenseId": "LicenseRef-a76019994a4981e5870988c499093775",
"extractedText": "License text 2"
}
]
}""",
)
if __name__ == "__main__":
unittest.main()