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

library fuchsia.test;

/// Human-readable name for a test case.
using Name = string:512;

/// Optional unique tag to identitfy Invocation.
using Tag = string:512;

/// Describes a single test case.
table Case {
    /// Uniquely identifies a test case within a test suite.
    /// This member is required.
    1: Name name;
};

/// Represents success, failure, or other possible conditions following a test invocation.
enum Status {
    /// The test passed.
    PASSED = 1;

    /// The test failed.
    FAILED = 2;

    /// The test was skipped.
    /// A skipped status typically indicates that no attempt was made to run
    /// the test.
    ///
    /// Examples:
    /// The test was disabled by the developer.
    /// A precondition for running the test was not satisfied.
    SKIPPED = 3;
};

/// Specification of a test to run.
table Invocation {
    /// Uniquely identifies a test case within a test suite.
    /// This member is required.
    1: Name name;

    /// Optional tag, arbitrarily specified by clients of `Suite`.
    /// This field is not used by Suite protocol.
    2: Tag tag;
};

/// Optional additional instructions for running test cases.
table RunOptions {
};

/// Result of invoking a single test case.
table Result {
    /// This member is required.
    1: Status status;
};

/// Listens to updates from an individual test case run.
protocol CaseListener {
    /// Indicates that an invididual test case has completed and result is
    /// available.
    Finished(Result result);
};

/// Listens to updates from test runs.
protocol RunListener {
    /// Indicates that an individual test invocation has started execution.
    OnTestCaseStarted(Invocation invocation, handle<socket> primary_log, request<CaseListener> listener);

    /// Indicates that the last test case that started has finished, and no more test cases will start.
    OnFinished();
};

/// Iterator for listing available test cases.
protocol CaseIterator {
    /// Returns the next batch of test cases.
    GetNext() -> (vector<Case>:MAX cases);
};

[Discoverable]
protocol Suite {
    /// Enumerate the test cases available in this test suite.
    GetTests(request<CaseIterator> iterator);

    /// Run the specified test cases. Results are returned over the results
    /// channel.
    ///
    /// `tests` may contain duplicate elements, in which case the same test is
    /// run multiple times as indicated.
    /// Closing `test_listener` marks the end of this call.
    Run(vector<Invocation>:MAX tests, RunOptions options, RunListener listener);
};
