# Copyright 2023 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Tests for py_test."""

load("@rules_testing//lib:analysis_test.bzl", "analysis_test")
load("@rules_testing//lib:util.bzl", rt_util = "util")
load("//python:defs.bzl", "py_test")
load(
    "//tests/base_rules:py_executable_base_tests.bzl",
    "create_executable_tests",
)
load("//tests/base_rules:util.bzl", pt_util = "util")
load("//tests/support:test_platforms.bzl", "LINUX", "MAC")

# Explicit Label() calls are required so that it resolves in @rules_python
# context instead of @rules_testing context.
_FAKE_CC_TOOLCHAIN = Label("//tests/cc:cc_toolchain_suite")
_FAKE_CC_TOOLCHAINS = [str(Label("//tests/cc:all"))]

_tests = []

def _test_mac_requires_darwin_for_execution(name, config):
    # Bazel 5.4 has a bug where every access of testing.ExecutionInfo is
    # a different object that isn't equal to any other, which prevents
    # rules_testing from detecting it properly and fails with an error.
    # This is fixed in Bazel 6+.
    if not pt_util.is_bazel_6_or_higher():
        rt_util.skip_test(name = name)
        return

    rt_util.helper_target(
        config.rule,
        name = name + "_subject",
        srcs = [name + "_subject.py"],
    )
    analysis_test(
        name = name,
        impl = _test_mac_requires_darwin_for_execution_impl,
        target = name + "_subject",
        config_settings = {
            "//command_line_option:cpu": "darwin_x86_64",
            "//command_line_option:crosstool_top": _FAKE_CC_TOOLCHAIN,
            "//command_line_option:extra_toolchains": _FAKE_CC_TOOLCHAINS,
            "//command_line_option:platforms": [MAC],
        },
    )

def _test_mac_requires_darwin_for_execution_impl(env, target):
    env.expect.that_target(target).provider(
        testing.ExecutionInfo,
    ).requirements().keys().contains("requires-darwin")

_tests.append(_test_mac_requires_darwin_for_execution)

def _test_non_mac_doesnt_require_darwin_for_execution(name, config):
    # Bazel 5.4 has a bug where every access of testing.ExecutionInfo is
    # a different object that isn't equal to any other, which prevents
    # rules_testing from detecting it properly and fails with an error.
    # This is fixed in Bazel 6+.
    if not pt_util.is_bazel_6_or_higher():
        rt_util.skip_test(name = name)
        return
    rt_util.helper_target(
        config.rule,
        name = name + "_subject",
        srcs = [name + "_subject.py"],
    )
    analysis_test(
        name = name,
        impl = _test_non_mac_doesnt_require_darwin_for_execution_impl,
        target = name + "_subject",
        config_settings = {
            "//command_line_option:cpu": "k8",
            "//command_line_option:crosstool_top": _FAKE_CC_TOOLCHAIN,
            "//command_line_option:extra_toolchains": _FAKE_CC_TOOLCHAINS,
            "//command_line_option:platforms": [LINUX],
        },
    )

def _test_non_mac_doesnt_require_darwin_for_execution_impl(env, target):
    # Non-mac builds don't have the provider at all.
    if testing.ExecutionInfo not in target:
        return
    env.expect.that_target(target).provider(
        testing.ExecutionInfo,
    ).requirements().keys().not_contains("requires-darwin")

_tests.append(_test_non_mac_doesnt_require_darwin_for_execution)

def py_test_test_suite(name):
    config = struct(rule = py_test)
    native.test_suite(
        name = name,
        tests = pt_util.create_tests(_tests, config = config) + create_executable_tests(config),
    )
