blob: b034257edea340bea69bdfbccad6ea4bcf4b24d9 [file] [log] [blame]
// 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);
};