// Copyright 2016 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.testing.runner;

struct TestResult {
    string name;
    int64 elapsed;
    bool failed;
    string message;
};

// This service is included in the Environment of multi-process tests
// that are launched by the test runner harness. Test processes can connect to
// this service to log failures, signal crashes, and signal completion.
// The empty return acknowledges that the connection to TestRunner was
// successful.
[Discoverable]
protocol TestRunner {
    // Tells the test runner how to identify this test program.
    Identify(string program_name) -> ();

    // Tells the test runner that a paritcular test case finished. May be called
    // multiple times.
    ReportResult(TestResult result);

    // Tells the test runner that a particular test case failed, with the supplied
    // message. May be called multiple times. When |Teardown()| is called, the
    // test program ends as a failure.
    //
    // |Fail()| is deprecated in favor of |ReportResult|.
    Fail(string log_message);

    // Either this method, |Teardown()| or |WillTerminate()| must be invoked
    // before closing the connection to this interface; otherwise the TestRunner
    // service will assume that the connection broke due to the test crashing.
    // The test runner will send a reply back as an acknowledgement when it starts
    // processing this method.
    Done() -> ();

    // Signals that the test program is complete and the entire test harness
    // should be torn down. The test will be declared a failure if |Fail()| was
    // ever called, or if |ReportResult()| was ever called where |failed| is true.
    // Otherwise the test will be declared successful. The test runner will send a
    // reply back as an acknowledgement when it starts processing this method.
    Teardown() -> ();

    // Signals that this process expects to be terminated within the time
    // specified. If it is not killed that is a failure. A test that calls this
    // should not call |Done()| or |Teardown()|.
    WillTerminate(float64 withinSeconds);

    // Declare how many test points this test is expected to pass to complete.
    SetTestPointCount(int64 count);

    // Signals that a test point has been passed.
    PassTestPoint();
};

// This service is included in the Environment of the test runner
// harness, along with TestRunner. This service represents a producer-consumer
// queue that is shared between all of its clients; clients can use it to signal
// events across different processes. Producers can queue values associated to a
// key, and consumers can get values out of the queue (or block until a value is
// available).
//
// Two example use cases:
//
// A module testing the persistence of its 'Ledger' between reinflations can use
// this queue to Put() some state and Get() the state in a subsequent run, and
// assert that the ledger data it sees in its subsequent runs matches the state
// saved in previous runs.
//
// An test agent can Put() a "connected" key when it receives a connection, and
// a test module that requested the agent can Get() that "connected" key to
// assert that it was able to connect to the right agent.
[Discoverable]
protocol TestRunnerStore {
    // This will store |key| with value |value| and respond back. Subsequent
    // Put()s to |key| are queued up until they are read by a |Get()|.
    Put(string key, string value) -> ();

    // Get() will return the next queued value associated with the |key|. If there
    // are no values queued for key, this method will not return until one has
    // been Put().
    Get(string key) -> (string value);
};
