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

using zx;

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

/// Optional unique tag to identitfy Invocation.
alias 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;
    /// Whether the test is enabled or disabled (marked ignored/skipped) by the developer.
    /// If the member is omitted, the test is assumed to be enabled.
    2: bool enabled;
};

/// 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, but passed
    /// back as is by `OnTestCaseStarted`.
    2: Tag tag;
};

/// Optional additional instructions for running test cases.
table RunOptions {
    /// If set to true, test cases that have been disabled by the test author will nonetheless be
    /// executed.
    1: bool include_disabled_tests;

    /// Defines maximum number of test cases to run simultaneously.
    /// If unspecified, the default behavior is chosen by the `Suite`
    /// implementation.
    2: uint16 parallel;

    /// Optional arguments to pass to the test.
    3: vector<string:MAX>:MAX arguments;
};

/// 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, zx.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);
};
