// 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(zx.handle:SOCKET sock);

    /// Set a channel for the test to use in a test-specific manner.
    SetChannel(zx.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, zx.handle:CHANNEL? device_request)
        -> (zx.status status, string:MAX_DEVICE_PATH_LEN? path);
};
