// Copyright 2020 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 test.thermal;

using fuchsia.thermal;

/// Enables tests to manipulate the thermal state of clients via a test service.
///
/// A service would implement both this protocol and
/// `fuchsia.thermal.ClientStateConnector` /
/// `fuchsia.thermal.ClientStateWatcher`. It would be injected into the
/// environment of the component under test. Once a client has connected to the
/// `ClientStateControl` service (using
/// `fuchsia.thermal.ClientStateConnector/Connect`) and issued a
/// `fuchsia.thermal.ClientStateWatcher/Watch` request, a test suite can
/// directly trigger state-change commands to that client by calling
/// `ClientStateControl/SetThermalState`.
@discoverable
protocol ClientStateControl {
    /// Checks if a client of the specified type has an active
    /// `fuchsia.thermal.ClientStateWatcher` connection.
    ///
    /// The request completes immediately (no hanging-get or waiting behavior).
    ///
    /// If a `ClientStateWatcher` was connected but then closes the channel,
    /// this method would then return false for that client type until a later
    /// time if/when that client type reconnects.
    IsClientTypeConnected(struct {
        client_type fuchsia.thermal.ClientType;
    }) -> (struct {
        connected bool;
    });

    /// Sets the thermal state of the specified client type.
    ///
    /// It is a fatal error to call this method before a client of the specified
    /// type has first connected to the `ClientStateConnector` service.
    ///
    /// If a client of the specified type has a pending `Watch` request, then
    /// the client will be updated with the new thermal state. The pending
    /// `Watch` request will be completed before this method is completed.
    ///
    /// If a client of the specified type does not have a pending `Watch`
    /// request, then the new thermal state will be cached and this method will
    /// be completed immediately.
    SetThermalState(struct {
        client_type fuchsia.thermal.ClientType;
        state uint64;
    }) -> ();
};
