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

/// A test-only library for extracting syscall information from a test fixture
/// that serves the `Control` protocol.
///
/// Use by connecting to [Control].
@available(added=HEAD)
library fuchsia.test.syscalls;

using zx;

/// Internal state of the code instrumented with tests syscalls.
type State = struct {
    /// Number of calls to zx_system_suspend_enter for the lifetime of this
    /// test fixture.
    zx_system_suspend_enter_calls_count uint32;
};

closed protocol Control {
    /// Set the status that the fixture returns on a return from
    /// zx_system_suspend_enter.
    strict SetSuspendEnterResult(struct {
        status zx.Status;
    }) -> ();

    /// Gets the internal state of the instrumented driver.
    strict GetState() -> (State);
};

/// Serves the Control protocol as a service. Only needed due to
/// driver test realm implementation detail.
service ControlService {
    control client_end:Control;
};
