blob: 39dff686cedabc77d4a2e21b5e07db85fd619c91 [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.
"""Configuration and fixtures for pytest.
See the following doc link for an explanation of conftest.py and how it is used
by pytest:
https://docs.pytest.org/en/latest/fixture.html#conftest-py-sharing-fixture-functions
"""
from pathlib import Path
from unittest import mock
import pytest
import chromite as cr
from chromite.lib import build_query
from chromite.lib import osutils
from chromite.test import portage_testables
@pytest.fixture
def overlay_stack(tmp_path_factory):
"""Factory for stacked Portage overlays.
The factory function takes an integer argument and returns an iterator of
that many overlays, each of which has all prior overlays as parents.
"""
def make_overlay_stack(height):
if not height <= len(cr.test.Overlay.HIERARCHY_NAMES):
raise ValueError(
"Overlay stacks taller than %s are not supported. Received: %s"
% (len(cr.test.Overlay.HIERARCHY_NAMES), height)
)
overlays = []
for i in range(height):
overlays.append(
cr.test.Overlay(
root_path=tmp_path_factory.mktemp(
"overlay-" + cr.test.Overlay.HIERARCHY_NAMES[i]
),
name=cr.test.Overlay.HIERARCHY_NAMES[i],
parent_overlays=overlays,
)
)
yield overlays[i]
return make_overlay_stack
# pylint: disable=redefined-outer-name
@pytest.fixture
def simple_sysroot(overlay_stack, tmp_path):
"""Create the simplest possible sysroot."""
# pylint: disable=redefined-outer-name
(overlay,) = overlay_stack(1)
profile = overlay.create_profile()
return cr.test.Sysroot(tmp_path, profile, [overlay])
@pytest.fixture
def fake_build_query_overlays(tmp_path):
"""Fake out the overlays for the build_query module."""
portage_stable = portage_testables.Overlay(
root_path=tmp_path / "portage-stable", name="portage-stable"
)
chromiumos_overlay = portage_testables.Overlay(
root_path=tmp_path / "chromiumos-overlay", name="chromiumos"
)
eclass_overlay = portage_testables.Overlay(
root_path=tmp_path / "eclass-overlay", name="eclass-overlay"
)
baseboard_fake = portage_testables.Overlay(
root_path=tmp_path / "baseboard-fake",
name="baseboard-fake",
)
baseboard_fake.create_profile(
make_defaults={
"ARCH": "amd64",
"USE": "some another masked not_masked bootimage",
"USE_EXPAND": "SOME_VAR",
"SOME_VAR": "baseboard_val",
},
use_mask=["masked", "not_masked"],
use_force=["amd64"],
)
overlay_fake = portage_testables.Overlay(
root_path=tmp_path / "overlay-fake",
name="fake",
parent_overlays=[baseboard_fake],
)
overlay_fake.create_profile(
make_defaults={
"USE": "fake -another -baseboard_fake_private kernel-6_1",
"SOME_VAR": "-* board_val",
"ANOTHER_VAR": "one_val another_val",
"USE_EXPAND": "ANOTHER_VAR",
},
profile_parents=[baseboard_fake.profiles[Path("base")]],
use_mask=["-not_masked"],
)
overlay_fake.add_package(
portage_testables.Package(
category="chromeos-base",
package="chromeos-bsp-fake",
version="0.0.1-r256",
IUSE="another internal +static",
inherit=["cros-workon", "chromeos-bsp"],
keywords="*",
)
)
overlay_fake.add_package(
portage_testables.Package(
category="chromeos-base",
package="chromeos-bsp-fake",
version="9999",
IUSE="another internal +static",
inherit=["cros-workon", "chromeos-bsp"],
keywords="~*",
)
)
baseboard_fake_private = portage_testables.Overlay(
root_path=tmp_path / "baseboard-fake-private",
name="baseboard-fake-private",
parent_overlays=[baseboard_fake],
)
baseboard_fake_private.create_profile(
make_defaults={"USE": "baseboard_fake_private"},
profile_parents=[baseboard_fake.profiles[Path("base")]],
)
overlay_fake_private = portage_testables.Overlay(
root_path=tmp_path / "overlay-fake-private",
name="fake-private",
parent_overlays=[overlay_fake],
make_conf={
"CHOST": "x86_64-pc-linux-gnu",
"USE": "internal",
},
)
overlay_fake_private.create_profile(
make_defaults={"SOME_VAR": "private_val"},
profile_parents=[
baseboard_fake_private.profiles[Path("base")],
overlay_fake.profiles[Path("base")],
],
)
overlay_fake_private.create_profile(
"alt-profile",
make_defaults={"USE": "alt_profile"},
profile_parents=[
overlay_fake_private.profiles[Path("base")],
],
)
overlay_fake_private.add_package(
portage_testables.Package(
category="chromeos-base",
package="chromeos-bsp-fake-private",
version="0.0.1",
IUSE="another internal +static",
inherit=["cros-workon", "chromeos-bsp"],
keywords="-* ~amd64",
)
)
overlay_fake_private.add_package(
portage_testables.Package(
category="chromeos-base",
package="chromeos-bsp-fake-private",
version="9999",
IUSE="another internal +static",
inherit=["cros-workon", "chromeos-bsp"],
keywords="~* amd64",
)
)
overlay_faux_private = portage_testables.Overlay(
root_path=tmp_path / "overlay-faux-private",
name="faux-private",
parent_overlays=[
baseboard_fake,
overlay_fake,
baseboard_fake_private,
overlay_fake_private,
],
)
overlay_faux_private.create_profile(
path=Path("symlinked"),
profile_parents=[
overlay_fake_private.profiles[Path("base")],
],
)
osutils.SafeSymlink(
"symlinked", overlay_faux_private.path / "profiles" / "base"
)
overlay_foo_private = portage_testables.Overlay(
root_path=tmp_path / "overlay-foo-private",
name="foo-private",
)
overlay_foo_private.create_profile(
make_defaults={
"USE": "kernel-5_15",
},
)
overlays = [
portage_stable,
chromiumos_overlay,
eclass_overlay,
baseboard_fake,
overlay_fake,
baseboard_fake_private,
overlay_fake_private,
overlay_faux_private,
overlay_foo_private,
]
with mock.patch(
"chromite.lib.portage_util.FindOverlays",
return_value=[str(x.path) for x in overlays],
):
# We just changed the overlays with our mock, we need to clear the
# cache.
# pylint: disable=protected-access
build_query._get_all_overlays_by_name.cache_clear()
yield overlays