# Copyright 2018 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 cros_run_unit_tests.py."""

import os
from typing import List
from unittest import mock

import pytest

from chromite.lib import constants
from chromite.lib import cros_test_lib
from chromite.lib import partial_mock
from chromite.scripts import cros_run_unit_tests


pytestmark = cros_test_lib.pytestmark_inside_only


class CrosRunUnitTestsTest(cros_test_lib.MockTestCase):
    """Tests for cros_run_unit_tests functions."""

    def testNonEmptyPackageSet(self) -> None:
        """Asserts that the deps of a known package are non-empty"""
        self.assertTrue(
            cros_run_unit_tests.determine_packages(
                "/", ("virtual/implicit-system",)
            )
        )

    def testGetKeepGoing(self) -> None:
        """Tests set keep_going option based on env virables"""
        self.PatchObject(os, "environ", new={"USE": "chrome_internal coverage"})
        keep_going = cros_run_unit_tests.get_keep_going()
        self.assertEqual(keep_going, True)


@mock.patch("chromite.lib.cros_build_lib.IsInsideChroot", return_value=True)
@mock.patch(
    "chromite.lib.workon_helper.WorkonHelper.InstalledWorkonAtoms",
    return_value=set(("baz/abc", "foo/bar")),
)
@mock.patch(
    "chromite.lib.portage_util.PackagesWithTest", return_value=set(("foo/bar",))
)
@mock.patch("chromite.lib.telemetry.initialize", return_value=None)
@pytest.mark.parametrize(
    "test_args",
    (
        ["--host"],
        ["--board", "amd64-generic"],
        ["--host", "--packages", "foo/bar"],
        ["--board", "amd64-generic", "--packages", "foo/bar"],
    ),
)
def test_failure_code(_, __, ___, ____, run_mock, test_args: List[str]) -> None:
    """Assert we propagate command failures as return codes."""
    run_mock.AddCmdResult(
        partial_mock.In(str(constants.CHROMITE_BIN_DIR / "parallel_emerge")),
        returncode=42,
    )

    # Callers tend to look for non-zero, but we always use "1" for now.
    assert cros_run_unit_tests.main(test_args) == 1

    # Double-check we really hit the (mocked) parallel_emerge.
    assert run_mock.CommandContains(
        [constants.CHROMITE_BIN_DIR / "parallel_emerge"]
    )
