# Copyright 2018 Google Inc. All rights reserved.
#
# 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("//testing/libfuzzer/fuzzer_test.gni")
import("//testing/test.gni")

config("fuzzer_config") {
  configs = [ "../..:spvtools_internal_config" ]
}

group("fuzzers") {
  testonly = true
  deps = []

  if (!build_with_chromium || use_fuzzing_engine) {
    deps += [ ":fuzzers_bin" ]
  }
}

if (!build_with_chromium || use_fuzzing_engine) {
  group("fuzzers_bin") {
    testonly = true

    deps = [
      ":spvtools_as_fuzzer",
      ":spvtools_binary_parser_fuzzer",
      ":spvtools_dis_fuzzer",
      ":spvtools_opt_legalization_fuzzer",
      ":spvtools_opt_performance_fuzzer",
      ":spvtools_opt_size_fuzzer",
      ":spvtools_val_fuzzer",
    ]
  }
}

template("spvtools_fuzzer") {
  source_set(target_name) {
    testonly = true
    sources = invoker.sources
    sources += [ "random_generator.cpp" ]
    deps = [
      "../..:spvtools",
      "../..:spvtools_opt",
      "../..:spvtools_val",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      ":fuzzer_config",
    ]
  }
}

spvtools_fuzzer("spvtools_as_fuzzer_src") {
  sources = [
    "spvtools_as_fuzzer.cpp",
  ]
}

spvtools_fuzzer("spvtools_binary_parser_fuzzer_src") {
  sources = [
    "spvtools_binary_parser_fuzzer.cpp",
  ]
}

spvtools_fuzzer("spvtools_dis_fuzzer_src") {
  sources = [
    "spvtools_dis_fuzzer.cpp",
  ]
}

spvtools_fuzzer("spvtools_opt_performance_fuzzer_src") {
  sources = [
    "spvtools_opt_performance_fuzzer.cpp",
  ]
}

spvtools_fuzzer("spvtools_opt_legalization_fuzzer_src") {
  sources = [
    "spvtools_opt_legalization_fuzzer.cpp",
  ]
}

spvtools_fuzzer("spvtools_opt_size_fuzzer_src") {
  sources = [
    "spvtools_opt_size_fuzzer.cpp",
  ]
}

spvtools_fuzzer("spvtools_val_fuzzer_src") {
  sources = [
    "spvtools_val_fuzzer.cpp",
  ]
}

if (!build_with_chromium || use_fuzzing_engine) {
  fuzzer_test("spvtools_as_fuzzer") {
    sources = []
    deps = [
      ":spvtools_as_fuzzer_src",
    ]
    # Intentionally doesn't use the seed corpus, because it consumes
    #  part of the input as not part of the file.
  }

  fuzzer_test("spvtools_binary_parser_fuzzer") {
    sources = []
    deps = [
      ":spvtools_binary_parser_fuzzer_src",
    ]
    # Intentionally doesn't use the seed corpus, because it consumes
    #  part of the input as not part of the file.
  }

  fuzzer_test("spvtools_dis_fuzzer") {
    sources = []
    deps = [
      ":spvtools_dis_fuzzer_src",
    ]
    # Intentionally doesn't use the seed corpus, because it consumes
    #  part of the input as not part of the file.
  }

  fuzzer_test("spvtools_opt_performance_fuzzer") {
    sources = []
    deps = [
      ":spvtools_opt_performance_fuzzer_src",
    ]
    seed_corpus = "corpora/spv"
  }

  fuzzer_test("spvtools_opt_legalization_fuzzer") {
    sources = []
    deps = [
      ":spvtools_opt_legalization_fuzzer_src",
    ]
    seed_corpus = "corpora/spv"
  }

  fuzzer_test("spvtools_opt_size_fuzzer") {
    sources = []
    deps = [
      ":spvtools_opt_size_fuzzer_src",
    ]
    seed_corpus = "corpora/spv"
  }

  fuzzer_test("spvtools_val_fuzzer") {
    sources = []
    deps = [
      ":spvtools_val_fuzzer_src",
    ]
    seed_corpus = "corpora/spv"
  }
}
