// Copyright 2018 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 <lib/fidl/cpp/message_buffer.h>

#include <thread>

#include <gtest/gtest.h>

#include "lib/fidl/cpp/binding.h"
#include "lib/fidl/cpp/interface_ptr.h"
#include "lib/fidl/cpp/test/async_loop_for_test.h"
#include "lib/fidl/cpp/test/frobinator_impl.h"

namespace fidl {
namespace {

TEST(SynchronousInterfacePtr, Trivial) { fidl::test::frobinator::FrobinatorSyncPtr ptr; }

TEST(SynchronousInterfacePtr, Control) {
  fidl::test::frobinator::FrobinatorSyncPtr ptr;
  auto request = ptr.NewRequest();

  std::thread client([ptr = std::move(ptr)]() mutable {
    ptr->Frob("one");

    std::string result;
    ptr->Grob("two", &result);

    EXPECT_EQ("response", result);
  });

  fidl::test::AsyncLoopForTest loop;

  test::FrobinatorImpl impl;
  Binding<fidl::test::frobinator::Frobinator> binding(&impl);

  EXPECT_EQ(ZX_OK, binding.Bind(std::move(request)));

  binding.WaitForMessage();
  binding.WaitForMessage();

  client.join();
}

TEST(SynchronousInterfacePtr, Unbind) {
  fidl::test::frobinator::FrobinatorSyncPtr ptr;
  auto request = ptr.NewRequest();

  fidl::test::AsyncLoopForTest loop;

  test::FrobinatorImpl impl;
  Binding<fidl::test::frobinator::Frobinator> binding(&impl);

  EXPECT_EQ(ZX_OK, binding.Bind(std::move(request)));

  auto handle = ptr.Unbind();
  EXPECT_TRUE(handle.is_valid());
}

}  // namespace
}  // namespace fidl
