| # Copyright 2022 The ChromiumOS Authors | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| """Unittests for ebuild license parsing module.""" | |
| import pytest | |
| from chromite.lib.parser import ebuild_license | |
| from chromite.lib.parser import pms_dependency | |
| TEST_CASES_PARSE_BASIC = ( | |
| ("", None, []), | |
| ("BSD", None, ["BSD"]), | |
| ("BSD BSD", "BSD", ["BSD"]), | |
| ("BSD GPL BAR LIC", None, ["BSD", "GPL", "BAR", "LIC"]), | |
| (" BSD\tGPL\nBAR ", "BSD GPL BAR", ["BSD", "GPL", "BAR"]), | |
| ) | |
| @pytest.mark.parametrize("test,exp,reduced", TEST_CASES_PARSE_BASIC) | |
| def test_parse_basic(test, exp, reduced): | |
| """Verify basic license parsing.""" | |
| if exp is None: | |
| exp = test | |
| licenses = ebuild_license.parse(test) | |
| assert str(licenses) == exp | |
| assert licenses.reduce() == reduced | |
| TEST_CASES_PARSE_ANY_OF = ( | |
| ("|| ( BSD )", None, ["BSD"]), | |
| ("|| ( BSD BSD )", "|| ( BSD )", ["BSD"]), | |
| ("||\t(\nBSD\n)", "|| ( BSD )", ["BSD"]), | |
| ("|| ( BSD\tGPL )", "|| ( BSD GPL )", ["BSD"]), | |
| ("|| ( BSD GPL ) GPL-2", None, ["BSD", "GPL-2"]), | |
| ("BSD-1 || ( BSD GPL )", None, ["BSD-1", "BSD"]), | |
| ("BSD-1 || ( BSD GPL ) GPL-2", None, ["BSD-1", "BSD", "GPL-2"]), | |
| ( | |
| "BSD-1 || ( BSD GPL ) || ( BSD-2 GPL-3 )", | |
| None, | |
| ["BSD-1", "BSD", "BSD-2"], | |
| ), | |
| ) | |
| @pytest.mark.parametrize("test,exp,reduced", TEST_CASES_PARSE_ANY_OF) | |
| def test_parse_any_of(test, exp, reduced): | |
| """Verify ||() parsing.""" | |
| if exp is None: | |
| exp = test | |
| licenses = ebuild_license.parse(test) | |
| assert str(licenses) == exp | |
| assert licenses.reduce() == reduced | |
| TEST_CASES_PARSE_USE = ( | |
| ("foo? ( BSD )", None, []), | |
| ("foo? ( BSD )", ["foo"], ["BSD"]), | |
| ("BSD-1 foo? ( BSD )", None, ["BSD-1"]), | |
| ("foo? ( BSD ) GPL-2", None, ["GPL-2"]), | |
| ("foo? ( BSD ) !foo? ( BAR ) GPL-2", None, ["BAR", "GPL-2"]), | |
| ("foo? ( BSD flag? ( BSD-1 ) ) !foo? ( BA ) GPL-2", None, ["BA", "GPL-2"]), | |
| ("foo? ( flag? ( BSD ) )", ["foo"], []), | |
| ("foo? ( flag? ( BSD ) )", ["flag"], []), | |
| ("foo? ( flag? ( BSD ) )", ["foo", "flag"], ["BSD"]), | |
| ) | |
| @pytest.mark.parametrize("test,flags,reduced", TEST_CASES_PARSE_USE) | |
| def test_parse_use(test, flags, reduced): | |
| """Verify flag?() parsing.""" | |
| licenses = ebuild_license.parse(test) | |
| assert str(licenses) == test | |
| assert licenses.reduce(use_flags=flags) == reduced | |
| TEST_CASES_PARSE_GROUPS = ( | |
| ("( A B )", None, ["A", "B"]), | |
| ("( ( A ( B ) ) )", None, ["A", "B"]), | |
| ("|| ( ( A ) B )", None, ["A"]), | |
| ("|| ( ( A B ) C )", None, ["A", "B"]), | |
| ("|| ( A ( B ) C )", None, ["A"]), | |
| ("|| ( ( ( A ) ) )", None, ["A"]), | |
| ) | |
| @pytest.mark.parametrize("test,flags,reduced", TEST_CASES_PARSE_GROUPS) | |
| def test_parse_groups(test, flags, reduced): | |
| """Verify group parsing.""" | |
| licenses = ebuild_license.parse(test) | |
| assert str(licenses) == test | |
| assert licenses.reduce(use_flags=flags) == reduced | |
| def test_parse_any_of_use(): | |
| """Verify ||(flag?()) parsing.""" | |
| test = "GPL-1 || ( foo? ( || ( BSD BSD-2 ) ) BSD-3 )" | |
| licenses = ebuild_license.parse(test) | |
| assert str(licenses) == test | |
| assert licenses.reduce() == ["GPL-1", "BSD-3"] | |
| assert licenses.reduce(use_flags=["foo"]) == ["GPL-1", "BSD"] | |
| def test_any_of_reduce(): | |
| """Verify ||() reduction.""" | |
| test = "GPL-1 || ( BSD-1 foo? ( BSD-2 ) BSD-3 )" | |
| licenses = ebuild_license.parse(test) | |
| assert licenses.reduce() == ["GPL-1", "BSD-1"] | |
| def pick1(choices): | |
| return "BSD-1" if "BSD-1" in choices else choices[0] | |
| assert licenses.reduce(anyof_reduce=pick1) == ["GPL-1", "BSD-1"] | |
| def pick2(choices): | |
| return "BSD-2" if "BSD-2" in choices else choices[0] | |
| assert licenses.reduce(anyof_reduce=pick2) == ["GPL-1", "BSD-1"] | |
| assert licenses.reduce(use_flags=["foo"], anyof_reduce=pick2) == [ | |
| "GPL-1", | |
| "BSD-2", | |
| ] | |
| def pick3(choices): | |
| return "BSD-3" if "BSD-3" in choices else choices[0] | |
| assert licenses.reduce(anyof_reduce=pick3) == ["GPL-1", "BSD-3"] | |
| @pytest.mark.xfail(raises=pms_dependency.PmsNameError) | |
| def test_invalid_license_name(): | |
| """Handle invalid license names.""" | |
| ebuild_license.parse("BSD!!!") | |
| TEST_CASES_INVALID_SYNTAX = ( | |
| "|| ( BSD", | |
| "( BSD )", | |
| "BSD )", | |
| "|| foo? ( BSD )", | |
| ) | |
| @pytest.mark.parametrize("test", TEST_CASES_INVALID_SYNTAX) | |
| @pytest.mark.xfail(raises=pms_dependency.PmsSyntaxError) | |
| def test_invalid_syntax(test): | |
| """Handle invalid syntax.""" | |
| ebuild_license.parse(test) |