// Copyright 2018 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.device.test;

using zx;

/// The path which can be used to open the control device
const string CONTROL_DEVICE = "/dev/test/test";

/// Returns the result summary of a test run
struct TestReport {
    /// Total number of tests
    uint32 test_count;
    /// Number of successful tests
    uint32 success_count;
    /// Number of failed tests
    uint32 failure_count;
};

[ForDeprecatedCBindings]
protocol Test {
    /// Execute the tests for this device. Returns the status from the test. If
    /// used as part of the Device protocol then Test output will be streamed to
    /// the socket set by SetOutputSocket().
    RunTests() -> (zx.status status, TestReport report);
};

/// Interface for controlling a device created via RootDevice.CreateDevice
[ForDeprecatedCBindings]
protocol Device {
    compose Test;

    /// Set a socket to stream test output to.
    SetOutputSocket(handle<socket> sock);

    /// Set a channel for the test to use in a test-specific manner.
    SetChannel(handle<channel> chan);

    /// Unload this device.
    Destroy();
};

/// Maximum device name len.  This value must match `ZX_DEVICE_NAME_MAX`.
const uint32 MAX_DEVICE_NAME_LEN = 31;

/// Maximum device path len
const uint32 MAX_DEVICE_PATH_LEN = 1024;

/// Interface for creating devices within a devhost.
[ForDeprecatedCBindings]
protocol RootDevice {
    /// Create a device with the given `name` that is a child of this device.
    /// If `name` contains a trailing ".so", it will be removed.
    ///
    /// If `device_request` is given, it is connected to the newly created device.
    ///
    /// On success, `path` will be the filesystem path of the new device.
    CreateDevice(string:MAX_DEVICE_NAME_LEN name, handle<channel>? device_request)
        -> (zx.status status, string:MAX_DEVICE_PATH_LEN? path);
};
