| # |
| # Copyright OpenEmbedded Contributors |
| # |
| # SPDX-License-Identifier: MIT |
| # |
| |
| from unittest.case import TestCase |
| import oe.license |
| |
| class SeenVisitor(oe.license.LicenseVisitor): |
| def __init__(self): |
| self.seen = [] |
| oe.license.LicenseVisitor.__init__(self) |
| |
| def visit_Str(self, node): |
| self.seen.append(node.s) |
| |
| class TestSingleLicense(TestCase): |
| licenses = [ |
| "GPL-2.0-only", |
| "LGPL-2.0-only", |
| "Artistic-1.0", |
| "MIT", |
| "GPL-3.0-or-later", |
| "FOO_BAR", |
| ] |
| invalid_licenses = ["GPL/BSD"] |
| |
| @staticmethod |
| def parse(licensestr): |
| visitor = SeenVisitor() |
| visitor.visit_string(licensestr) |
| return visitor.seen |
| |
| def test_single_licenses(self): |
| for license in self.licenses: |
| licenses = self.parse(license) |
| self.assertListEqual(licenses, [license]) |
| |
| def test_invalid_licenses(self): |
| for license in self.invalid_licenses: |
| with self.assertRaises(oe.license.InvalidLicense) as cm: |
| self.parse(license) |
| self.assertEqual(cm.exception.license, license) |
| |
| class TestSimpleCombinations(TestCase): |
| tests = { |
| "FOO&BAR": ["FOO", "BAR"], |
| "BAZ & MOO": ["BAZ", "MOO"], |
| "ALPHA|BETA": ["ALPHA"], |
| "BAZ&MOO|FOO": ["FOO"], |
| "FOO&BAR|BAZ": ["FOO", "BAR"], |
| } |
| preferred = ["ALPHA", "FOO", "BAR"] |
| |
| def test_tests(self): |
| def choose(a, b): |
| if all(lic in self.preferred for lic in b): |
| return b |
| else: |
| return a |
| |
| for license, expected in self.tests.items(): |
| licenses = oe.license.flattened_licenses(license, choose) |
| self.assertListEqual(licenses, expected) |
| |
| class TestComplexCombinations(TestSimpleCombinations): |
| tests = { |
| "FOO & (BAR | BAZ)&MOO": ["FOO", "BAR", "MOO"], |
| "(ALPHA|(BETA&THETA)|OMEGA)&DELTA": ["OMEGA", "DELTA"], |
| "((ALPHA|BETA)&FOO)|BAZ": ["BETA", "FOO"], |
| "(GPL-2.0-only|Proprietary)&BSD-4-clause&MIT": ["GPL-2.0-only", "BSD-4-clause", "MIT"], |
| } |
| preferred = ["BAR", "OMEGA", "BETA", "GPL-2.0-only"] |
| |
| class TestIsIncluded(TestCase): |
| tests = { |
| ("FOO | BAR", None, None): |
| [True, ["FOO"]], |
| ("FOO | BAR", None, "FOO"): |
| [True, ["BAR"]], |
| ("FOO | BAR", "BAR", None): |
| [True, ["BAR"]], |
| ("FOO | BAR & FOOBAR", "*BAR", None): |
| [True, ["BAR", "FOOBAR"]], |
| ("FOO | BAR & FOOBAR", None, "FOO*"): |
| [False, ["FOOBAR"]], |
| ("(FOO | BAR) & FOOBAR | BARFOO", None, "FOO"): |
| [True, ["BAR", "FOOBAR"]], |
| ("(FOO | BAR) & FOOBAR | BAZ & MOO & BARFOO", None, "FOO"): |
| [True, ["BAZ", "MOO", "BARFOO"]], |
| ("GPL-3.0-or-later & GPL-2.0-only & LGPL-2.1-only | Proprietary", None, None): |
| [True, ["GPL-3.0-or-later", "GPL-2.0-only", "LGPL-2.1-only"]], |
| ("GPL-3.0-or-later & GPL-2.0-only & LGPL-2.1-only | Proprietary", None, "GPL-3.0-or-later"): |
| [True, ["Proprietary"]], |
| ("GPL-3.0-or-later & GPL-2.0-only & LGPL-2.1-only | Proprietary", None, "GPL-3.0-or-later Proprietary"): |
| [False, ["GPL-3.0-or-later"]] |
| } |
| |
| def test_tests(self): |
| for args, expected in self.tests.items(): |
| is_included, licenses = oe.license.is_included( |
| args[0], (args[1] or '').split(), (args[2] or '').split()) |
| self.assertEqual(is_included, expected[0]) |
| self.assertListEqual(licenses, expected[1]) |