// 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/interface_ptr.h"

#include <lib/fidl/cpp/message_buffer.h>

#include <thread>

#include "gtest/gtest.h"
#include "lib/fidl/cpp/binding.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
