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

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