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

library fuchsia.fuzzer;

using zx;

const MAX_PARAMETERS uint16 = 128;
const MAX_PARAMETER_LEN uint16 = 256;

/// Maps test inputs to specific behaviors in the target code, e.g. by invoking
/// APIs, making FIDL calls. etc. The adapter includes the target-specific code
/// often referred to as the "fuzz target function".
///
/// See also:
///
/// * https://llvm.org/docs/LibFuzzer.html#fuzz-target
@discoverable
closed protocol TargetAdapter {
    /// Retrieves the target-specific fuzzer parameters, e.g. the package-
    /// relative location of seed corpora. These parameters are specific to
    /// individual fuzzers, and are used by both the fuzzing engine and the
    /// "test-engine" used to create fuzzer unit tests. For these reasons, it is
    /// most convenient for fuzzer authors to specify them as part of the
    /// (fuzzer-specific) target adapter's component manifest file, and have the
    /// engine and test-engine retrieve them via this method.
    ///
    /// - response `parameters` the command line parameters from a specific
    ///   fuzzer's component manifest.
    strict GetParameters() -> (struct {
        parameters vector<string:MAX_PARAMETER_LEN>:MAX_PARAMETERS;
    });

    /// Provides the eventpair used by driver and adapter to signal each other,
    /// and the shared VMO used to provide test inputs to the adapter. The VMO
    /// must have the `ZX_PROP_VMO_CONTENT_SIZE` property set.
    ///
    /// + request `eventpair` the eventpair used to signal when fuzzing runs
    ///   start and stop.
    /// + request `test_input` the shared VMO used by the engine to provide byte
    ///   sequences to test.
    strict Connect(resource struct {
        eventpair zx.Handle:EVENTPAIR;
        test_input zx.Handle:VMO;
    }) -> ();
};
