load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
load("@rules_fuzzing//fuzzing:cc_defs.bzl", "cc_fuzz_test")
load("@rules_fuzzing//fuzzing/private:binary.bzl", "fuzzing_binary")  # buildifier: disable=bzl-visibility

package(features = ["layering_check"])

cc_library(
    name = "fuzz_support",
    srcs = [
        "func_conversion.h",
        "fuzz_support.cc",
    ],
    hdrs = ["fuzz_support.h"],
    visibility = ["//c-toxcore:__subpackages__"],
    deps = [
        "//c-toxcore/toxcore:crypto_core",
        "//c-toxcore/toxcore:network",
        "//c-toxcore/toxcore:tox",
    ],
)

cc_library(
    name = "fuzz_tox",
    hdrs = ["fuzz_tox.h"],
    visibility = ["//c-toxcore:__subpackages__"],
    deps = [":fuzz_support"],
)

cc_fuzz_test(
    name = "bootstrap_fuzz_test",
    srcs = ["bootstrap_harness.cc"],
    copts = ["-UNDEBUG"],
    corpus = ["//tools/toktok-fuzzer/corpus:bootstrap_fuzzer"],
    deps = [
        ":fuzz_support",
        ":fuzz_tox",
        "//c-toxcore/toxcore:tox",
        "//c-toxcore/toxcore:tox_dispatch",
        "//c-toxcore/toxcore:tox_events",
    ],
)

cc_fuzz_test(
    name = "e2e_fuzz_test",
    srcs = ["e2e_fuzz_test.cc"],
    copts = ["-UNDEBUG"],
    corpus = ["//tools/toktok-fuzzer/corpus:e2e_fuzz_test"],
    data = ["//tools/toktok-fuzzer/init:e2e_fuzz_test.dat"],
    deps = [
        ":fuzz_support",
        ":fuzz_tox",
        "//c-toxcore/toxcore:tox",
        "//c-toxcore/toxcore:tox_dispatch",
        "//c-toxcore/toxcore:tox_events",
    ],
)

cc_fuzz_test(
    name = "toxsave_fuzz_test",
    srcs = ["toxsave_harness.cc"],
    copts = ["-UNDEBUG"],
    corpus = ["//tools/toktok-fuzzer/corpus:toxsave_fuzzer"],
    deps = [
        ":fuzz_support",
        "//c-toxcore/toxcore:tox",
    ],
)

cc_binary(
    name = "protodump",
    srcs = ["protodump.cc"],
    copts = ["-UNDEBUG"],
    deps = [
        ":fuzz_support",
        "//c-toxcore/toxcore:tox",
        "//c-toxcore/toxcore:tox_dispatch",
        "//c-toxcore/toxcore:tox_events",
        "//c-toxcore/toxcore:util",
    ],
)

fuzzing_binary(
    name = "protodump_bin",
    testonly = True,
    binary = ":protodump",
    engine = "@rules_fuzzing//fuzzing:cc_engine",
    tags = ["manual"],
)

cc_fuzz_test(
    name = "protodump_reduce",
    srcs = ["protodump_reduce.cc"],
    copts = ["-UNDEBUG"],
    deps = [
        ":fuzz_support",
        ":fuzz_tox",
        "//c-toxcore/toxcore:tox",
        "//c-toxcore/toxcore:tox_dispatch",
        "//c-toxcore/toxcore:tox_events",
    ],
)
