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

#ifndef ZIRCON_KERNEL_LIB_USERABI_USERBOOT_TESTS_HELPER_H_
#define ZIRCON_KERNEL_LIB_USERABI_USERBOOT_TESTS_HELPER_H_

#include <lib/zx/channel.h>
#include <lib/zx/eventpair.h>
#include <lib/zx/object.h>
#include <lib/zx/vmo.h>
#include <zircon/types.h>

#include <cstdint>
#include <string_view>
#include <vector>

struct Message {
  ~Message();

  std::vector<uint8_t> msg;
  std::vector<zx_handle_t> handles;
};

// View over a raw message that returns respective handles.
struct DebugDataMessageView {
  explicit DebugDataMessageView(const Message& msg) : message(&msg) {}

  std::string_view sink() const;
  zx::unowned_vmo vmo() const;
  zx::unowned_eventpair token() const;

  const Message* message = nullptr;
};

// Out parameters are used so that the implementation can use |ASSERT_*| macros and
// verified with |ASSERT_NON_FATAL_FAILURES|.

// Attempts to read a DebugDataMessage from |svc| this include dealing with the pipelined messages.
void GetDebugDataMessage(zx::unowned_channel svc, Message& msg);

// Given a |svc_stash| will attempt to read a stashed svc.
void GetStashedSvc(zx::unowned_channel svc_stash, zx::channel& svc);

// Will sec |svc_stash| to the equivalent startup SvcStash handle.
zx::channel GetSvcStash();

// `T` is a callable that is given a readable channel and a token to determine whether the loop
// should continue or not. It is important to leave the signature as non returning, such that
// tests may assert in the body.
template <typename T>
void OnEachMessage(zx::unowned_channel svc_stash, T&& callable) {
  zx_signals_t observed = 0;
  while (svc_stash->wait_one(ZX_CHANNEL_READABLE, zx::time::infinite_past(), &observed) !=
         ZX_ERR_TIMED_OUT) {
    if ((observed & ZX_CHANNEL_READABLE) == 0) {
      return;
    }
    bool cont = false;
    if (callable(svc_stash->borrow(), cont); !cont) {
      return;
    }
  }
}

// Returns the kernel object ID of the object and peer object respectively.
zx_koid_t GetKoid(zx_handle_t handle);
zx_koid_t GetPeerKoid(zx_handle_t handle);

#endif  // ZIRCON_KERNEL_LIB_USERABI_USERBOOT_TESTS_HELPER_H_
