// Copyright 2015 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.
package com.google.devtools.build.lib.analysis.mock;

import static com.google.common.collect.ImmutableMap.toImmutableMap;
import static java.nio.charset.StandardCharsets.UTF_8;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.io.MoreFiles;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ShellConfiguration;
import com.google.devtools.build.lib.analysis.util.AbstractMockJavaSupport;
import com.google.devtools.build.lib.analysis.util.AnalysisMock;
import com.google.devtools.build.lib.bazel.bzlmod.LocalPathOverride;
import com.google.devtools.build.lib.bazel.bzlmod.NonRegistryOverride;
import com.google.devtools.build.lib.bazel.repository.LocalConfigPlatformFunction;
import com.google.devtools.build.lib.bazel.repository.LocalConfigPlatformRule;
import com.google.devtools.build.lib.bazel.rules.BazelRuleClassProvider;
import com.google.devtools.build.lib.packages.util.BazelMockCcSupport;
import com.google.devtools.build.lib.packages.util.BazelMockPythonSupport;
import com.google.devtools.build.lib.packages.util.MockCcSupport;
import com.google.devtools.build.lib.packages.util.MockGenruleSupport;
import com.google.devtools.build.lib.packages.util.MockPlatformSupport;
import com.google.devtools.build.lib.packages.util.MockPythonSupport;
import com.google.devtools.build.lib.packages.util.MockToolsConfig;
import com.google.devtools.build.lib.rules.repository.RepositoryFunction;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.runfiles.Runfiles;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/** Subclass of {@link AnalysisMock} using Bazel-specific semantics. */
public final class BazelAnalysisMock extends AnalysisMock {
  public static final AnalysisMock INSTANCE = new BazelAnalysisMock();

  private BazelAnalysisMock() {}

  @Override
  public ImmutableList<String> getWorkspaceContents(MockToolsConfig config) {
    String xcodeWorkspace = config.getPath("local_config_xcode_workspace").getPathString();
    String protobufWorkspace = config.getPath("protobuf_workspace").getPathString();
    String bazelToolWorkspace = config.getPath("embedded_tools").getPathString();
    String bazelPlatformsWorkspace = config.getPath("platforms_workspace").getPathString();
    String rulesJavaWorkspace = config.getPath("rules_java_workspace").getPathString();
    String androidGmavenR8Workspace = config.getPath("android_gmaven_r8").getPathString();
    String appleSupport = config.getPath("build_bazel_apple_support").getPathString();

    return ImmutableList.of(
        "# __SKIP_WORKSPACE_PREFIX__",
        "bind(name = 'android/sdk', actual ="
            + " '@bazel_tools//tools/android:poison_pill_android_sdk')",
        "bind(name = 'android/dx_jar_import', actual ="
            + " '@bazel_tools//tools/android:no_android_sdk_repository_error')",
        "bind(name = 'android/d8_jar_import', actual ="
            + " '@bazel_tools//tools/android:no_android_sdk_repository_error')",
        "bind(name = 'android/crosstool', actual = '@bazel_tools//tools/cpp:toolchain')",
        "bind(name = 'android_sdk_for_testing', actual = '@bazel_tools//tools/android:empty')",
        "bind(name = 'android_ndk_for_testing', actual = '@bazel_tools//tools/android:empty')",
        "bind(name = 'databinding_annotation_processor', actual ="
            + " '@bazel_tools//tools/android:empty')",
        "bind(name = 'has_androidsdk', actual = '@bazel_tools//tools/android:always_false')",
        "local_repository(name = 'bazel_tools', path = '" + bazelToolWorkspace + "')",
        "local_repository(name = 'platforms', path = '" + bazelPlatformsWorkspace + "')",
        "local_repository(name = 'internal_platforms_do_not_use', path = '"
            + bazelPlatformsWorkspace
            + "')",
        "local_repository(name = 'local_config_xcode', path = '" + xcodeWorkspace + "')",
        "local_repository(name = 'com_google_protobuf', path = '" + protobufWorkspace + "')",
        "local_repository(name = 'rules_java', path = '" + rulesJavaWorkspace + "')",
        "local_repository(name = 'rules_java_builtin', path = '" + rulesJavaWorkspace + "')",
        "local_repository(name = 'android_gmaven_r8', path = '" + androidGmavenR8Workspace + "')",
        "local_repository(name = 'build_bazel_apple_support', path = '" + appleSupport + "')",
        "register_toolchains('@rules_java//java/toolchains/runtime:all')",
        "register_toolchains('@rules_java//java/toolchains/javac:all')",
        "bind(name = 'android/sdk', actual='@bazel_tools//tools/android:sdk')",
        "register_toolchains('@bazel_tools//tools/cpp:all')",
        "register_toolchains('@bazel_tools//tools/jdk:all')",
        "register_toolchains('@bazel_tools//tools/android:all')",
        // Note this path is created inside the test infrastructure in
        // createAndroidBuildContents() below. It may not reflect a real depot path.
        "register_toolchains('@bazel_tools//tools/android/dummy_sdk:all')",
        "register_toolchains('@bazel_tools//tools/python:autodetecting_toolchain')");
  }

  /** Keep this in sync with the WORKSPACE content in {@link #getWorkspaceContents}. */
  @Override
  public ImmutableList<String> getWorkspaceRepos() {
    return ImmutableList.of(
        "android_gmaven_r8",
        "bazel_tools",
        "com_google_protobuf",
        "local_config_xcode",
        "platforms",
        "internal_platforms_do_not_use",
        "rules_java",
        "rules_java_builtin",
        "build_bazel_apple_support");
  }

  @Override
  public void setupMockClient(MockToolsConfig config) throws IOException {
    List<String> workspaceContents = getWorkspaceContents(config);
    setupMockClient(config, workspaceContents);
  }

  @Override
  public void setupMockClient(MockToolsConfig config, List<String> workspaceContents)
      throws IOException {
    config.create("local_config_xcode_workspace/WORKSPACE");
    config.create("local_config_xcode_workspace/BUILD", "xcode_config(name = 'host_xcodes')");
    config.create(
        "local_config_xcode_workspace/MODULE.bazel", "module(name = 'local_config_xcode')");
    config.create(
        "protobuf_workspace/BUILD",
        """
        licenses(["notice"])

        exports_files([
            "protoc",
            "cc_toolchain",
        ])
        """);
    config.create("protobuf_workspace/WORKSPACE");
    config.create("protobuf_workspace/MODULE.bazel", "module(name='com_google_protobuf')");
    config.overwrite("WORKSPACE", workspaceContents.toArray(new String[0]));
    config.overwrite("MODULE.bazel");
    /* The rest of platforms is initialized in {@link MockPlatformSupport}. */
    config.create("platforms_workspace/WORKSPACE", "workspace(name = 'platforms')");
    config.create("platforms_workspace/MODULE.bazel", "module(name = 'platforms')");
    config.create("build_bazel_apple_support/WORKSPACE", "workspace(name = 'apple_support')");
    config.create(
        "build_bazel_apple_support/MODULE.bazel", "module(name = 'build_bazel_apple_support')");
    config.create("embedded_tools/WORKSPACE", "workspace(name = 'bazel_tools')");
    Runfiles runfiles = Runfiles.create();
    for (String filename :
        Arrays.asList("tools/jdk/java_toolchain_alias.bzl", "tools/jdk/java_stub_template.txt")) {
      java.nio.file.Path path = Paths.get(runfiles.rlocation("io_bazel/" + filename));
      if (!Files.exists(path)) {
        continue; // the io_bazel workspace root only exists for Bazel
      }
      config.create("embedded_tools/" + filename, MoreFiles.asCharSource(path, UTF_8).read());
    }
    config.create(
        "embedded_tools/tools/jdk/launcher_flag_alias.bzl",
        """
        _providers = [CcInfo, cc_common.launcher_provider]

        def _impl(ctx):
            if not ctx.attr._launcher:
                return None
            launcher = ctx.attr._launcher
            providers = [ctx.attr._launcher[p] for p in _providers]
            providers.append(DefaultInfo(
                files = launcher[DefaultInfo].files,
                runfiles = launcher[DefaultInfo].default_runfiles,
            ))
            return providers

        launcher_flag_alias = rule(
            implementation = _impl,
            attrs = {
                "_launcher": attr.label(
                    default = configuration_field(
                        fragment = "java",
                        name = "launcher",
                    ),
                    providers = _providers,
                ),
            },
        )
        """);
    config.create(
        "embedded_tools/tools/jdk/BUILD",
        """
        load(
            ":java_toolchain_alias.bzl",
            "java_host_runtime_alias",
            "java_runtime_alias",
            "java_toolchain_alias",
        )
        load(":launcher_flag_alias.bzl", "launcher_flag_alias")

        package(default_visibility = ["//visibility:public"])

        java_toolchain(
            name = "toolchain",
            bootclasspath = [":bootclasspath"],
            genclass = ["GenClass_deploy.jar"],
            header_compiler = ["turbine_deploy.jar"],
            header_compiler_direct = ["TurbineDirect_deploy.jar"],
            ijar = ["ijar"],
            jacocorunner = ":JacocoCoverage",
            java_runtime = "host_jdk",
            javabuilder = ["JavaBuilder_deploy.jar"],
            singlejar = ["singlejar"],
            source_version = "8",
            target_version = "8",
        )

        java_toolchain(
            name = "remote_toolchain",
            bootclasspath = [":bootclasspath"],
            genclass = ["GenClass_deploy.jar"],
            header_compiler = ["turbine_deploy.jar"],
            header_compiler_direct = ["TurbineDirect_deploy.jar"],
            ijar = ["ijar"],
            jacocorunner = ":JacocoCoverage",
            java_runtime = "host_jdk",
            javabuilder = ["JavaBuilder_deploy.jar"],
            singlejar = ["singlejar"],
            source_version = "8",
            target_version = "8",
        )

        java_import(
            name = "JacocoCoverageRunner",
            jars = ["JacocoCoverage_jarjar_deploy.jar"],
        )

        java_import(
            name = "proguard_import",
            jars = ["proguard_rt.jar"],
        )

        java_binary(
            name = "proguard",
            main_class = "proguard.Proguard",
            runtime_deps = [":proguard_import"],
        )

        java_import(
            name = "TestRunner",
            jars = ["TestRunner.jar"],
        )

        java_runtime(
            name = "jdk",
            srcs = [],
        )

        java_runtime(
            name = "host_jdk",
            srcs = [],
        )

        java_runtime(
            name = "remote_jdk11",
            srcs = [],
        )

        java_toolchain_alias(name = "current_java_toolchain")

        java_runtime_alias(name = "current_java_runtime")

        java_host_runtime_alias(name = "current_host_java_runtime")

        filegroup(
            name = "bootclasspath",
            srcs = ["jdk/jre/lib/rt.jar"],
        )

        filegroup(
            name = "extdir",
            srcs = glob(
                ["jdk/jre/lib/ext/*"],
                allow_empty = True,
            ),
        )

        filegroup(
            name = "java",
            srcs = ["jdk/jre/bin/java"],
        )

        filegroup(
            name = "JacocoCoverage",
            srcs = ["JacocoCoverage_deploy.jar"],
        )

        exports_files([
            "JavaBuilder_deploy.jar",
            "singlejar",
            "TestRunner_deploy.jar",
            "ijar",
            "GenClass_deploy.jar",
            "turbine_deploy.jar",
            "TurbineDirect_deploy.jar",
            "proguard_allowlister.par",
        ])

        toolchain_type(name = "toolchain_type")

        toolchain_type(name = "runtime_toolchain_type")

        toolchain(
            name = "dummy_java_toolchain",
            toolchain = ":toolchain",
            toolchain_type = ":toolchain_type",
        )

        toolchain(
            name = "dummy_java_runtime_toolchain",
            toolchain = ":jdk",
            toolchain_type = ":runtime_toolchain_type",
        )

        java_plugins_flag_alias(name = "java_plugins_flag_alias")

        launcher_flag_alias(
            name = "launcher_flag_alias",
            visibility = ["//visibility:public"],
        )
        """);

    config.create(
        TestConstants.CONSTRAINTS_PATH + "/android/BUILD",
        "package(default_visibility=['//visibility:public'])",
        "platform(",
        "  name = 'armeabi-v7a',",
        "  parents = ['" + TestConstants.PLATFORM_LABEL + "'],",
        "  constraint_values = [",
        "    '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "os:android',",
        "    '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "cpu:armv7',",
        "  ],",
        ")");

    // Create the actual SDKs.
    ImmutableList<String> androidBuildContents = createAndroidBuildContents();
    config.create(
        "embedded_tools/tools/android/BUILD", androidBuildContents.toArray(new String[0]));
    config.create(
        "embedded_tools/src/tools/android/java/com/google/devtools/build/android/r8/BUILD",
        "java_library(name='r8')\n");
    config.create(
        "embedded_tools/tools/android/emulator/BUILD",
        Iterables.toArray(createToolsAndroidEmulatorContents(), String.class));
    config.create(
        "embedded_tools/tools/android/dummy_sdk/BUILD",
        """
        package(default_visibility = ["//visibility:public"])

        toolchain(
            name = "dummy-sdk",
            toolchain = ":invalid-fallback-sdk",
            toolchain_type = "@bazel_tools//tools/android:sdk_toolchain_type",
        )

        filegroup(
            name = "jar-filegroup",
            srcs = ["dummy.jar"],
        )

        genrule(
            name = "empty-binary",
            srcs = [],
            outs = ["empty.sh"],
            cmd = "touch $@",
            executable = 1,
        )

        android_sdk(
            name = "invalid-fallback-sdk",
            aapt = ":empty_binary",
            aapt2 = ":empty_binary",
            adb = ":empty_binary",
            aidl = ":empty_binary",
            android_jar = ":jar-filegroup",
            apksigner = ":empty_binary",
            dx = ":empty_binary",
            framework_aidl = "dummy.jar",
            main_dex_classes = "dummy.jar",
            main_dex_list_creator = ":empty_binary",
            proguard = "empty_binary",
            shrinked_android_jar = "dummy.jar",
            tags = ["__ANDROID_RULES_MIGRATION__"],
            zipalign = ":empty_binary",
        )
        """);
    config.create(
        "android_gmaven_r8/jar/BUILD",
        """
        java_import(
            name = "jar",
            jars = ["r8.jar"],
        )

        filegroup(
            name = "file",
            srcs = [],
        )
        """);
    config.create("android_gmaven_r8/WORKSPACE");

    MockGenruleSupport.setup(config);

    config.create(
        "embedded_tools/tools/BUILD",
        "alias(name='host_platform',actual='" + TestConstants.PLATFORM_LABEL + "')");
    config.create(
        "embedded_tools/tools/test/BUILD",
        """
        filegroup(
            name = "runtime",
            srcs = [
                "test-setup.sh",
                "test-xml-generator.sh",
            ],
        )

        filegroup(
            name = "test_wrapper",
            srcs = ["test_wrapper_bin"],
        )

        filegroup(
            name = "xml_writer",
            srcs = ["xml_writer_bin"],
        )

        filegroup(
            name = "test_setup",
            srcs = ["test-setup.sh"],
        )

        filegroup(
            name = "test_xml_generator",
            srcs = ["test-xml-generator.sh"],
        )

        filegroup(
            name = "collect_coverage",
            srcs = ["collect_coverage.sh"],
        )

        filegroup(
            name = "collect_cc_coverage",
            srcs = ["collect_cc_coverage.sh"],
        )

        filegroup(
            name = "coverage_support",
            srcs = ["collect_coverage.sh"],
        )

        filegroup(
            name = "coverage_report_generator",
            srcs = ["coverage_report_generator.sh"],
        )

        filegroup(
            name = "lcov_merger",
            srcs = ["lcov_merger.sh"],
        )
        """);

    // Use an alias package group to allow for modification at the simpler path
    config.create(
        "embedded_tools/tools/allowlists/config_feature_flag/BUILD",
        """
        package_group(
            name = "config_feature_flag",
            includes = ["@@//tools/allowlists/config_feature_flag"],
        )

        package_group(
            name = "config_feature_flag_setter",
            includes = ["@@//tools/allowlists/config_feature_flag:config_feature_flag_setter"],
        )
        """);

    config.create(
        "tools/allowlists/config_feature_flag/BUILD",
        """
        package_group(
            name = "config_feature_flag",
            packages = ["public"],
        )

        package_group(
            name = "config_feature_flag_Setter",
            packages = ["public"],
        )
        """);
    config.create(
        "embedded_tools/tools/allowlists/extend_rule_allowlist/BUILD",
        """
        package_group(
            name = "extend_rule_allowlist",
            packages = ["public"],
        )
        """);

    config.create(
        "embedded_tools/tools/allowlists/android_binary_allowlist/BUILD",
        """
        package_group(
            name = "enable_starlark_dex_desugar_proguard",
            includes = [
            "@@//tools/allowlists/android_binary_allowlist:enable_starlark_dex_desugar_proguard",
            ],
        )
        """);
    config.create(
        "tools/allowlists/android_binary_allowlist/BUILD",
        "package_group(name='enable_starlark_dex_desugar_proguard', packages=[])");

    config.create(
        "embedded_tools/tools/proto/BUILD",
        """
        package(default_visibility = ["//visibility:public"])

        alias(
            name = "protoc",
            actual = "@com_google_protobuf//:protoc",
        )

        alias(
            name = "javalite_toolchain",
            actual = "@com_google_protobuf//:javalite_toolchain",
        )

        alias(
            name = "java_toolchain",
            actual = "@com_google_protobuf//:java_toolchain",
        )

        alias(
            name = "cc_toolchain",
            actual = "@com_google_protobuf//:cc_toolchain",
        )
        """);

    config.create(
        "embedded_tools/tools/zip/BUILD",
        """
        package(default_visibility = ["//visibility:public"])

        exports_files(["precompile.py"])

        cc_binary(
            name = "zipper",
            srcs = ["zip_main.cc"],
        )

        alias(
            name = "unzip_fdo",
            actual = ":zipper",
        )
        """);

    config.create(
        "embedded_tools/tools/launcher/BUILD",
        """
        load("@bazel_tools//third_party/cc_rules/macros:defs.bzl", "cc_binary")

        package(default_visibility = ["//visibility:public"])

        cc_binary(
            name = "launcher",
            srcs = ["launcher_main.cc"],
        )

        cc_binary(
            name = "launcher_maker",
            srcs = ["launcher_maker.cc"],
        )
        """);

    config.create(
        "embedded_tools/tools/def_parser/BUILD",
        """
        package(default_visibility = ["//visibility:public"])

        filegroup(
            name = "def_parser",
            srcs = ["def_parser.exe"],
        )
        """);

    config.create(
        "embedded_tools/objcproto/BUILD",
        """
        package(default_visibility = ["//visibility:public"])

        objc_library(
            name = "protobuf_lib",
            srcs = ["empty.m"],
            hdrs = ["include/header.h"],
            includes = ["include"],
        )

        exports_files(["well_known_type.proto"])

        proto_library(
            name = "well_known_type_proto",
            srcs = ["well_known_type.proto"],
        )
        """);
    config.create("embedded_tools/objcproto/empty.m");
    config.create("embedded_tools/objcproto/empty.cc");
    config.create("embedded_tools/objcproto/well_known_type.proto");

    config.create("rules_java_workspace/WORKSPACE", "workspace(name = 'rules_java')");
    config.create("rules_java_workspace/MODULE.bazel", "module(name = 'rules_java')");
    config.create("rules_java_workspace/java/BUILD");
    config.create("rules_java_workspace/toolchains/BUILD");
    java.nio.file.Path path =
        Paths.get(runfiles.rlocation("rules_java/toolchains/java_toolchain_alias.bzl"));
    if (Files.exists(path)) {
      config.create(
          "rules_java_workspace/toolchains/java_toolchain_alias.bzl",
          MoreFiles.asCharSource(path, UTF_8).read());
    }
    config.create(
        "rules_java_workspace/toolchains/local_java_repository.bzl",
        """
        def local_java_repository(**attrs):
            pass
        """);
    config.create("rules_java_workspace/toolchains/jdk_build_file.bzl", "JDK_BUILD_TEMPLATE = ''");
    config.create(
        "rules_java_workspace/java/defs.bzl",
        """
        def java_binary(**attrs):
            native.java_binary(**attrs)

        def java_library(**attrs):
            native.java_library(**attrs)

        def java_import(**attrs):
            native.java_import(**attrs)
        """);
    config.create(
        "rules_java_workspace/java/repositories.bzl",
        """
        def rules_java_dependencies():
            pass

        def rules_java_toolchains():
            native.register_toolchains("//java/toolchains/runtime:all")
            native.register_toolchains("//java/toolchains/javac:all")
        """);

    config.create(
        "rules_java_workspace/java/toolchains/runtime/BUILD",
        """
        toolchain_type(name = "toolchain_type")

        toolchain(
            name = "local_jdk",
            toolchain = "@bazel_tools//tools/jdk:jdk",
            toolchain_type = "@rules_java//java/toolchains/runtime:toolchain_type",
        )
        """);
    config.create(
        "rules_java_workspace/java/toolchains/javac/BUILD",
        """
        toolchain_type(name = "toolchain_type")

        toolchain(
            name = "javac_toolchain",
            toolchain = "@bazel_tools//tools/jdk:toolchain",
            toolchain_type = "@rules_java//java/toolchains/javac:toolchain_type",
        )
        """);

    config.create("third_party/bazel_rules/rules_proto/WORKSPACE");
    config.create("third_party/bazel_rules/rules_proto/MODULE.bazel", "module(name='rules_proto')");

    config.create("third_party/bazel_rules/rules_cc/WORKSPACE");
    config.create("third_party/bazel_rules/rules_cc/MODULE.bazel", "module(name='rules_cc')");

    config.create(
        "embedded_tools/tools/allowlists/function_transition_allowlist/BUILD",
        """
        package_group(
            name = "function_transition_allowlist",
            packages = ["public"],
        )
        """);

    MockPlatformSupport.setup(config);
    ccSupport().setup(config);
    pySupport().setup(config);
    ShellConfiguration.injectShellExecutableFinder(
        BazelRuleClassProvider::getDefaultPathFromOptions, BazelRuleClassProvider.SHELL_EXECUTABLE);
  }

  /** Contents of {@code //tools/android/emulator/BUILD.tools}. */
  private ImmutableList<String> createToolsAndroidEmulatorContents() {
    return ImmutableList.of(
        "exports_files(['emulator_arm', 'emulator_x86', 'mksd', 'empty_snapshot_fs'])",
        "filegroup(name = 'emulator_x86_bios', srcs = ['bios.bin', 'vgabios-cirrus.bin'])",
        "filegroup(name = 'xvfb_support', srcs = ['support_file1', 'support_file2'])",
        "sh_binary(name = 'unified_launcher', srcs = ['empty.sh'])",
        "filegroup(name = 'shbase', srcs = ['googletest.sh'])",
        "filegroup(name = 'sdk_path', srcs = ['empty.sh'])");
  }

  private ImmutableList<String> createAndroidBuildContents() {
    ImmutableList.Builder<String> androidBuildContents = ImmutableList.builder();

    androidBuildContents.add(
        "package(default_visibility=['//visibility:public'])",
        "toolchain_type(name = 'sdk_toolchain_type')",
        "toolchain(",
        "  name = 'sdk_toolchain',",
        "  toolchain = ':sdk',",
        "  toolchain_type = ':sdk_toolchain_type',",
        "  target_compatible_with = [",
        "    '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "os:android',",
        "  ],",
        ")",
        "android_sdk(",
        "    name = 'sdk',",
        "    aapt = ':static_aapt_tool',",
        "    aapt2 = ':static_aapt2_tool',",
        "    adb = ':static_adb_tool',",
        "    aidl = ':static_aidl_tool',",
        "    android_jar = ':android_runtime_jar',",
        "    apksigner = ':ApkSignerBinary',",
        "    dx = ':dx_binary',",
        "    framework_aidl = ':aidl_framework',",
        "    main_dex_classes = ':mainDexClasses.rules',",
        "    main_dex_list_creator = ':main_dex_list_creator',",
        "    proguard = ':ProGuard',",
        "    shrinked_android_jar = ':shrinkedAndroid.jar',",
        "    zipalign = ':zipalign',",
        "    tags = ['__ANDROID_RULES_MIGRATION__'],",
        ")",
        "filegroup(name = 'android_runtime_jar', srcs = ['android.jar'])",
        "filegroup(name = 'dx_binary', srcs = ['dx_binary.jar'])");

    androidBuildContents
        .add("sh_binary(name = 'aar_generator', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'desugar_java8', srcs = ['empty.sh'])")
        .add("filegroup(name = 'desugar_java8_extra_bootclasspath', srcs = ['fake.jar'])")
        .add("filegroup(name = 'java8_legacy_dex', srcs = ['java8_legacy.dex.zip'])")
        .add("sh_binary(name = 'build_java8_legacy_dex', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'merge_proguard_maps', srcs = ['empty.sh'])")
        .add("filegroup(name = 'desugared_java8_legacy_apis', srcs = ['fake.jar'])")
        .add("sh_binary(name = 'aar_native_libs_zip_creator', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'resource_extractor', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'dexbuilder', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'dexbuilder_after_proguard', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'dexmerger', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'dexsharder', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'aar_import_deps_checker', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'busybox', srcs = ['empty.sh'])")
        .add("android_library(name = 'incremental_stub_application')")
        .add("android_library(name = 'incremental_split_stub_application')")
        .add("sh_binary(name = 'stubify_manifest', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'merge_dexzips', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'build_split_manifest', srcs = ['empty.sh'])")
        .add("filegroup(name = 'debug_keystore', srcs = ['fake.file'])")
        .add("sh_binary(name = 'shuffle_jars', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'strip_resources', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'build_incremental_dexmanifest', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'incremental_install', srcs = ['empty.sh'])")
        .add("java_binary(name = 'IdlClass',")
        .add("            runtime_deps = [ ':idlclass_import' ],")
        .add("            main_class = 'com.google.devtools.build.android.idlclass.IdlClass')")
        .add("java_binary(name = 'zip_filter',")
        .add("            main_class = 'com.google.devtools.build.android.ZipFilterAction',")
        .add("            runtime_deps = [ ':ZipFilterAction_import' ])")
        .add("java_import(name = 'ZipFilterAction_import',")
        .add("            jars = [ 'ZipFilterAction_deploy.jar' ])")
        .add("sh_binary(name = 'aar_resources_extractor', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'aar_embedded_jars_extractor', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'aar_embedded_proguard_extractor', srcs = ['empty.sh'])")
        .add("java_import(name = 'idlclass_import',")
        .add("            jars = [ 'idlclass.jar' ])")
        .add("exports_files(['adb', 'adb_static'])")
        .add("sh_binary(name = 'android_runtest', srcs = ['empty.sh'])")
        .add("sh_binary(name = 'instrumentation_test_entry_point', srcs = ['empty.sh'])")
        .add("java_plugin(name = 'databinding_annotation_processor',")
        .add("    generates_api = 1,")
        .add("    processor_class = 'android.databinding.annotationprocessor.ProcessDataBinding')")
        .add("sh_binary(name = 'instrumentation_test_check', srcs = ['empty.sh'])")
        .add("package_group(name = 'android_device_allowlist', packages = ['public'])")
        .add("package_group(name = 'export_deps_allowlist', packages = ['public'])")
        .add("package_group(name = 'allow_android_library_deps_without_srcs_allowlist',")
        .add("    packages=['public'])")
        .add("android_tools_defaults_jar(name = 'android_jar')")
        .add("sh_binary(name = 'dex_list_obfuscator', srcs = ['empty.sh'])");

    return androidBuildContents.build();
  }

  @Override
  public void setupMockWorkspaceFiles(Path embeddedBinariesRoot) throws IOException {
    embeddedBinariesRoot.createDirectoryAndParents();
    Path jdkWorkspacePath = embeddedBinariesRoot.getRelative("jdk.WORKSPACE");
    FileSystemUtils.writeContentAsLatin1(jdkWorkspacePath, "");
  }

  @Override
  public void setupMockToolsRepository(MockToolsConfig config) throws IOException {
    config.create("embedded_tools/WORKSPACE", "workspace(name = 'bazel_tools')");
    config.create("embedded_tools/MODULE.bazel", "module(name='bazel_tools')");
    config.create("embedded_tools/tools/build_defs/repo/BUILD");
    config.create(
        "embedded_tools/tools/build_defs/build_info/bazel_cc_build_info.bzl",
        """
        def _impl(ctx):
            volatile_file = ctx.actions.declare_file("volatile_file.h")
            non_volatile_file = ctx.actions.declare_file("non_volatile_file.h")
            redacted_file = ctx.actions.declare_file("redacted_file.h")
            ctx.actions.write(output = volatile_file, content = "")
            ctx.actions.write(output = non_volatile_file, content = "")
            ctx.actions.write(output = redacted_file, content = "")
            output_groups = {
                "non_redacted_build_info_files": depset([volatile_file, non_volatile_file]),
                "redacted_build_info_files": depset([redacted_file]),
            }
            return OutputGroupInfo(**output_groups)

        bazel_cc_build_info = rule(implementation = _impl)
        """);
    config.create(
        "embedded_tools/tools/build_defs/build_info/bazel_java_build_info.bzl",
        """
        def _impl(ctx):
            volatile_file = ctx.actions.declare_file("volatile_file.properties")
            non_volatile_file = ctx.actions.declare_file("non_volatile_file.properties")
            redacted_file = ctx.actions.declare_file("redacted_file.properties")
            ctx.actions.write(output = volatile_file, content = "")
            ctx.actions.write(output = non_volatile_file, content = "")
            ctx.actions.write(output = redacted_file, content = "")
            output_groups = {
                "non_redacted_build_info_files": depset([volatile_file, non_volatile_file]),
                "redacted_build_info_files": depset([redacted_file]),
            }
            return OutputGroupInfo(**output_groups)

        bazel_java_build_info = rule(implementation = _impl)
        """);
    config.create(
        "embedded_tools/tools/build_defs/build_info/BUILD",
        """
        load("//tools/build_defs/build_info:bazel_cc_build_info.bzl", "bazel_cc_build_info")
        load("//tools/build_defs/build_info:bazel_java_build_info.bzl", "bazel_java_build_info")

        bazel_cc_build_info(
            name = "cc_build_info",
            visibility = ["//visibility:public"],
        )

        bazel_java_build_info(
            name = "java_build_info",
            visibility = ["//visibility:public"],
        )
        """);
    config.create(
        "embedded_tools/tools/build_defs/repo/utils.bzl",
        """
        def maybe(repo_rule, name, **kwargs):
            if name not in native.existing_rules():
                repo_rule(name = name, **kwargs)
        """);
    config.create(
        "embedded_tools/tools/build_defs/repo/http.bzl",
        """
        def http_archive(**kwargs):
            pass

        def http_file(**kwargs):
            pass

        def http_jar(**kwargs):
            pass
        """);
    config.create("embedded_tools/tools/jdk/jdk_build_file.bzl", "JDK_BUILD_TEMPLATE = ''");
    config.create(
        "embedded_tools/tools/jdk/local_java_repository.bzl",
        """
        def local_java_repository(**kwargs):
            pass
        """);
    config.create(
        "embedded_tools/tools/jdk/remote_java_repository.bzl",
        """
        def remote_java_repository(**kwargs):
            pass
        """);
    config.create(
        "embedded_tools/tools/cpp/cc_configure.bzl",
        """
        def cc_configure(**kwargs):
            pass
        """);

    config.create("embedded_tools/tools/sh/BUILD");
    config.create(
        "embedded_tools/tools/sh/sh_configure.bzl",
        """
        def sh_configure(**kwargs):
            pass
        """);
    config.create("embedded_tools/tools/osx/BUILD");
    config.create(
        "embedded_tools/tools/osx/xcode_configure.bzl",
        """
        # no positional arguments for XCode
        def xcode_configure(*args, **kwargs):
            pass
        """);
    config.create("embedded_tools/bin/sh", "def sh(**kwargs):", "  pass");
  }

  @Override
  public ImmutableMap<String, NonRegistryOverride> getBuiltinModules(BlazeDirectories directories) {
    ImmutableMap<String, String> moduleNameToPath =
        ImmutableMap.<String, String>builder()
            .put("bazel_tools", "embedded_tools")
            .put("platforms", "platforms_workspace")
            .put("rules_java", "rules_java_workspace")
            .put("com_google_protobuf", "protobuf_workspace")
            .put("rules_proto", "third_party/bazel_rules/rules_proto")
            .put("build_bazel_apple_support", "build_bazel_apple_support")
            .put("local_config_xcode", "local_config_xcode_workspace")
            .put("rules_cc", "third_party/bazel_rules/rules_cc")
            .buildOrThrow();
    return moduleNameToPath.entrySet().stream()
        .collect(
            toImmutableMap(
                Map.Entry::getKey,
                e ->
                    LocalPathOverride.create(
                        directories
                            .getWorkingDirectory()
                            .getRelative(e.getValue())
                            .getPathString())));
  }

  @Override
  public ConfiguredRuleClassProvider createRuleClassProvider() {
    return TestRuleClassProvider.getRuleClassProviderWithClearedSuffix();
  }

  @Override
  public boolean isThisBazel() {
    return true;
  }

  @Override
  public MockCcSupport ccSupport() {
    return BazelMockCcSupport.INSTANCE;
  }

  @Override
  public AbstractMockJavaSupport javaSupport() {
    return AbstractMockJavaSupport.BAZEL;
  }

  @Override
  public MockPythonSupport pySupport() {
    return BazelMockPythonSupport.INSTANCE;
  }

  @Override
  public void addExtraRepositoryFunctions(
      ImmutableMap.Builder<String, RepositoryFunction> repositoryHandlers) {
    repositoryHandlers.put(LocalConfigPlatformRule.NAME, new LocalConfigPlatformFunction());
  }
}
