# 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("//build_overrides/build.gni")
import("../../scripts/dawn_overrides_with_defaults.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/common",
    "${dawn_root}/src/dawn:dawn_proc",
    "${dawn_root}/src/dawn:dawncpp",
    "${dawn_root}/src/dawn_native:dawn_native_static",
    "${dawn_root}/src/dawn_wire:dawn_wire_static",
    "${dawn_root}/src/utils:dawn_utils",
  ]
}

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

  deps = [ ":dawn_wire_server_fuzzer_common" ]

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

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/common:dawn_internal" ]
  }
}

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

  deps = [ ":dawn_wire_server_fuzzer_common" ]

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

# A group target to build all the fuzzers
group("dawn_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" ]
  }
}
