blob: 23f8601c6e605da22dc16afb1096d46e5baeae23 [file] [log] [blame]
# Copyright 2023 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Test the portage_layout_conf module."""
import os
from typing import List, Optional
import pytest
from chromite.lib import portage_util
from chromite.lint import linters
# pylint: disable=protected-access
@pytest.mark.parametrize(
"data",
(
"""
cache-format = md5-dict
eapis-banned = 0 1 2 3 4 5 6
masters = portage-stable chromiumos eclass-overlay mobbase
profile-formats = portage-2 profile-default-eapi
profile_eapi_when_unspecified = 5-progress
repo-name = labstation
thin-manifests = true
use-manifests = strict
""",
),
)
def test_good(data) -> None:
"""Verify good formats are accepted."""
assert linters.portage_layout_conf.Data(data) == []
@pytest.mark.parametrize(
"data,msg",
(
# Empty file missing a lot of stuff.
("", "cache-format"),
("", "thin-manifests"),
("", "use-manifests"),
# Missing masters.
(
"""
cache-format = md5-dict
profile-formats = portage-2 profile-default-eapi
profile_eapi_when_unspecified = 5-progress
repo-name = labstation
thin-manifests = true
use-manifests = strict
""",
"masters",
),
# Incorrect manifest value.
(
"""
cache-format = md5-dict
profile-formats = portage-2 profile-default-eapi
profile_eapi_when_unspecified = 5-progress
repo-name = labstation
thin-manifests = true
use-manifests = true
""",
"use-manifests",
),
),
)
def test_bad(data, msg) -> None:
"""Verify bad formats are rejected."""
ret = linters.portage_layout_conf.Data(data)
assert ret
assert any(msg in x for x in ret)
def test_eapis_banned() -> None:
"""Verify eapis-banned works correctly."""
def _get(eapis_banned: Optional[str] = None) -> List[str]:
settings = {}
if eapis_banned is not None:
settings["eapis-banned"] = eapis_banned
return list(linters.portage_layout_conf._check_eapis_banned(settings))
# Handle missing key gracefully.
assert _get()
# Handle empty key.
assert _get("")
# Check valid values.
assert not _get("0 1 2 3 4")
assert not _get("0 1 2 3 4 5 6")
# Require older versions if we use it at all.
assert _get("5 6")
# Reject duplicates.
assert _get("0 1 2 3 4 5 6 6")
def test_masters(monkeypatch) -> None:
"""Verify masters works correctly."""
def _get(
masters: Optional[str] = None, repo_name: Optional[str] = None
) -> List[str]:
settings = {}
if masters is not None:
settings["masters"] = masters
if repo_name is not None:
settings["repo-name"] = repo_name
return list(linters.portage_layout_conf._check_masters(settings))
# Setup overlays for public/private checks.
repo_names = (
"portage-stable",
"chromiumos",
"eclass_overlay",
"foo",
"foo-private",
"only-private",
)
monkeypatch.setattr(
portage_util,
"FindOverlays",
lambda *_args, **_kwargs: [f"/overlays/{x}" for x in repo_names],
)
monkeypatch.setattr(portage_util, "GetOverlayName", os.path.basename)
# Handle missing key gracefully.
assert _get()
# Check valid values.
assert not _get("portage-stable chromiumos eclass-overlay")
assert not _get("portage-stable chromiumos eclass-overlay something else")
assert not _get("portage-stable chromiumos eclass-overlay foo foo-private")
assert not _get("portage-stable chromiumos eclass-overlay only-private")
# Handle empty key.
assert _get("")
# Leading values is incorrect.
assert _get("portage-stable eclass-overlay chromiumos")
# Reject duplicates.
assert _get("portage-stable chromiumos eclass-overlay chromiumos")
assert _get("portage-stable chromiumos eclass-overlay a a")
# Reject self-inclusion.
assert _get("portage-stable chromiumos eclass-overlay foo", "foo")
# Reject private-then-public.
assert _get("portage-stable chromiumos eclass-overlay foo-private foo")
# Reject private overlays listed without existing public overlay.
assert _get("portage-stable chromiumos eclass-overlay foo-private")
def test_profile_formats() -> None:
"""Verify profile-formats works correctly."""
def _get(profile_formats: Optional[str] = None) -> List[str]:
settings = {}
if profile_formats is not None:
settings["profile-formats"] = profile_formats
return list(
linters.portage_layout_conf._check_profile_formats(settings)
)
# Handle missing key gracefully.
assert _get()
# Handle empty key.
assert _get("")
# Check valid values.
assert not _get("portage-2 profile-default-eapi")
assert not _get("portage-2 profile-default-eapi profile-bashrcs")
# Check invalid values.
assert _get("portage-2 profile-default-eapi a b c")
# Reject duplicates.
assert _get("portage-2 profile-default-eapi portage-2")