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

using fuchsia.url;
using fuchsia.test;

/// Options to run particular test suite.
/// Reserved for future
table LaunchOptions {
};

/// Error for `LaunchSuite` call.
enum LaunchError {
    /// There were insufficient resources to perform the operation.
    RESOURCE_UNAVAILABLE = 1;

    /// Cannot resolve `test_url`.
    INSTANCE_CANNOT_RESOLVE = 2;

    /// Invalid argument(s) passed.
    INVALID_ARGS = 3;

    /// Failed to connect to the `fuchsia.test.TestSuite` that the test should
    /// expose.
    FAILED_TO_CONNECT_TO_TEST_SUITE = 4;

    /// Some internal error occured. Something wrong with test manager setup. Check logs and report bug.
    INTERNAL_ERROR = 5;
};

/// Controller for running suite. Suite would be destroyed when client end of this protocol is closed.
protocol SuiteController {
    /// Destroys running suite.
    Kill();
};

/// Launches a test that implements the `fuchsia.test.Suite` protocol
/// (either directly or via a runner adapter). The test must be a
/// v2 component test.
///
/// Designed to be used by run_test_suite to execute v2 tests.
///
/// If test suite doesn't expose `fuchsia.test.Suite` protocol, this
/// call will suceed but call on suite protocol will fail with `PEER_CLOSED` error.
[Discoverable]
protocol Harness {
    LaunchSuite(fuchsia.url.Url test_url, LaunchOptions options,
                request<fuchsia.test.Suite> suite, request<SuiteController> controller) -> ()
        error LaunchError;
};
