blob: 258861996b6bcb21194ede9077d725b0ec2af6a2 [file] [log] [blame]
# Copyright 2020 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 CPV parsing module."""
from pathlib import Path
import pytest
from chromite.lib.parser import package_info
def test_parse_cpf():
"""Validate parsing a full CPF."""
cpf = "foo/bar-1.0.0_alpha-r2"
pkg = package_info.parse(cpf)
assert pkg.category == "foo"
assert pkg.package == "bar"
assert pkg.version == "1.0.0_alpha"
assert pkg.revision == 2
assert pkg.cpf == cpf
def test_parse_pv():
"""Validate parsing a PV."""
pkg = package_info.parse("bar-1.2.3_rc1-r5")
assert not pkg.category
assert pkg.package == "bar"
assert pkg.version == "1.2.3_rc1"
assert pkg.revision == 5
def test_parse_atom():
"""Validate parsing an atom."""
pkg = package_info.parse("foo/bar")
assert pkg.category == "foo"
assert pkg.package == "bar"
assert not pkg.version
assert not pkg.revision
def test_parse_path():
"""Validate that parsing an ebuild Path."""
pkg = package_info.parse(Path("foo/bar/bar-1.2.3-r3.ebuild"))
assert pkg.category == "foo"
assert pkg.package == "bar"
assert pkg.version == "1.2.3"
assert pkg.revision == 3
@pytest.mark.xfail(raises=package_info.ParseTypeError)
def test_parse_bad_path():
package_info.parse(Path("not/an/ebuild.txt"))
@pytest.mark.xfail(raises=ValueError)
def test_parse_invalid():
"""Invalid package format."""
package_info.parse("invalid/package/format")
def test_parse_cpv():
"""Verify CPV instance parsing."""
cpv = package_info.SplitCPV("foo/bar-1.2.3-r3")
parsed = package_info.parse("foo/bar-1.2.3-r3")
parsed_cpv = package_info.parse(cpv)
assert parsed == parsed_cpv
def test_parse_pkg_info():
"""Verify PackageInfo instance parsing."""
pkg = package_info.parse("foo/bar-1.2.3-r3")
pkg2 = package_info.parse(pkg)
assert pkg == pkg2
def test_package_info_eq():
"""Test __eq__ method."""
pkg = package_info.PackageInfo("foo", "bar", 1, 2)
pkg2 = package_info.PackageInfo("foo", "bar", "1", "2")
assert pkg == pkg2
pkg = package_info.PackageInfo("foo", "bar", 1)
pkg2 = package_info.PackageInfo("foo", "bar", "1", "0")
pkg3 = package_info.PackageInfo("foo", "bar", "1", 0)
assert pkg == pkg2 == pkg3
def test_package_info_eq_valid_types():
"""Test __eq__ method with different, valid types."""
pkg = package_info.PackageInfo("foo", "bar", 1, 2)
pkg2 = "foo/bar-1-r2"
assert pkg == pkg2
pkg2cpv = package_info.SplitCPV(pkg2)
assert pkg == pkg2cpv
def test_package_info_eq_invalid_types():
"""Test __eq__ method with invalid types."""
class Foo:
"""Empty class for test."""
pkg = package_info.PackageInfo("foo", "bar", 1, 2)
pkg2 = Foo()
# pylint: disable=unneeded-not
assert not pkg == pkg2
assert pkg != pkg2
def _compare_unequal_packages(lesser, greater):
"""Execute all comparison operators for the two given package strings."""
b_str = greater
b_cpv = package_info.SplitCPV(b_str)
a = package_info.parse(lesser)
b = package_info.parse(b_str)
# __lt__.
assert a < b
# __le__.
assert a <= b
# __gt__.
assert b > a
# __ge__.
assert b >= a
# __eq__.
assert a != b
assert a != b_cpv
assert a != b_str
def test_package_info_comparisons_category_diff():
"""Test comparison methods with different categories."""
_compare_unequal_packages("a/pkg-1", "b/pkg-1")
def test_package_info_comparisons_package_diff():
"""Test comparison methods with different packages."""
_compare_unequal_packages("cat/a-1", "cat/b-1")
def test_package_info_comparisons_simple_version_diff():
"""Test comparison methods with simple version difference."""
_compare_unequal_packages("cat/pkg-1", "cat/pkg-2")
def test_package_info_comparisons_multi_part_version_diff():
"""Test comparison methods with a multiple part version difference."""
_compare_unequal_packages("cat/pkg-1.2.3.4", "cat/pkg-1.2.3.8")
def test_package_info_comparisons_revision_diff():
"""Test comparison methods with a revision difference."""
_compare_unequal_packages("cat/pkg-1.2.3-r1", "cat/pkg-1.2.3-r2")
def test_package_info_comparisons_invalid_type():
"""Test comparison methods with invalid types."""
class Foo:
"""Empty class for test."""
a = package_info.PackageInfo("cat", "pkg", "1.2.3", 1)
b = Foo()
# pylint: disable=pointless-statement
with pytest.raises(package_info.InvalidComparisonTypeError):
a > b
with pytest.raises(package_info.InvalidComparisonTypeError):
a >= b
with pytest.raises(package_info.InvalidComparisonTypeError):
a < b
with pytest.raises(package_info.InvalidComparisonTypeError):
a <= b
def test_cpf():
"""Validate CPF handling."""
pkg = package_info.PackageInfo("foo", "bar", "1")
pkg2 = package_info.PackageInfo("foo", "bar", "1", "0")
assert pkg.cpf == "foo/bar-1"
assert pkg2.cpf == pkg.cpf
r1 = package_info.PackageInfo("foo", "bar", "1", "1")
assert r1.cpf == "foo/bar-1-r1"
def test_relative_path():
"""Test the ebuild path method."""
pkg = package_info.PackageInfo("foo", "bar", "1", "0")
assert pkg.relative_path == "foo/bar/bar-1.ebuild"
def test_ebuild_name():
"""Test the ebuild name building."""
pkg = package_info.PackageInfo("foo", "bar", "1", "0")
assert pkg.ebuild == "bar-1.ebuild"
pkg = package_info.PackageInfo("foo", "bar", "1", "2")
assert pkg.ebuild == "bar-1-r2.ebuild"
def test_revision_bump():
"""Test the revision_bump method."""
pkg = package_info.PackageInfo("foo", "bar", "1")
bumped = pkg.revision_bump()
bumped2 = bumped.revision_bump()
assert pkg.cpf == "foo/bar-1"
assert bumped.cpf == "foo/bar-1-r1"
assert bumped2.cpf == "foo/bar-1-r2"
def test_with_version_no_revision():
"""Test the with_version method with no revision specified."""
pkg = package_info.PackageInfo("foo", "bar", "1")
pkg2 = pkg.with_version("2")
assert pkg.cpf == "foo/bar-1"
assert pkg2.cpf == "foo/bar-2"
def test_with_version_with_revision():
"""Test the with_version method with a revision specified."""
pkg = package_info.PackageInfo("foo", "bar", "1", "1")
pkg2 = pkg.with_version("2")
assert pkg.cpf == "foo/bar-1-r1"
assert pkg2.cpf == "foo/bar-2"