// Copyright 2019 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 <fuchsia/sysmem/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/fdio/directory.h>
#include <lib/fdio/fd.h>
#include <lib/fdio/fdio.h>
#include <lib/sys/cpp/component_context.h>

#include "gtest/gtest.h"
#include "lib/fidl/cpp/interface_ptr.h"
#include "src/lib/fxl/logging.h"

// The sysmem-test in zircon covers more functionality of sysmem itself.  This
// test is only meant to verify that sysmem_connector establishes a connection
// to the sysmem driver.
TEST(SysmemConnectorTest, Connect) {
  async::Loop main_loop(&kAsyncLoopConfigAttachToThread);
  auto component_context = sys::ComponentContext::Create();

  std::mutex is_sync_complete_lock;
  bool is_sync_complete = false;

  fuchsia::sysmem::AllocatorPtr allocator;
  allocator.set_error_handler([](zx_status_t status) { ASSERT_TRUE(false); });
  component_context->svc()->Connect(
      allocator.NewRequest(main_loop.dispatcher()));

  fuchsia::sysmem::BufferCollectionTokenPtr token;
  token.set_error_handler([](zx_status_t status) { ASSERT_TRUE(false); });
  allocator->AllocateSharedCollection(token.NewRequest(main_loop.dispatcher()));

  token->Sync([&] {
    {  // scope lock
      std::lock_guard<std::mutex> lock(is_sync_complete_lock);
      is_sync_complete = true;
    }  // ~lock
  });

  while (true) {
    {  // scope lock
      std::lock_guard<std::mutex> lock(is_sync_complete_lock);
      if (is_sync_complete) {
        break;
      }
    }  // ~lock
    zx_status_t status = main_loop.Run(zx::deadline_after(zx::sec(30)), true);
    // If this didn't work after 30 seconds, consider that a test failure.
    ASSERT_EQ(status, ZX_OK);
  }
  ASSERT_TRUE(is_sync_complete);
  // The Sync() working means the Allocator connection was established to the
  // sysmem driver, and the driver responded.

  allocator.set_error_handler(
      [](zx_status_t status) { ASSERT_EQ(status, ZX_ERR_CANCELED); });
  token.set_error_handler(
      [](zx_status_t status) { ASSERT_EQ(status, ZX_ERR_CANCELED); });
}
