# Copyright 2016 The PDFium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/jumbo.gni")
import("../../pdfium.gni")

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

  defines = [
    "PNG_PREFIX",
    "PNG_USE_READ_MACROS",
  ]
  include_dirs = [ "../.." ]
  if (pdf_enable_v8) {
    defines += [ "PDF_ENABLE_V8" ]
  }
  if (pdf_enable_xfa) {
    defines += [ "PDF_ENABLE_XFA" ]
  }
}

group("fuzzers") {
  testonly = true
  deps = [
    ":pdf_cmap_fuzzer_src",
    ":pdf_codec_a85_fuzzer_src",
    ":pdf_codec_fax_fuzzer_src",
    ":pdf_codec_icc_fuzzer_src",
    ":pdf_codec_jbig2_fuzzer_src",
    ":pdf_codec_rle_fuzzer_src",
    ":pdf_font_fuzzer_src",
    ":pdf_hint_table_fuzzer_src",
    ":pdf_jpx_fuzzer_src",
    ":pdf_psengine_fuzzer_src",
    ":pdf_streamparser_fuzzer_src",
    ":pdf_xml_fuzzer_src",
    ":pdfium_fuzzer_src",
  ]
  if (pdf_enable_v8) {
    deps += [ ":pdf_cjs_util_fuzzer_src" ]
  }
  if (pdf_enable_xfa) {
    deps += [
      ":pdf_bidi_fuzzer_src",
      ":pdf_cfx_barcode_fuzzer_src",
      ":pdf_codec_jpeg_fuzzer_src",
      ":pdf_css_fuzzer_src",
      ":pdf_fm2js_fuzzer_src",
      ":pdf_formcalc_fuzzer_src",
      ":pdfium_xfa_fuzzer_src",
    ]
    if (pdf_enable_xfa_bmp) {
      deps += [ ":pdf_codec_bmp_fuzzer_src" ]
    }
    if (pdf_enable_xfa_gif) {
      deps += [
        ":pdf_codec_gif_fuzzer_src",
        ":pdf_lzw_fuzzer_src",
      ]
    }
    if (pdf_enable_xfa_png) {
      deps += [ ":pdf_codec_png_fuzzer_src" ]
    }
    if (pdf_enable_xfa_tiff) {
      deps += [ ":pdf_codec_tiff_fuzzer_src" ]
    }
  }
}

template("pdfium_public_fuzzer") {
  jumbo_source_set(target_name) {
    sources = invoker.sources + [
                "pdfium_fuzzer_helper.cc",
                "pdfium_fuzzer_helper.h",
              ]
    deps = [
      "../:test_support",
      "../../:pdfium",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    testonly = true
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      ":fuzzer_config",
    ]
    if (pdf_enable_v8) {
      configs += [ "//v8:external_startup_data" ]
      deps += [
        "//v8",
        "//v8:v8_libplatform",
      ]
    }
  }
}

template("pdfium_fuzzer") {
  jumbo_source_set(target_name) {
    sources = invoker.sources + [ "pdf_fuzzer_init.cc" ]
    deps = [
      "../../:pdfium",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    testonly = true
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      ":fuzzer_config",
    ]
    if (pdf_enable_v8) {
      configs += [ "//v8:external_startup_data" ]
    }
  }
}

if (pdf_enable_v8) {
  pdfium_fuzzer("pdf_cjs_util_fuzzer_src") {
    sources = [
      "pdf_cjs_util_fuzzer.cc",
    ]
    deps = [
      "../../fxjs",
    ]
  }
}

if (pdf_enable_xfa) {
  pdfium_fuzzer("pdf_bidi_fuzzer_src") {
    sources = [
      "pdf_bidi_fuzzer.cc",
    ]
    deps = [
      "../../xfa/fgas",
    ]
  }

  pdfium_fuzzer("pdf_cfx_barcode_fuzzer_src") {
    sources = [
      "pdf_cfx_barcode_fuzzer.cc",
    ]
    deps = [
      "../../xfa/fwl",
    ]
  }

  if (pdf_enable_xfa_bmp) {
    pdfium_fuzzer("pdf_codec_bmp_fuzzer_src") {
      sources = [
        "pdf_codec_bmp_fuzzer.cc",
        "xfa_codec_fuzzer.h",
      ]
      deps = [
        "../:test_support",
        "../../core/fxcodec",
        "../../core/fxge",
      ]
    }
  }

  if (pdf_enable_xfa_gif) {
    pdfium_fuzzer("pdf_codec_gif_fuzzer_src") {
      sources = [
        "pdf_codec_gif_fuzzer.cc",
        "xfa_codec_fuzzer.h",
      ]
      deps = [
        "../:test_support",
        "../../core/fxcodec",
        "../../core/fxge",
      ]
    }

    pdfium_fuzzer("pdf_lzw_fuzzer_src") {
      sources = [
        "pdf_lzw_fuzzer.cc",
      ]
      deps = [
        "../../core/fxcodec",
      ]
    }
  }

  pdfium_fuzzer("pdf_codec_jpeg_fuzzer_src") {
    sources = [
      "pdf_codec_jpeg_fuzzer.cc",
      "xfa_codec_fuzzer.h",
    ]
    deps = [
      "../:test_support",
      "../../core/fxcodec",
      "../../core/fxge",
    ]
  }

  if (pdf_enable_xfa_png) {
    pdfium_fuzzer("pdf_codec_png_fuzzer_src") {
      sources = [
        "pdf_codec_png_fuzzer.cc",
        "xfa_codec_fuzzer.h",
      ]
      deps = [
        "../:test_support",
        "../../core/fxcodec",
        "../../core/fxge",
      ]
    }
  }

  if (pdf_enable_xfa_tiff) {
    pdfium_fuzzer("pdf_codec_tiff_fuzzer_src") {
      sources = [
        "pdf_codec_tiff_fuzzer.cc",
        "xfa_codec_fuzzer.h",
      ]
      deps = [
        "../:test_support",
        "../../core/fxcodec",
        "../../core/fxge",
      ]
    }
  }

  pdfium_fuzzer("pdf_css_fuzzer_src") {
    sources = [
      "pdf_css_fuzzer.cc",
    ]
    deps = [
      "../../core/fxcrt/css",
    ]
  }

  pdfium_fuzzer("pdf_fm2js_fuzzer_src") {
    sources = [
      "pdf_fm2js_fuzzer.cc",
    ]
    deps = [
      "../../fxjs",
    ]
  }

  pdfium_fuzzer("pdf_formcalc_fuzzer_src") {
    sources = [
      "pdf_formcalc_fuzzer.cc",
    ]
    deps = [
      "../../xfa/fxfa/fm2js",
    ]
  }

  pdfium_public_fuzzer("pdfium_xfa_fuzzer_src") {
    sources = [
      "pdfium_xfa_fuzzer.cc",
    ]
  }
}

pdfium_fuzzer("pdf_cmap_fuzzer_src") {
  sources = [
    "pdf_cmap_fuzzer.cc",
  ]
  deps = [
    "../../core/fpdfapi/font",
  ]
}

pdfium_fuzzer("pdf_codec_a85_fuzzer_src") {
  sources = [
    "pdf_codec_a85_fuzzer.cc",
  ]
  deps = [
    "../../core/fxcodec",
  ]
}

pdfium_fuzzer("pdf_codec_fax_fuzzer_src") {
  sources = [
    "pdf_codec_fax_fuzzer.cc",
  ]
  deps = [
    "../../core/fxcodec",
  ]
}

pdfium_fuzzer("pdf_codec_icc_fuzzer_src") {
  sources = [
    "pdf_codec_icc_fuzzer.cc",
  ]
  deps = [
    "../../core/fxcodec",
    "../../third_party/:lcms2",
  ]
}

pdfium_fuzzer("pdf_codec_jbig2_fuzzer_src") {
  sources = [
    "pdf_codec_jbig2_fuzzer.cc",
  ]
  deps = [
    "../../core/fpdfapi/parser",
    "../../core/fxcodec",
    "../../core/fxge",
  ]
}

pdfium_fuzzer("pdf_codec_rle_fuzzer_src") {
  sources = [
    "pdf_codec_rle_fuzzer.cc",
  ]
  deps = [
    "../../core/fxcodec",
  ]
}

pdfium_fuzzer("pdf_font_fuzzer_src") {
  sources = [
    "pdf_font_fuzzer.cc",
  ]
}

pdfium_fuzzer("pdf_hint_table_fuzzer_src") {
  sources = [
    "pdf_hint_table_fuzzer.cc",
  ]
  deps = [
    "../../core/fpdfapi/parser",
  ]
}

pdfium_fuzzer("pdf_jpx_fuzzer_src") {
  sources = [
    "pdf_jpx_fuzzer.cc",
  ]
  deps = [
    "../../core/fxcodec",
    "../../core/fxge",
  ]
}

pdfium_fuzzer("pdf_psengine_fuzzer_src") {
  sources = [
    "pdf_psengine_fuzzer.cc",
  ]
  deps = [
    "../../core/fpdfapi/page",
  ]
}

pdfium_fuzzer("pdf_streamparser_fuzzer_src") {
  sources = [
    "pdf_streamparser_fuzzer.cc",
  ]
  deps = [
    "../../core/fpdfapi/page",
    "../../core/fpdfapi/parser",
  ]
}

pdfium_fuzzer("pdf_xml_fuzzer_src") {
  sources = [
    "pdf_xml_fuzzer.cc",
  ]
}

pdfium_public_fuzzer("pdfium_fuzzer_src") {
  sources = [
    "pdfium_fuzzer.cc",
  ]
}
