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

#include <lib/zx/channel.h>

#include <utility>

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

namespace fidl {
namespace {

TEST(InterfaceRequest, Trivial) {
  InterfaceRequest<fidl::test::frobinator::Frobinator> request;
}

TEST(InterfaceRequest, Control) {
  zx::channel h1, h2;
  EXPECT_EQ(ZX_OK, zx::channel::create(0, &h1, &h2));
  zx_handle_t saved1 = h1.get();

  InterfaceRequest<fidl::test::frobinator::Frobinator> request(std::move(h1));
  EXPECT_TRUE(request.is_valid());
  EXPECT_EQ(saved1, request.channel().get());

  InterfaceRequest<fidl::test::frobinator::Frobinator> request2 =
      std::move(request);
  EXPECT_FALSE(request.is_valid());
  EXPECT_TRUE(request2.is_valid());
  EXPECT_EQ(saved1, request2.channel().get());

  h1 = request2.TakeChannel();
  EXPECT_EQ(saved1, h1.get());
  EXPECT_FALSE(request2.is_valid());

  zx_handle_t saved2 = h2.get();
  request.set_channel(std::move(h2));
  EXPECT_TRUE(request.is_valid());
  EXPECT_EQ(saved2, request.channel().get());

  request = nullptr;
  EXPECT_FALSE(request.is_valid());

  EXPECT_EQ(ZX_ERR_PEER_CLOSED, h1.write(0, "a", 1, nullptr, 0));
}

TEST(InterfaceRequest, Close) {
  fidl::test::AsyncLoopForTest loop;

  fidl::test::frobinator::FrobinatorPtr ptr;
  zx_status_t error = 0;
  ptr.set_error_handler(
      [&error](zx_status_t remote_error) { error = remote_error; });

  InterfaceRequest<fidl::test::frobinator::Frobinator> request =
      ptr.NewRequest();
  EXPECT_TRUE(request.is_valid());

  constexpr zx_status_t kSysError = 0xabDECADE;

  EXPECT_EQ(ZX_OK, request.Close(kSysError));
  EXPECT_FALSE(request.is_valid());

  // Should only be able to call Close successfully once
  EXPECT_EQ(ZX_ERR_BAD_STATE, request.Close(ZX_ERR_BAD_STATE));

  loop.RunUntilIdle();
  EXPECT_EQ(kSysError, error);
}

}  // namespace
}  // namespace fidl
