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

load("@bazel_skylib//rules:diff_test.bzl", "diff_test")
load("@rules_shell//shell:sh_test.bzl", "sh_test")
load("//java:repositories.bzl", "JAVA_TOOLS_CONFIG", "REMOTE_JDK_CONFIGS")
load(":check_remotejdk_configs_match.bzl", "validate_configs")

package(default_applicable_licenses = ["@rules_java//:license"])

sh_test(
    name = "check_remote_jdk_configs_test",
    srcs = ["check_remote_jdk_configs.sh"],
    args = [
        ",".join([
            config.name,
            config.urls[0],
            config.urls[1] if len(config.urls) > 1 else "",
            config.sha256,
            config.strip_prefix,
        ])
        for configs in REMOTE_JDK_CONFIGS.values()
        for config in configs
    ],
    tags = ["manual"],  # explicitly tested only on Linux
)

sh_test(
    name = "check_remote_java_tools_configs_test",
    srcs = ["check_remote_java_tools_configs.sh"],
    args = [
        ",".join([
            name,
            config["mirror_url"],
            config["github_url"],
            config["sha"],
        ])
        for name, config in JAVA_TOOLS_CONFIG["artifacts"].items()
    ],
)

sh_test(
    name = "check_release_notes_test",
    srcs = ["check_release_notes_test.sh"],
    args = [
        "$(location //distro:relnotes.txt)",
        module_version(),
    ],
    data = ["//distro:relnotes.txt"],
    tags = ["manual"],  # explicitly tested only on Linux
)

diff_test(
    name = "docs_up_to_date_test",
    failure_message = """
    Docs are no longer up to date. Regenerate them by running:

    bazel build //java/docs:rules_docs && \
    cp bazel-bin/java/docs/rules_docs.out java/docs/rules.md
    """,
    file1 = "//java/docs:rules.md",
    file2 = "//java/docs:rules_docs",
)

validate_configs()

starlark_doc_extract(
    name = "proxy_bzl_graph",
    src = "@compatibility_proxy//:proxy.bzl",
    deps = ["@compatibility_proxy//:proxy_bzl"],
)
