# 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 = [ "../.." ]
}

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",
      ":pdf_fx_date_helpers_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" ]
      }
    }
  }
}

jumbo_source_set("utils") {
  sources = [
    "pdfium_fuzzer_util.cc",
    "pdfium_fuzzer_util.h",
  ]

  testonly = true
}

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",
    ]
  }
  pdfium_fuzzer("pdf_fx_date_helpers_fuzzer_src") {
    sources = [
      "pdf_fx_date_helpers_fuzzer.cc",
    ]
    deps = [
      "../../fxjs",
    ]
  }

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

    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 = [
    ":utils",
    "../../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 = [
    ":utils",
    "../../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",
  ]
}
