blob: e92068fc492275799211315895a453fe4eea8d19 [file] [log] [blame]
// 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