// 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.
@available(added=7)
library fuchsia.driver.test;

using zx;
using fuchsia.io;
using fuchsia.diagnostics;

/// A driver name is the name defined in ZIRCON_DRIVER_BEGIN begin macro
/// for a specific driver.
alias DriverName = string:MAX;

type DriverLog = struct {
    name DriverName;
    log_level fuchsia.diagnostics.Severity;
};

/// A list of arguments that can be used to configure DriverTestRealm.
type RealmArgs = resource table {
    /// This is what DriverManager will see as its boot directory.
    /// Default: DriverTestRealm's package directory
    1: boot client_end:fuchsia.io.Directory;

    /// The URL for the driver that will be bound to root.
    /// Default: fuchsia-boot:///#driver/test-parent-sys.so
    /// NOTE: The test parent driver is not included by default. This must
    ///  be included in your package to work correctly.
    2: root_driver string:MAX;

    /// If this is true, then DriverManager will load DFv2 drivers.
    /// Default: false
    3: use_driver_framework_v2 bool;

    /// If this is true, then DriverManager will enable the unit tests
    /// for each driver that is loaded.
    /// Default: false
    4: driver_tests_enable_all bool;

    /// If this is true, then DriverManager will enable the unit tests
    /// for each driver in this vector.
    /// Default: empty
    5: driver_tests_enable vector<DriverName>:MAX;

    /// If this is true, then DriverManager will disable the unit tests
    /// for each driver in this vector. This overrides both a specific
    /// request for enabling a test and the 'driver_tests_enable_all'
    /// parameter.
    /// Default: empty
    6: driver_tests_disable vector<DriverName>:MAX;

    /// Set a log level for the specific driver.
    /// Default: Log levels are set to INFO
    7: driver_log_level vector<DriverLog>:MAX;

    /// Disable specific drivers. These drivers will not be bound or loaded.
    /// Default: empty
    8: driver_disable vector<DriverName>:MAX;

    /// Specify drivers to bind 'eagerly'. This turns a driver that normally
    /// binds as a fallback driver into a driver that will be bound normally.
    /// Default: empty
    9: driver_bind_eager vector<DriverName>:MAX;

    /// Specify the board name that drivers are aware of.
    /// Default: driver-integration-test
   10: board_name string:MAX;
};

/// This protocol is for the DriverTestRealm. It is an integration test
/// framework for drivers.
@discoverable
protocol Realm {
    /// Start the realm. Calling this will cause DriverTestRealm to start
    /// servicing other protocols (like /dev/). `args` is used to configure
    /// the DriverTestRealm.
    /// Calling `Start` while the realm is already started will return ZX_ERR_ALREADY_BOUND.
    Start(resource struct {
        args RealmArgs;
    }) -> (struct {}) error zx.status;
};
