/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * 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.
 */

package {
    // See: http://go/android-license-faq
    // Inherits all licenses from parent to get Apache 2.0 and package name.
    default_applicable_licenses: [
        "packages_modules_NeuralNetworks_runtime_license",
    ],
}

cc_library_static {
    name: "libneuralnetworks_fuzzer_proto",
    host_supported: true,
    vendor_available: true,
    owner: "google",
    srcs: ["Model.proto"],
    proto: {
        type: "full",
        export_proto_headers: true,
    },
    shared_libs: ["libprotobuf-cpp-full"],
}

cc_library_static {
    name: "libneuralnetworks_fuzzer_harness",
    host_supported: true,
    vendor_available: true,
    owner: "google",
    srcs: [
        "Converter.cpp",
        "FuzzHarness.cpp",
        "StaticAssert.cpp",
    ],
    shared_libs: [
        "libprotobuf-cpp-full",
    ],
    static_libs: [
        "libneuralnetworks_common",
        "libneuralnetworks_generated_test_harness",
        "neuralnetworks_types",
    ],
    whole_static_libs: [
        "libneuralnetworks_fuzzer_proto",
        "libprotobuf-mutator",
    ],
    target: {
        android: {
            shared_libs: [
                "libnativewindow",
            ],
        },
    },
}

filegroup {
    name: "libneuralnetworks_fuzzer_corpus",
    srcs: ["corpus/*"],
}

cc_defaults {
    name: "libneuralnetworks_fuzzer_defaults",
    host_supported: true,
    shared_libs: ["libprotobuf-cpp-full"],
    static_libs: ["libneuralnetworks_fuzzer_harness"],
    corpus: [":libneuralnetworks_fuzzer_corpus"],
}

// The following host binary is disabled because the genrule that uses this
// binary (below) is disabled and because this binary is 300MB large currently.
cc_binary_host {
    name: "libneuralnetworks_fuzzer_generate_corpus",
    enabled: false,
    owner: "google",
    srcs: [
        "GenerateCorpus.cpp",
        "StaticAssert.cpp",
    ],
    shared_libs: ["libprotobuf-cpp-full"],
    static_libs: [
        "libneuralnetworks_fuzzer_proto",
        "libneuralnetworks_generated_test_harness",
    ],
    whole_static_libs: [
        "neuralnetworks_generated_V1_0_example",
        "neuralnetworks_generated_V1_1_example",
        "neuralnetworks_generated_V1_2_example",
        "neuralnetworks_generated_V1_3_example",
    ],
}

// This genrule generates a zip file of 5000+ test cases from the NNAPI test
// generator. It has been disabled for the time being because cc_fuzz is
// currently not able to accept a zip file as a fuzzer seed corpus.
// Alternatively, gensrcs could be used to generate each test case individually;
// however, the corpus only seems to be able to accept ~500 files.
genrule {
    name: "libneuralnetworks_fuzzer_seed_corpus",
    enabled: false,
    tools: [
        "libneuralnetworks_fuzzer_generate_corpus",
        "soong_zip",
    ],
    out: ["libneuralnetworks_fuzzer_seed_corpus.zip"],
    cmd: "mkdir $(genDir)/corpus && " +
        "$(location libneuralnetworks_fuzzer_generate_corpus) $(genDir)/corpus && " +
        "$(location soong_zip) -o $(out) -C $(genDir)/corpus -D $(genDir)/corpus",
}
