# 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")

dawn_top_level = "../.."

# 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,
                             [
                               "cflags",
                               "cflags_cc",
                               "check_includes",
                               "defines",
                               "deps",
                               "include_dirs",
                               "sources",
                             ])

      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_spirv_cross_fuzzer_common") {
  sources = [
    "DawnSPIRVCrossFuzzer.cpp",
    "DawnSPIRVCrossFuzzer.h",
  ]
  public_deps = [
    "${dawn_top_level}/third_party:spirv_cross",
  ]
}

# Uses Dawn specific options and varies input data
dawn_fuzzer_test("dawn_spirv_cross_glsl_fast_fuzzer") {
  sources = [
    "DawnSPIRVCrossGLSLFastFuzzer.cpp",
  ]
  deps = [
    ":dawn_spirv_cross_fuzzer_common",
  ]
}

# Varies bother the options and input data
dawn_fuzzer_test("dawn_spirv_cross_glsl_full_fuzzer") {
  sources = [
    "DawnSPIRVCrossGLSLFullFuzzer.cpp",
  ]
  deps = [
    ":dawn_spirv_cross_fuzzer_common",
  ]
}

# Uses Dawn specific options and varies input data
dawn_fuzzer_test("dawn_spirv_cross_hlsl_fast_fuzzer") {
  sources = [
    "DawnSPIRVCrossGLSLFastFuzzer.cpp",
  ]
  deps = [
    ":dawn_spirv_cross_fuzzer_common",
  ]
}

# Varies bother the options and input data
dawn_fuzzer_test("dawn_spirv_cross_hlsl_full_fuzzer") {
  sources = [
    "DawnSPIRVCrossGLSLFullFuzzer.cpp",
  ]
  deps = [
    ":dawn_spirv_cross_fuzzer_common",
  ]
}

# Uses Dawn specific options and varies input data
dawn_fuzzer_test("dawn_spirv_cross_msl_fast_fuzzer") {
  sources = [
    "DawnSPIRVCrossGLSLFastFuzzer.cpp",
  ]
  deps = [
    ":dawn_spirv_cross_fuzzer_common",
  ]
}

# Varies bother the options and input data
dawn_fuzzer_test("dawn_spirv_cross_msl_full_fuzzer") {
  sources = [
    "DawnSPIRVCrossGLSLFullFuzzer.cpp",
  ]
  deps = [
    ":dawn_spirv_cross_fuzzer_common",
  ]
}

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

  deps = [
    "${dawn_top_level}:libdawn",
    "${dawn_top_level}:libdawn_native",
    "${dawn_top_level}:libdawn_wire",
  ]

  additional_configs = [ "${dawn_top_level}:dawn_shared_library_public" ]
}
