// 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
