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

#include "src/devices/bin/driver_runtime/runtime_test_case.h"

// static
void RuntimeTestCase::SignalOnChannelReadable(fdf_handle_t ch, fdf_dispatcher_t* dispatcher,
                                              sync_completion_t* completion) {
  auto channel_read = std::make_unique<fdf::ChannelRead>(
      ch, 0 /* options */,
      [completion](fdf_dispatcher_t* dispatcher, fdf::ChannelRead* channel_read,
                   zx_status_t status) {
        sync_completion_signal(completion);
        delete channel_read;
      });
  ASSERT_OK(channel_read->Begin(dispatcher));
  channel_read.release();  // Will be deleted on callback.
}

// static
void RuntimeTestCase::WaitUntilReadReady(fdf_handle_t ch, fdf_dispatcher_t* dispatcher) {
  sync_completion_t read_completion;
  ASSERT_NO_FATAL_FAILURE(SignalOnChannelReadable(ch, dispatcher, &read_completion));
  sync_completion_wait(&read_completion, ZX_TIME_INFINITE);
}

// static
void RuntimeTestCase::AssertRead(fdf_handle_t ch, void* want_data, size_t want_num_bytes,
                                 zx_handle_t* want_handles, uint32_t want_num_handles,
                                 fdf_arena_t** out_arena) {
  fdf_arena_t* arena;
  void* read_data;
  uint32_t num_bytes;
  zx_handle_t* handles;
  uint32_t num_handles;
  ASSERT_EQ(ZX_OK, fdf_channel_read(ch, 0, &arena, &read_data, &num_bytes, &handles, &num_handles));

  ASSERT_EQ(num_bytes, want_num_bytes);
  if (want_num_bytes > 0) {
    ASSERT_NOT_NULL(arena);
    ASSERT_TRUE(fdf_arena_contains(arena, read_data, num_bytes));
    ASSERT_EQ(0, memcmp(want_data, read_data, want_num_bytes));
  }
  ASSERT_EQ(num_handles, want_num_handles);
  if (want_num_handles > 0) {
    ASSERT_NOT_NULL(arena);
    ASSERT_TRUE(fdf_arena_contains(arena, handles, num_handles * sizeof(fdf_handle_t)));
    ASSERT_EQ(0, memcmp(want_handles, handles, want_num_handles * sizeof(fdf_handle_t)));
  }
  if (arena) {
    if (out_arena) {
      *out_arena = arena;
    } else {
      fdf_arena_drop_ref(arena);
    }
  } else {
    ASSERT_NULL(read_data);
    ASSERT_NULL(handles);
  }
}
