chromium/chrome/test/fuzzing/renderer_fuzzing/BUILD.gn

# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//chrome/browser_exposed_mojom_targets.gni")
import("//chrome/test/fuzzing/in_process_fuzzer.gni")
import("//chrome/test/fuzzing/renderer_fuzzing/in_process_renderer_fuzzing.gni")

group("test") {
  testonly = true
}

# We want to make sure to only enable this fuzzer on platforms that have a CQ
# bot so that the mojom target list is maintained up-to-date.
# Similarly, if something goes wrong with those targets, this will "only" break
# fuzzer CQ bots, so we this allows for damage control.
# crbug.com/343669713: enable this on Windows once the Linux version sticks in.
renderer_ipc_fuzzing_enabled =
    fuzzing_engine_supports_custom_main && is_linux && enable_mojom_fuzzer

if (fuzzing_engine_supports_custom_main) {
  source_set("renderer_in_process_fuzzer_runner") {
    testonly = true
    sources = [ "in_process_renderer_fuzzing.h" ]
    deps = [
      "//base",
      "//chrome/test:test_support",
      "//chrome/test/fuzzing:in_process_fuzzer_runner",
      "//chrome/test/fuzzing:in_process_proto_fuzzer_runner",
      "//testing/libfuzzer:renderer_fuzzing",
    ]
  }
}

if (renderer_ipc_fuzzing_enabled) {
  _mojolpm_deps = []
  foreach(target, browser_exposed_mojom_targets) {
    _mojolpm_deps += [ "${target}_mojolpm" ]
  }

  # This tool aims at replicating an environment similar to how
  # in_process_fuzzer are running, so that we can fetch a list of mojom
  # interfaces that make sense for `renderer_in_process_mojolpm_fuzzer`.
  executable("ipc_interfaces_dumper") {
    testonly = true
    defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
    sources = [ "ipc_fuzzing/ipc_interfaces_dumper.cc" ]
    deps = [
      "//base",
      "//chrome/test:browser_tests_runner",
      "//chrome/test:test_support",
      "//content/test:test_support",
    ]
  }
  action("renderer_in_process_mojolpm_fuzzer_generator") {
    testonly = true
    deps = [ ":ipc_interfaces_dumper" ]
    depfile = "$target_out_dir/$target_name.d"
    inputs = []
    foreach(target, browser_exposed_mojom_targets) {
      inputs += [ get_label_info(target, "target_gen_dir") + "/" +
                  get_label_info(target, "name") + ".build_metadata" ]
      deps += [ target + "__build_metadata" ]
    }

    # We cannot use the GN `metadata` mechanism here, because our initial
    # deps could depend on other mojom targets which would also generate some
    # metadata, but we would actually not depend on their `mojolpm` variant.
    # Doing things the current way allows for ensuring that we are only listing
    # meta files for mojolpm targets we directly depend upon.
    _metafiles = []
    foreach(file, inputs) {
      _metafiles += [ rebase_path(file, root_build_dir) ]
    }
    write_file("$target_gen_dir/metadata", _metafiles)

    inputs +=
        [ "//chrome/test/fuzzing/renderer_fuzzing/ipc_fuzzing/testcase.h.tmpl" ]

    script = "//chrome/test/fuzzing/renderer_fuzzing/ipc_fuzzing/generate_testcase.py"
    args = [
      "-p",
      rebase_path("${root_build_dir}/ipc_interfaces_dumper", root_build_dir),
      "-i",
      rebase_path("${target_gen_dir}/interfaces.json", root_build_dir),
      "-r",
      rebase_path(root_gen_dir, root_build_dir),
      "-m",
      rebase_path("$target_gen_dir/metadata", root_build_dir),
      "-t",
      rebase_path("${target_gen_dir}/testcase.h", root_build_dir),
      "-d",
      rebase_path("${target_gen_dir}/", root_gen_dir),
      "-n",
      "renderer_in_process_mojolpm_fuzzer",
      "-f",
      rebase_path(depfile, root_build_dir),
    ]
    outputs = [
      "${target_gen_dir}/interfaces.json",
      "${target_gen_dir}/testcase.h",
    ]
    deps += _mojolpm_deps
  }
  in_process_renderer_mojolpm_generated_fuzzer(
      "renderer_in_process_mojolpm_fuzzer") {
    sources = [ "renderer_in_process_mojolpm_fuzzer.cc" ]

    interface_file = "${target_gen_dir}/interfaces.json"

    deps = [
      ":renderer_in_process_mojolpm_fuzzer_generator",
      "//chrome/test:test_support",
      "//chrome/test/fuzzing:in_process_proto_fuzzer_runner",
      "//content/test/fuzzer:mojolpm_fuzzer_support",
      "//testing/libfuzzer:renderer_fuzzing",
      "//testing/libfuzzer/proto:url_proto_converter",
      "//third_party/blink/public/common:storage_key_proto_converter",
    ]

    deps += _mojolpm_deps

    proto_deps = [ ":renderer_in_process_mojolpm_fuzzer_generator" ]
    proto_deps += _mojolpm_deps
  }
}