# Copyright 2018 The Dawn Authors
#
# 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.

import("../../../scripts/dawn_overrides_with_defaults.gni")

import("//build_overrides/build.gni")
import("${dawn_root}/scripts/dawn_features.gni")
import("${dawn_root}/src/dawn/fuzzers/dawn_fuzzers.gni")

# We only have libfuzzer in Chromium builds but if we build fuzzer targets only
# there, we would risk breaking fuzzer targets all the time when making changes
# to Dawn. To avoid that, we make fuzzer targets compile in standalone builds
# as well with a dawn_fuzzer_test target that acts like Chromium's fuzzer_test.
#
# The standalone fuzzer targets are able to run a single fuzzer input which
# could help reproduce fuzzer crashes more easily because you don't need a
# whole Chromium checkout.

if (build_with_chromium) {
  import("//testing/libfuzzer/fuzzer_test.gni")

  # In Chromium build we just proxy everything to the real fuzzer_test
  template("dawn_fuzzer_test") {
    fuzzer_test(target_name) {
      forward_variables_from(invoker, "*")
    }
  }
} else {
  import("//testing/test.gni")

  # In standalone build we do something similar to fuzzer_test.
  template("dawn_fuzzer_test") {
    test(target_name) {
      forward_variables_from(invoker,
                             [
                               "asan_options",
                               "cflags",
                               "cflags_cc",
                               "check_includes",
                               "defines",
                               "deps",
                               "include_dirs",
                               "sources",
                             ])

      if (defined(asan_options)) {
        not_needed([ "asan_options" ])
      }

      if (!defined(configs)) {
        configs = []
      }

      # Weirdly fuzzer_test uses a special variable for additional configs.
      if (defined(invoker.additional_configs)) {
        configs += invoker.additional_configs
      }

      sources += [ "StandaloneFuzzerMain.cpp" ]
    }
  }
}

static_library("dawn_wire_server_fuzzer_common") {
  sources = [
    "DawnWireServerFuzzer.cpp",
    "DawnWireServerFuzzer.h",
  ]
  public_deps = [
    "${dawn_root}/src/dawn:cpp",
    "${dawn_root}/src/dawn:proc",
    "${dawn_root}/src/dawn/common",
    "${dawn_root}/src/dawn/native:static",
    "${dawn_root}/src/dawn/utils",
    "${dawn_root}/src/dawn/wire:static",
  ]
}

dawn_fuzzer_test("dawn_wire_server_and_frontend_fuzzer") {
  sources = [ "DawnWireServerAndFrontendFuzzer.cpp" ]

  deps = [ ":dawn_wire_server_fuzzer_common" ]

  additional_configs = [ "${dawn_root}/src/dawn/common:internal_config" ]
}

if (is_win) {
  dawn_fuzzer_test("dawn_wire_server_and_d3d12_backend_fuzzer") {
    sources = [ "DawnWireServerAndD3D12BackendFuzzer.cpp" ]

    deps = [ ":dawn_wire_server_fuzzer_common" ]

    additional_configs = [ "${dawn_root}/src/dawn/common:internal_config" ]
  }
}

dawn_fuzzer_test("dawn_wire_server_and_vulkan_backend_fuzzer") {
  sources = [ "DawnWireServerAndVulkanBackendFuzzer.cpp" ]

  deps = [ ":dawn_wire_server_fuzzer_common" ]

  additional_configs = [ "${dawn_root}/src/dawn/common:internal_config" ]
}

if (is_dawn_lpm_fuzzer && build_with_chromium && dawn_use_swiftshader) {
  import("//third_party/protobuf/proto_library.gni")
  import("${dawn_root}/generator/dawn_generator.gni")

  dawn_json_lpm_generator("dawn_lpmfuzz_cpp") {
    target = "dawn_lpmfuzz_cpp"
    outputs = [
      "src/dawn/fuzzers/lpmfuzz/DawnLPMSerializer_autogen.cpp",
      "src/dawn/fuzzers/lpmfuzz/DawnLPMSerializer_autogen.h",
      "src/dawn/fuzzers/lpmfuzz/DawnLPMConstants_autogen.h",
    ]
  }

  dawn_json_lpm_generator("dawn_lpmfuzz_proto") {
    target = "dawn_lpmfuzz_proto"
    outputs = [ "src/dawn/fuzzers/lpmfuzz/dawn_lpm_autogen.proto" ]
  }

  proto_library("dawn_lpm_proto") {
    proto_in_dir = "//"
    sources = get_target_outputs(":dawn_lpmfuzz_proto")

    use_protobuf_full = true
    deps = [
      ":dawn_lpmfuzz_proto",
      "//third_party/protobuf:protobuf_full",
    ]
  }

  copy("copy_dawn_lpm_proto_outputs") {
    # Hardcoded filenames because we can't get_target_outputs from a proto_library
    # TODO(tiszka): crbug.com/1410213
    sources = [
      "$root_out_dir/gen/$root_out_dir/gen/third_party/dawn/src/dawn/fuzzers/lpmfuzz/dawn_lpm_autogen.pb.cc",
      "$root_out_dir/gen/$root_out_dir/gen/third_party/dawn/src/dawn/fuzzers/lpmfuzz/dawn_lpm_autogen.pb.h",
    ]
    outputs = [ "$root_out_dir/gen/third_party/dawn/src/dawn/fuzzers/lpmfuzz/{{source_file_part}}" ]
    deps = [ ":dawn_lpm_proto" ]
  }

  dawn_fuzzer_test("dawn_lpm_fuzzer_and_vulkan_backend") {
    sources = get_target_outputs(":dawn_lpmfuzz_cpp")
    sources += [
      "lpmfuzz/DawnLPMFuzzer.cpp",
      "lpmfuzz/DawnLPMFuzzer.h",
      "lpmfuzz/DawnLPMFuzzerAndVulkanBackend.cpp",
    ]

    deps = [
      ":copy_dawn_lpm_proto_outputs",
      ":dawn_lpmfuzz_cpp",
      "${dawn_root}/src/dawn:cpp",
      "${dawn_root}/src/dawn:proc",
      "${dawn_root}/src/dawn/common",
      "${dawn_root}/src/dawn/native:static",
      "${dawn_root}/src/dawn/utils",
      "${dawn_root}/src/dawn/wire:static",
      "//third_party/dawn/src/dawn/fuzzers:dawn_lpm_proto",
      "//third_party/libprotobuf-mutator",
    ]
  }
}

# A group target to build all the fuzzers
group("fuzzers") {
  testonly = true
  deps = [
    ":dawn_wire_server_and_frontend_fuzzer",
    ":dawn_wire_server_and_vulkan_backend_fuzzer",
  ]

  if (is_win) {
    deps += [ ":dawn_wire_server_and_d3d12_backend_fuzzer" ]
  }
}
