def METHOD_NAME(
        name,
        target_class = None,
        target_method = None,
        deps = [],
        runtime_deps = [],
        hook_jar = None,
        data = [],
        launcher_variant = "java",
        tags = [],
        fuzzer_args = [],
        srcs = [],
        size = None,
        timeout = None,
        env = None,
        env_inherit = None,
        verify_crash_input = True,
        verify_crash_reproducer = True,
        # Superset of the findings the fuzzer is expected to find. Since fuzzing runs are not
        # deterministic across OSes, pinpointing the exact set of findings is difficult.
        allowed_findings = [],
        # By default, expect a crash iff allowed_findings isn't empty.
        expect_crash = None,
        **kwargs):
    if target_class:
        fuzzer_args = fuzzer_args + ["--target_class=" + target_class]
    if target_method:
        fuzzer_args = fuzzer_args + ["--target_method=" + target_method]
    if expect_crash == None:
        expect_crash = len(allowed_findings) != 0
    target_name = name + "_target"
    target_deploy_jar = target_name + "_deploy.jar"
    # Deps can only be specified on java_binary targets with sources, which
    # excludes e.g. Kotlin libraries wrapped into java_binary via runtime_deps.
    deps = deps + ["//deploy:jazzer-api"] if srcs else []
    native.java_binary(
        name = target_name,
        srcs = srcs,
        create_executable = False,
        visibility = ["//visibility:private"],
        deps = deps,
        runtime_deps = runtime_deps,
        testonly = True,
        tags = tags,
        **kwargs
    )
    if launcher_variant == "java":
        # With the Java driver, we expect fuzz targets to depend on Jazzer
        # rather than have the launcher start a JVM with Jazzer on the class
        # path.
        native.java_import(
            name = target_name + "_import",
            jars = [target_deploy_jar],
            testonly = True,
            tags = tags,
        )
        target_with_driver_name = target_name + "_driver"
        native.java_binary(
            name = target_with_driver_name,
            runtime_deps = [
                target_name + "_import",
                "//src/main/java/com/code_intelligence/jazzer:jazzer_import",
            ],
            main_class = "com.code_intelligence.jazzer.Jazzer",
            testonly = True,
            tags = tags,
        )
    if launcher_variant == "native":
        driver = "//launcher:jazzer"
    elif launcher_variant == "java":
        driver = target_with_driver_name
    else:
        fail("Invalid launcher variant: " + launcher_variant)
    native.java_test(
        name = name,
        runtime_deps = [
            "//bazel/tools/java:fuzz_target_test_wrapper",
        ],
        jvm_flags = [
            # Use the same memory settings for reproducers as those suggested by Jazzer when
            # encountering an OutOfMemoryError.
            "-Xmx1620m",
            # Ensure that reproducers can be compiled even if they contain UTF-8 characters.
            "-Dfile.encoding=UTF-8",
        ],
        size = size or "enormous",
        timeout = timeout or "moderate",
        # args are shell tokenized and thus quotes are required in the case where arguments
        # are empty.
        args = [
            "$(rlocationpath %s)" % driver,
            "$(rlocationpath //deploy:jazzer-api)",
            "$(rlocationpath %s)" % target_deploy_jar,
            "$(rlocationpath %s)" % hook_jar if hook_jar else "''",
            str(verify_crash_input),
            str(verify_crash_reproducer),
            str(expect_crash),
            str(launcher_variant == "java"),
            "'" + ",".join(allowed_findings) + "'",
        ] + fuzzer_args,
        data = [
            target_deploy_jar,
            "//deploy:jazzer-api",
            driver,
        ] + data + ([hook_jar] if hook_jar else []),
        env = env,
        env_inherit = env_inherit,
        main_class = "com.code_intelligence.jazzer.tools.FuzzTargetTestWrapper",
        use_testrunner = False,
        tags = tags,
    )