# 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.

"""Unit tests for test/portage module."""

import pytest  # pylint: disable=import-error

import chromite as cr


# Pytest's method of declaring fixtures causes Pylint to complain about
# redefined outer names.
# pylint: disable=redefined-outer-name

_OVERLAY_STACK_PARAMS = list(range(1, len(cr.test.Overlay.HIERARCHY_NAMES) + 1))


@pytest.mark.parametrize("height", _OVERLAY_STACK_PARAMS)
def test_overlay_stack_parents(height, overlay_stack):
    """Test that overlays have the correct parents set."""
    overlays = list(overlay_stack(height))

    assert overlays[0].parent_overlays is None

    for x in range(1, height):
        assert overlays[x].parent_overlays == tuple(overlays[:x])


@pytest.mark.parametrize("height", _OVERLAY_STACK_PARAMS)
def test_overlay_stack_names(height, overlay_stack):
    """Test that generated overlays have the expected names."""
    overlays = overlay_stack(height)

    for i, o in enumerate(overlays):
        assert o.name == cr.test.Overlay.HIERARCHY_NAMES[i]


@pytest.fixture
def minimal_sysroot(overlay_stack, tmp_path_factory):
    """Set up a barebones sysroot with a single associated overlay."""
    (overlay,) = overlay_stack(1)
    path = tmp_path_factory.mktemp("minimal-sysroot")
    base = overlay.create_profile()
    return overlay, cr.test.Sysroot(path, base, overlays=[overlay])


def test_emerge_against_fake_sysroot(minimal_sysroot):
    """Test that a basic `emerge` operation works against a test sysroot."""
    overlay, sysroot = minimal_sysroot
    pkg1 = cr.test.Package("foo", "bar")
    overlay.add_package(pkg1)

    pkg2 = cr.test.Package("foo", "spam", depend="foo/bar")
    overlay.add_package(pkg2)

    sysroot.run(["emerge", "foo/spam"])

    res = sysroot.run(["equery", "list", "*"], stdout=True)

    assert "foo/bar" in res.stdout
