// Copyright 2019 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.

/// The Inspect VMO Validator program starts and controls a "puppet" program to
/// exercise each Inspect library. This file defines the protocol to exercise
/// the library (and report the result of commands). (After executing some
/// commands, the Validator program will analyze the VMO contents for
/// correctness and memory-packing efficiency.)
library test.inspect.validate;

using fuchsia.inspect as inspect;

/// InitializationParams tells how to initialize the Inspect library.
table InitializationParams {
    1: uint64 vmoSize;
};

/// TestResult tells the result of executing an Initialize or Act command.
enum TestResult {
    /// The function call completed without error.
    OK = 0;
    /// The Inspect library doesn't implement a requested feature.
    UNIMPLEMENTED = 1;
    /// The Inspect library reported a failure executing the function.
    FAILED = 2;
    /// The driver and/or puppet-wrapper was in an illegal state.
    ILLEGAL = 3;
};

// One-to-one mapping flag used in LINK block
enum LinkDisposition {
    CHILD = 0;
    INLINE = 1;
};

/// The data in the VMO is tree-structured, and
/// ROOT_ID identifies the (virtual) root node.
const uint32 ROOT_ID = 0;

/// Tells the puppet to create a Node with the given name, parentage, and ID
/// (the id is specified so other nodes can later be created under it).
struct CreateNode {
    uint32 parent;
    uint32 id;
    string name;
};

/// Tells the puppet to delete the given node.
struct DeleteNode {
    uint32 id;
};

enum NumberType : uint8 {
    INT = 1;
    UINT = 2;
    DOUBLE = 3;
};

flexible union Number {
    1: int64 int_t;
    2: uint64 uint_t;
    3: float64 double_t;
};

/// Tells the puppet to create a property with the given numeric value.
struct CreateNumericProperty {
    uint32 parent;
    uint32 id;
    string name;
    Number value;
};

/// Tells the puppet to create a property with the given byte array value.
struct CreateBytesProperty {
    uint32 parent;
    uint32 id;
    string name;
    vector<uint8> value;
};

/// Tells the puppet to create a property with the given string value.
struct CreateStringProperty {
    uint32 parent;
    uint32 id;
    string name;
    string value;
};

/// Tells the puppet to create a property with the given bool value.
struct CreateBoolProperty {
    uint32 parent;
    uint32 id;
    string name;
    bool value;
};

/// Tells the puppet to delete an existing property.
struct DeleteProperty {
    uint32 id;
};

struct AddNumber {
    uint32 id;
    Number value;
};

struct SubtractNumber {
    uint32 id;
    Number value;
};

struct SetNumber {
    uint32 id;
    Number value;
};

struct SetBytes {
    uint32 id;
    vector<uint8> value;
};

struct SetString {
    uint32 id;
    string value;
};

struct SetBool {
    uint32 id;
    bool value;
};

struct CreateArrayProperty {
    uint32 parent;
    uint32 id;
    string name;
    uint64 slots;
    NumberType number_type;
};

struct ArraySet {
    uint32 id;
    uint64 index;
    Number value;
};

struct ArrayAdd {
    uint32 id;
    uint64 index;
    Number value;
};

struct ArraySubtract {
    uint32 id;
    uint64 index;
    Number value;
};

struct CreateLinearHistogram {
    uint32 parent;
    uint32 id;
    string name;
    Number floor;
    Number step_size;
    uint64 buckets;
};

struct CreateExponentialHistogram {
    uint32 parent;
    uint32 id;
    string name;
    Number floor;
    Number initial_step;
    Number step_multiplier;
    uint64 buckets;
};

struct Insert {
    uint32 id;
    Number value;
};

struct InsertMultiple {
    uint32 id;
    Number value;
    uint64 count;
};

// Action sent to instruct a Puppet to create a lazy node.
// TODO(fxbug.dev/49114): This should be modified to allow for creating lazy nodes past 1-level deep.
struct CreateLazyNode {
    // Unique id for parent block.
    uint32 parent;

    // Unique id used between Controller and Puppet to uniquely identify lazy node.
    uint32 id;

    // Name passed in to CreateLazy{Node,Values) method
    string name;

    // Disposition flag that determines appropriate method.
    LinkDisposition disposition;

    // Send a sequence of actions to execute within the lambda to create Inspect
    // tree.
    vector<Action> actions;
};

// Action sent to instruct a Puppet to delete a lazy node.
struct DeleteLazyNode {
    // Unique id used between Controller and Puppet to uniquely identify lazy node.
    uint32 id;
};

/// Tells the puppet to do something to modify the VMO.
flexible union Action {
    1: CreateNode create_node;
    2: DeleteNode delete_node;
    3: CreateNumericProperty create_numeric_property;
    4: CreateBytesProperty create_bytes_property;
    5: CreateStringProperty create_string_property;
    6: DeleteProperty delete_property;
    7: SetNumber set_number;
    8: SetString set_string;
    9: SetBytes set_bytes;
    10: AddNumber add_number;
    11: SubtractNumber subtract_number;
    12: CreateArrayProperty create_array_property;
    13: ArraySet array_set;
    14: ArrayAdd array_add;
    15: ArraySubtract array_subtract;
    16: CreateLinearHistogram create_linear_histogram;
    17: CreateExponentialHistogram create_exponential_histogram;
    18: Insert insert;
    19: InsertMultiple insert_multiple;
    20: CreateBoolProperty create_bool_property;
    21: SetBool set_bool;
};

/// Tells the puppet to do something to modify a lazy node.
flexible union LazyAction {
    1: CreateLazyNode create_lazy_node;
    2: DeleteLazyNode delete_lazy_node;
};

[Discoverable]
protocol Validate {
    /// Initializes the Inspect library being tested by the puppet.
    Initialize(InitializationParams params) -> (handle? vmo, TestResult result);

    /// Use instead of `Initialize` on puppets which support the Tree / Lazy method of getting VMOs.
    /// The root VMO can be obtained via the returned Tree protocol.
    [Transitional]
    InitializeTree(InitializationParams params) -> (inspect.Tree? tree, TestResult result);

    /// Instruct the puppet to expose its current data in its out/diagnostics directory.
    ///
    /// Note: It is an error for more than one Validate connection to
    /// Publish at once. Unpublish must be called to cleanup.
    [Transitional]
    Publish() -> (TestResult result);

    /// Instruct the puppet to unpublish any data it currently has present in out/diagnostics.
    [Transitional]
    Unpublish() -> (TestResult result);

    /// Modifies the contents of the VMO.
    Act(Action action) -> (TestResult result);

    /// Modifies the contents of a lazy node.
    [Transitional]
    ActLazy(LazyAction lazy_action) -> (TestResult result);
};
