| // Copyright 2022 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 <fidl/test.unknown.interactions/cpp/fidl.h> |
| #include <lib/async-loop/cpp/loop.h> |
| #include <lib/async-loop/default.h> |
| |
| #include <algorithm> |
| #include <future> |
| #include <optional> |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| struct FakeUnknownMethod { |
| static constexpr uint64_t kOrdinal = 0x10ff10ff10ff10ff; |
| }; |
| |
| namespace { |
| namespace test = ::test_unknown_interactions; |
| |
| class UnknownInteractionsEventHandlerBase |
| : public ::fidl::AsyncEventHandler<::test::UnknownInteractionsProtocol>, |
| public ::fidl::SyncEventHandler<::test::UnknownInteractionsProtocol> { |
| void StrictEvent() override { ADD_FAILURE() << "StrictEvent called unexpectedly"; } |
| void StrictEventFields( |
| ::fidl::Event<::test_unknown_interactions::UnknownInteractionsProtocol::StrictEventFields>&) |
| override { |
| ADD_FAILURE() << "StrictEventFields called unexpectedly"; |
| } |
| void FlexibleEvent() override { ADD_FAILURE() << "FlexibleEvent called unexpectedly"; } |
| void FlexibleEventFields( |
| ::fidl::Event<::test_unknown_interactions::UnknownInteractionsProtocol::FlexibleEventFields>&) |
| override { |
| ADD_FAILURE() << "FlexibleEventFields called unexpectedly"; |
| } |
| |
| void handle_unknown_event( |
| ::fidl::UnknownEventMetadata<::test::UnknownInteractionsProtocol> metadata) override { |
| ADD_FAILURE() << "Unexpected flexible unknown event"; |
| } |
| }; |
| |
| class UnknownInteractionsServerBase : public ::fidl::Server<::test::UnknownInteractionsProtocol> { |
| void StrictOneWay(StrictOneWayCompleter::Sync& completer) override { |
| ADD_FAILURE() << "StrictOneWay called unexpectedly"; |
| } |
| |
| void FlexibleOneWay(FlexibleOneWayCompleter::Sync& completer) override { |
| ADD_FAILURE() << "FlexibleOneWay called unexpectedly"; |
| } |
| |
| void StrictTwoWay(StrictTwoWayCompleter::Sync& completer) override { |
| ADD_FAILURE() << "StrictTwoWay called unexpectedly"; |
| } |
| |
| void StrictTwoWayFields(StrictTwoWayFieldsCompleter::Sync& completer) override { |
| ADD_FAILURE() << "StrictTwoWayFields called unexpectedly"; |
| } |
| |
| void FlexibleTwoWay(FlexibleTwoWayCompleter::Sync& completer) override { |
| ADD_FAILURE() << "FlexibleTwoWay called unexpectedly"; |
| } |
| |
| void FlexibleTwoWayFields(FlexibleTwoWayFieldsCompleter::Sync& completer) override { |
| ADD_FAILURE() << "FlexibleTwoWayFields called unexpectedly"; |
| } |
| |
| void StrictTwoWayErr(StrictTwoWayErrCompleter::Sync& completer) override { |
| ADD_FAILURE() << "StrictTwoWayErr called unexpectedly"; |
| } |
| |
| void StrictTwoWayFieldsErr(StrictTwoWayFieldsErrCompleter::Sync& completer) override { |
| ADD_FAILURE() << "StrictTwoWayFieldsErr called unexpectedly"; |
| } |
| |
| void FlexibleTwoWayErr(FlexibleTwoWayErrCompleter::Sync& completer) override { |
| ADD_FAILURE() << "FlexibleTwoWayErr called unexpectedly"; |
| } |
| |
| void FlexibleTwoWayFieldsErr(FlexibleTwoWayFieldsErrCompleter::Sync& completer) override { |
| ADD_FAILURE() << "FlexibleTwoWayFieldsErr called unexpectedly"; |
| } |
| |
| void handle_unknown_method( |
| ::fidl::UnknownMethodMetadata<::test::UnknownInteractionsProtocol> metadata, |
| ::fidl::UnknownMethodCompleter::Sync& completer) override { |
| ADD_FAILURE() << "Unexpected flexible unknown method"; |
| } |
| }; |
| |
| class UnknownInteractions : public ::testing::Test { |
| protected: |
| void SetUp() override { |
| loop_.emplace(&kAsyncLoopConfigAttachToCurrentThread); |
| |
| auto endpoints = fidl::Endpoints<test::UnknownInteractionsProtocol>::Create(); |
| client_end_ = std::move(endpoints.client); |
| server_end_ = std::move(endpoints.server); |
| } |
| |
| async::Loop& loop() { return loop_.value(); } |
| |
| fidl::ServerEnd<test::UnknownInteractionsProtocol> TakeServerEnd() { |
| EXPECT_TRUE(server_end_.is_valid()); |
| return std::move(server_end_); |
| } |
| |
| template <typename ServerImpl> |
| fidl::ServerBindingRef<typename ServerImpl::_EnclosingProtocol> BindServer(ServerImpl* impl) { |
| return ::fidl::BindServer( |
| loop().dispatcher(), |
| fidl::ServerEnd<typename ServerImpl::_EnclosingProtocol>(TakeServerChannel()), impl); |
| } |
| |
| zx::channel TakeServerChannel() { |
| EXPECT_TRUE(server_end_.is_valid()); |
| return server_end_.TakeChannel(); |
| } |
| |
| zx::channel TakeClientChannel() { |
| EXPECT_TRUE(client_end_.is_valid()); |
| return client_end_.TakeChannel(); |
| } |
| |
| fidl::SyncClient<test::UnknownInteractionsProtocol> SyncClient() { |
| EXPECT_TRUE(client_end_.is_valid()); |
| return fidl::SyncClient<test::UnknownInteractionsProtocol>(std::move(client_end_)); |
| } |
| |
| fidl::Client<test::UnknownInteractionsProtocol> AsyncClient( |
| fidl::AsyncEventHandler<test::UnknownInteractionsProtocol>* event_handler = nullptr) { |
| EXPECT_TRUE(client_end_.is_valid()); |
| return fidl::Client<test::UnknownInteractionsProtocol>(std::move(client_end_), |
| loop_->dispatcher(), event_handler); |
| } |
| |
| private: |
| std::optional<async::Loop> loop_; |
| fidl::ClientEnd<test::UnknownInteractionsProtocol> client_end_; |
| fidl::ServerEnd<test::UnknownInteractionsProtocol> server_end_; |
| }; |
| |
| template <size_t N> |
| std::array<uint8_t, N - sizeof(zx_txid_t)> ExcludeTxid(std::array<uint8_t, N> buf) { |
| std::array<uint8_t, N - sizeof(zx_txid_t)> without_txid; |
| std::memcpy(without_txid.data(), buf.data() + sizeof(zx_txid_t), without_txid.size()); |
| return without_txid; |
| } |
| |
| // Helper for receiving raw data from a channel. |
| template <uint32_t N> |
| struct ReadResult { |
| // Status from reading. |
| zx_status_t status; |
| // Bytes from the read. |
| std::array<uint8_t, N> buf; |
| |
| ReadResult() = delete; |
| static ReadResult<N> ReadFromChannel(const zx::channel& channel) { |
| ReadResult<N> result(channel); |
| return result; |
| } |
| |
| // Get the contents of the buffer excluding the transaction ID. |
| std::array<uint8_t, N - sizeof(zx_txid_t)> buf_excluding_txid() { return ExcludeTxid(buf); } |
| |
| // Get the transaction id portion of the buffer. |
| zx_txid_t txid() { |
| zx_txid_t value; |
| std::memcpy(&value, buf.data(), sizeof(zx_txid_t)); |
| return value; |
| } |
| |
| protected: |
| // Construct a ReadResult by reading from a channel. |
| explicit ReadResult(const zx::channel& channel) { |
| status = channel.wait_one(ZX_CHANNEL_READABLE | ZX_CHANNEL_PEER_CLOSED, zx::time::infinite(), |
| nullptr); |
| if (status != ZX_OK) |
| return; |
| uint32_t num_bytes; |
| uint32_t num_handles; |
| status = channel.read(/* flags= */ 0, buf.data(), /* handles= */ nullptr, N, |
| /* num_handles= */ 0, &num_bytes, &num_handles); |
| if (status == ZX_OK) { |
| EXPECT_EQ(N, num_bytes); |
| EXPECT_EQ(0u, num_handles); |
| } |
| } |
| }; |
| |
| template <uint32_t N> |
| struct TwoWayServerRequest : public ReadResult<N> { |
| TwoWayServerRequest() = delete; |
| static TwoWayServerRequest<N> ReadFromChannel(const zx::channel& channel) { |
| TwoWayServerRequest<N> result(channel); |
| return result; |
| } |
| |
| // Helper to send a reply to the read as a two-way message. |
| // Copies the txid (first four) bytes from |buf| into |reply_bytes| and sends |
| // the result on the channel, storing the status in |reply_status|. |
| template <size_t M> |
| void reply(const zx::channel& channel, std::array<uint8_t, M> reply_bytes) { |
| std::copy(this->buf.begin(), this->buf.begin() + 4, reply_bytes.begin()); |
| ASSERT_EQ(ZX_OK, channel.write(/* flags= */ 0, reply_bytes.data(), static_cast<uint32_t>(M), |
| /* handles= */ nullptr, /* num_handles= */ 0)); |
| } |
| |
| protected: |
| using ReadResult<N>::ReadResult; |
| }; |
| |
| enum class ResultUnionTag : fidl_union_tag_t { |
| kSuccess = 1, |
| kDomainError = 2, |
| kFrameworkError = 3, |
| }; |
| |
| class InlineValue : public std::array<uint8_t, 4> { |
| public: |
| InlineValue(uint32_t value) { std::memcpy(data(), &value, sizeof(value)); } |
| |
| InlineValue(int32_t value) { std::memcpy(data(), &value, sizeof(value)); } |
| }; |
| |
| // Make an array representing a message with a transaction header and body. |
| template <typename FidlMethod> |
| std::array<uint8_t, sizeof(fidl_message_header_t) + sizeof(fidl_union_t)> MakeMessage( |
| zx_txid_t txid, fidl::MessageDynamicFlags dynamic_flags, ResultUnionTag result_union_tag, |
| InlineValue inline_value) { |
| fidl_message_header_t header{ |
| .txid = txid, |
| .at_rest_flags = {FIDL_MESSAGE_HEADER_AT_REST_FLAGS_0_USE_VERSION_V2, 0}, |
| .dynamic_flags = dynamic_flags.value, |
| .magic_number = kFidlWireFormatMagicNumberInitial, |
| .ordinal = FidlMethod::kOrdinal, |
| }; |
| fidl_union_t body{ |
| .tag = static_cast<std::underlying_type_t<ResultUnionTag>>(result_union_tag), |
| .envelope = |
| { |
| .num_handles = 0, |
| .flags = 1, |
| }, |
| }; |
| std::memcpy(body.envelope.inline_value, inline_value.data(), sizeof(body.envelope.inline_value)); |
| std::array<uint8_t, sizeof(fidl_message_header_t) + sizeof(fidl_union_t)> result; |
| std::memcpy(result.data(), &header, sizeof(fidl_message_header_t)); |
| std::memcpy(result.data() + sizeof(fidl_message_header_t), &body, sizeof(fidl_union_t)); |
| return result; |
| } |
| |
| // Make an array representing a message with a transaction header and body. |
| // This version is for tests which don't care about the txid or want a zero |
| // txid (e.g. one way interactions). |
| template <typename FidlMethod> |
| std::array<uint8_t, sizeof(fidl_message_header_t) + sizeof(fidl_union_t)> MakeMessage( |
| fidl::MessageDynamicFlags dynamic_flags, ResultUnionTag result_union_tag, |
| InlineValue inline_value) { |
| return MakeMessage<FidlMethod>(0, dynamic_flags, result_union_tag, inline_value); |
| } |
| |
| // Make an array representing a message with just a transaction header. |
| template <typename FidlMethod> |
| std::array<uint8_t, sizeof(fidl_message_header_t)> MakeMessage( |
| zx_txid_t txid, fidl::MessageDynamicFlags dynamic_flags) { |
| fidl_message_header_t header{ |
| .txid = txid, |
| .at_rest_flags = {FIDL_MESSAGE_HEADER_AT_REST_FLAGS_0_USE_VERSION_V2, 0}, |
| .dynamic_flags = dynamic_flags.value, |
| .magic_number = kFidlWireFormatMagicNumberInitial, |
| .ordinal = FidlMethod::kOrdinal, |
| }; |
| std::array<uint8_t, sizeof(fidl_message_header_t)> result; |
| std::memcpy(result.data(), &header, sizeof(fidl_message_header_t)); |
| return result; |
| } |
| |
| // Make an array representing a message with just a transaction header. |
| // This version is for tests which don't care about the txid or want a zero |
| // txid (e.g. one way interactions). |
| template <typename FidlMethod> |
| std::array<uint8_t, sizeof(fidl_message_header_t)> MakeMessage( |
| fidl::MessageDynamicFlags dynamic_flags) { |
| return MakeMessage<FidlMethod>(0, dynamic_flags); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| /////////////////////////////////////////////////////////////////////////////// |
| //// Client Side Tests |
| /////////////////////////////////////////////////////////////////////////////// |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| //// One-Way Methods - Async Client |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST_F(UnknownInteractions, OneWayStrictAsyncSend) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| auto result = client->StrictOneWay(); |
| EXPECT_TRUE(result.is_ok()); |
| |
| auto received = ReadResult<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| |
| auto expected = MakeMessage<test::UnknownInteractionsProtocol::StrictOneWay>( |
| fidl::MessageDynamicFlags::kStrictMethod); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, OneWayFlexibleAsyncSend) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| auto result = client->FlexibleOneWay(); |
| EXPECT_TRUE(result.is_ok()); |
| |
| auto received = ReadResult<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| |
| auto expected = MakeMessage<test::UnknownInteractionsProtocol::FlexibleOneWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| //// Two-Way Methods - Async Client |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST_F(UnknownInteractions, TwoWayStrictAsyncSend) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->StrictTwoWay().Then([](auto& response) { EXPECT_TRUE(response.is_ok()); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::StrictTwoWay>( |
| fidl::MessageDynamicFlags::kStrictMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::StrictTwoWay>( |
| fidl::MessageDynamicFlags::kStrictMethod); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayStrictErrAsyncSend) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->StrictTwoWayErr().Then([](auto& response) { EXPECT_TRUE(response.is_ok()); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::StrictTwoWayErr>( |
| fidl::MessageDynamicFlags::kStrictMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::StrictTwoWayErr>( |
| fidl::MessageDynamicFlags::kStrictMethod, ResultUnionTag::kSuccess, 0); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleAsyncSend) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWay().Then([](auto& response) { EXPECT_TRUE(response.is_ok()); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 0); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleAsyncSendUnknownResponse) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWay().Then([](auto& response) { |
| ASSERT_TRUE(response.is_error()); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, response.error_value().status()); |
| EXPECT_EQ(fidl::Reason::kUnknownMethod, response.error_value().reason()); |
| }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, |
| ZX_ERR_NOT_SUPPORTED); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleAsyncSendOtherFrameworkError) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWay().Then([](auto& response) { |
| ASSERT_TRUE(response.is_error()); |
| EXPECT_EQ(ZX_ERR_INVALID_ARGS, response.error_value().status()); |
| EXPECT_EQ(fidl::Reason::kDecodeError, response.error_value().reason()); |
| }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, |
| ZX_ERR_INVALID_ARGS); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleAsyncSendOkFrameworkError) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWay().Then([](auto& response) { |
| ASSERT_TRUE(response.is_error()); |
| EXPECT_EQ(ZX_ERR_INVALID_ARGS, response.error_value().status()); |
| EXPECT_EQ(fidl::Reason::kDecodeError, response.error_value().reason()); |
| }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, ZX_OK); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleAsyncSendErrorVariant) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWay().Then([](auto& response) { |
| ASSERT_TRUE(response.is_error()); |
| EXPECT_EQ(fidl::Reason::kDecodeError, response.error_value().reason()); |
| }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kDomainError, 0x100); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleFieldsAsyncSend) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWayFields().Then([](auto& response) { |
| ASSERT_TRUE(response.is_ok()); |
| EXPECT_EQ(32, response.value().some_field()); |
| }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFields>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFields>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 32); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleFieldsAsyncSendUnknownResponse) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWayFields().Then([](auto& response) { |
| ASSERT_TRUE(response.is_error()); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, response.error_value().status()); |
| EXPECT_EQ(fidl::Reason::kUnknownMethod, response.error_value().reason()); |
| }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFields>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFields>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, |
| ZX_ERR_NOT_SUPPORTED); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleErrAsyncSend) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWayErr().Then([](auto& response) { EXPECT_TRUE(response.is_ok()); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 0); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleErrAsyncSendUnknownResponse) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWayErr().Then([](auto& response) { |
| ASSERT_TRUE(response.is_error()); |
| ASSERT_TRUE(response.error_value().is_framework_error()); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, response.error_value().framework_error().status()); |
| EXPECT_EQ(fidl::Reason::kUnknownMethod, response.error_value().framework_error().reason()); |
| }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, |
| ZX_ERR_NOT_SUPPORTED); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleErrAsyncSendOtherFrameworkError) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWayErr().Then([](auto& response) { |
| ASSERT_TRUE(response.is_error()); |
| ASSERT_TRUE(response.error_value().is_framework_error()); |
| EXPECT_EQ(ZX_ERR_INVALID_ARGS, response.error_value().framework_error().status()); |
| EXPECT_EQ(fidl::Reason::kDecodeError, response.error_value().framework_error().reason()); |
| }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, |
| ZX_ERR_ACCESS_DENIED); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleErrAsyncSendErrorVariant) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWayErr().Then([](auto& response) { |
| ASSERT_TRUE(response.is_error()); |
| ASSERT_TRUE(response.error_value().is_domain_error()); |
| EXPECT_EQ(0x100, response.error_value().domain_error()); |
| }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kDomainError, 0x100); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleFieldsErrAsyncSend) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWayFieldsErr().Then([](auto& response) { |
| ASSERT_TRUE(response.is_ok()); |
| EXPECT_EQ(32, response.value().some_field()); |
| }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = |
| ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 32); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleFieldsErrAsyncSendUnknownResponse) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWayFieldsErr().Then([](auto& response) { |
| ASSERT_TRUE(response.is_error()); |
| ASSERT_TRUE(response.error_value().is_framework_error()); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, response.error_value().framework_error().status()); |
| EXPECT_EQ(fidl::Reason::kUnknownMethod, response.error_value().framework_error().reason()); |
| }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = |
| ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, |
| ZX_ERR_NOT_SUPPORTED); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleFieldsErrAsyncSendErrorVariant) { |
| auto client = AsyncClient(); |
| auto server = TakeServerChannel(); |
| |
| client->FlexibleTwoWayFieldsErr().Then([](auto& response) { |
| ASSERT_TRUE(response.is_error()); |
| ASSERT_TRUE(response.error_value().is_domain_error()); |
| EXPECT_EQ(0x100, response.error_value().domain_error()); |
| }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = |
| ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kDomainError, 0x100); |
| received.reply(server, server_reply); |
| |
| loop().RunUntilIdle(); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| //// Events - Async Client |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST_F(UnknownInteractions, ReceiveStrictEventAsync) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase { |
| void StrictEvent() override { received_event = true; } |
| |
| public: |
| bool received_event = false; |
| }; |
| EventHandler handler; |
| auto client = AsyncClient(&handler); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<::test::UnknownInteractionsProtocol::StrictEvent>( |
| ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| EXPECT_TRUE(handler.received_event); |
| } |
| |
| TEST_F(UnknownInteractions, ReceiveStrictEventAsyncMismatchedStrictness) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase { |
| void StrictEvent() override { received_event = true; } |
| |
| public: |
| bool received_event = false; |
| }; |
| EventHandler handler; |
| auto client = AsyncClient(&handler); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<::test::UnknownInteractionsProtocol::StrictEvent>( |
| ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| EXPECT_TRUE(handler.received_event); |
| } |
| |
| TEST_F(UnknownInteractions, ReceiveFlexibleEventAsync) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase { |
| void FlexibleEvent() override { received_event = true; } |
| |
| public: |
| bool received_event = false; |
| }; |
| EventHandler handler; |
| auto client = AsyncClient(&handler); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleEvent>( |
| ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| EXPECT_TRUE(handler.received_event); |
| } |
| |
| TEST_F(UnknownInteractions, ReceiveFlexibleEventAsyncMismatchedStrictness) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase { |
| void FlexibleEvent() override { received_event = true; } |
| |
| public: |
| bool received_event = false; |
| }; |
| EventHandler handler; |
| auto client = AsyncClient(&handler); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleEvent>( |
| ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| EXPECT_TRUE(handler.received_event); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| //// Unknown messages - Async Client |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST_F(UnknownInteractions, UnknownServerSentTwoWayAsyncClient) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase {}; |
| EventHandler handler; |
| auto client = AsyncClient(&handler); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = |
| MakeMessage<FakeUnknownMethod>(0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownStrictEventAsync) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase {}; |
| EventHandler handler; |
| auto client = AsyncClient(&handler); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<FakeUnknownMethod>(::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownFlexibleEventAsync) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase { |
| void handle_unknown_event( |
| ::fidl::UnknownEventMetadata<::test::UnknownInteractionsProtocol> metadata) override { |
| received_event = true; |
| ASSERT_EQ(FakeUnknownMethod::kOrdinal, metadata.event_ordinal); |
| } |
| |
| public: |
| bool received_event = false; |
| }; |
| EventHandler handler; |
| auto client = AsyncClient(&handler); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = |
| MakeMessage<FakeUnknownMethod>(::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| ASSERT_TRUE(handler.received_event); |
| |
| // Write again to check that the channel is still open. |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownStrictEventAsyncAjarProtocol) { |
| class EventHandler : public ::fidl::AsyncEventHandler<::test::UnknownInteractionsAjarProtocol> { |
| void handle_unknown_event( |
| ::fidl::UnknownEventMetadata<::test::UnknownInteractionsAjarProtocol> metadata) override { |
| ADD_FAILURE() << "Unexpected flexible unknown event"; |
| } |
| }; |
| |
| EventHandler handler; |
| auto client = fidl::Client<::test::UnknownInteractionsAjarProtocol>( |
| ::fidl::ClientEnd<::test::UnknownInteractionsAjarProtocol>(TakeClientChannel()), |
| loop().dispatcher(), &handler); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<FakeUnknownMethod>(::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownFlexibleEventAsyncAjarProtocol) { |
| class EventHandler : public ::fidl::AsyncEventHandler<::test::UnknownInteractionsAjarProtocol> { |
| void handle_unknown_event( |
| ::fidl::UnknownEventMetadata<::test::UnknownInteractionsAjarProtocol> metadata) override { |
| received_event = true; |
| ASSERT_EQ(FakeUnknownMethod::kOrdinal, metadata.event_ordinal); |
| } |
| |
| public: |
| bool received_event = false; |
| }; |
| EventHandler handler; |
| auto client = fidl::Client<::test::UnknownInteractionsAjarProtocol>( |
| ::fidl::ClientEnd<::test::UnknownInteractionsAjarProtocol>(TakeClientChannel()), |
| loop().dispatcher(), &handler); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = |
| MakeMessage<FakeUnknownMethod>(::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| ASSERT_TRUE(handler.received_event); |
| |
| // Write again to check that the channel is still open. |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownStrictEventAsyncClosedProtocol) { |
| class EventHandler : public ::fidl::AsyncEventHandler<::test::UnknownInteractionsClosedProtocol> { |
| }; |
| EventHandler handler; |
| auto client = fidl::Client<::test::UnknownInteractionsClosedProtocol>( |
| ::fidl::ClientEnd<::test::UnknownInteractionsClosedProtocol>(TakeClientChannel()), |
| loop().dispatcher(), &handler); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<FakeUnknownMethod>(::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownFlexibleEventAsyncClosedProtocol) { |
| class EventHandler : public ::fidl::AsyncEventHandler<::test::UnknownInteractionsClosedProtocol> { |
| }; |
| EventHandler handler; |
| auto client = fidl::Client<::test::UnknownInteractionsClosedProtocol>( |
| ::fidl::ClientEnd<::test::UnknownInteractionsClosedProtocol>(TakeClientChannel()), |
| loop().dispatcher(), &handler); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = |
| MakeMessage<FakeUnknownMethod>(::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| //// One-Way Methods - Sync Client |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST_F(UnknownInteractions, OneWayStrictSyncSend) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| auto result = client->StrictOneWay(); |
| EXPECT_TRUE(result.is_ok()); |
| |
| auto received = ReadResult<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| |
| auto expected = MakeMessage<test::UnknownInteractionsProtocol::StrictOneWay>( |
| fidl::MessageDynamicFlags::kStrictMethod); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, OneWayFlexibleSyncSend) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| auto result = client->FlexibleOneWay(); |
| EXPECT_TRUE(result.is_ok()); |
| |
| auto received = ReadResult<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| |
| auto expected = MakeMessage<test::UnknownInteractionsProtocol::FlexibleOneWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| //// Two-Way Methods - Sync Client |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST_F(UnknownInteractions, TwoWayStrictSyncSend) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->StrictTwoWay(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::StrictTwoWay>( |
| fidl::MessageDynamicFlags::kStrictMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::StrictTwoWay>( |
| fidl::MessageDynamicFlags::kStrictMethod); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| EXPECT_TRUE(response.is_ok()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayStrictErrSyncSend) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->StrictTwoWayErr(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::StrictTwoWayErr>( |
| fidl::MessageDynamicFlags::kStrictMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::StrictTwoWayErr>( |
| fidl::MessageDynamicFlags::kStrictMethod, ResultUnionTag::kSuccess, 0); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| EXPECT_TRUE(response.is_ok()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleSyncSend) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWay(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 0); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| EXPECT_TRUE(response.is_ok()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleSyncSendUnknownResponse) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWay(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, |
| ZX_ERR_NOT_SUPPORTED); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_error()); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, response.error_value().status()); |
| EXPECT_EQ(fidl::Reason::kUnknownMethod, response.error_value().reason()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleSyncSendOtherFrameworkError) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWay(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, |
| ZX_ERR_ACCESS_DENIED); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_error()); |
| EXPECT_EQ(ZX_ERR_INVALID_ARGS, response.error_value().status()); |
| EXPECT_EQ(fidl::Reason::kDecodeError, response.error_value().reason()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleSyncSendOkFrameworkError) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWay(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, ZX_OK); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_error()); |
| EXPECT_EQ(ZX_ERR_INVALID_ARGS, response.error_value().status()); |
| EXPECT_EQ(fidl::Reason::kDecodeError, response.error_value().reason()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleSyncSendErrorVariant) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWay(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kDomainError, 0x100); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_error()); |
| EXPECT_EQ(fidl::Reason::kDecodeError, response.error_value().reason()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleFieldsSyncSend) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWayFields(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFields>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFields>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 32); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_ok()); |
| EXPECT_EQ(32, response.value().some_field()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleFieldsSyncSendUnknownResponse) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWayFields(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFields>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFields>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, |
| ZX_ERR_NOT_SUPPORTED); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_error()); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, response.error_value().status()); |
| EXPECT_EQ(fidl::Reason::kUnknownMethod, response.error_value().reason()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleErrSyncSend) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWayErr(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 0); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_ok()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleErrSyncSendUnknownResponse) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWayErr(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, |
| ZX_ERR_NOT_SUPPORTED); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_error()); |
| ASSERT_TRUE(response.error_value().is_framework_error()); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, response.error_value().framework_error().status()); |
| EXPECT_EQ(fidl::Reason::kUnknownMethod, response.error_value().framework_error().reason()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleErrSyncSendOtherFrameworkError) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWayErr(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, |
| ZX_ERR_ACCESS_DENIED); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_error()); |
| ASSERT_TRUE(response.error_value().is_framework_error()); |
| EXPECT_EQ(ZX_ERR_INVALID_ARGS, response.error_value().framework_error().status()); |
| EXPECT_EQ(fidl::Reason::kDecodeError, response.error_value().framework_error().reason()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleErrSyncSendErrorVariant) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWayErr(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kDomainError, 0x100); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_error()); |
| ASSERT_TRUE(response.error_value().is_domain_error()); |
| EXPECT_EQ(0x100, response.error_value().domain_error()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleFieldsErrSyncSend) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWayFieldsErr(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = |
| ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 32); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_ok()); |
| EXPECT_EQ(32, response.value().some_field()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleFieldsErrSyncSendUnknownResponse) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWayFieldsErr(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = |
| ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kFrameworkError, |
| ZX_ERR_NOT_SUPPORTED); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_error()); |
| ASSERT_TRUE(response.error_value().is_framework_error()); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, response.error_value().framework_error().status()); |
| EXPECT_EQ(fidl::Reason::kUnknownMethod, response.error_value().framework_error().reason()); |
| } |
| |
| TEST_F(UnknownInteractions, TwoWayFlexibleFieldsErrSyncSendErrorVariant) { |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto response_fut = std::async([&client]() { return client->FlexibleTwoWayFieldsErr(); }); |
| |
| auto received = TwoWayServerRequest<16>::ReadFromChannel(server); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = |
| ExcludeTxid(MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod)); |
| EXPECT_THAT(received.buf_excluding_txid(), ::testing::ContainerEq(expected)); |
| EXPECT_NE(0u, received.txid()); |
| |
| auto server_reply = MakeMessage<test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kDomainError, 0x100); |
| received.reply(server, server_reply); |
| |
| auto response = response_fut.get(); |
| ASSERT_TRUE(response.is_error()); |
| ASSERT_TRUE(response.error_value().is_domain_error()); |
| EXPECT_EQ(0x100, response.error_value().domain_error()); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| //// Events - Sync Client |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST_F(UnknownInteractions, ReceiveStrictEventSync) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase { |
| void StrictEvent() override { received_event = true; } |
| |
| public: |
| bool received_event = false; |
| }; |
| EventHandler handler; |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<::test::UnknownInteractionsProtocol::StrictEvent>( |
| ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| EXPECT_TRUE(client.HandleOneEvent(handler).ok()); |
| |
| EXPECT_TRUE(handler.received_event); |
| } |
| |
| TEST_F(UnknownInteractions, ReceiveStrictEventSyncMismatchedStrictness) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase { |
| void StrictEvent() override { received_event = true; } |
| |
| public: |
| bool received_event = false; |
| }; |
| EventHandler handler; |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<::test::UnknownInteractionsProtocol::StrictEvent>( |
| ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| EXPECT_TRUE(client.HandleOneEvent(handler).ok()); |
| |
| EXPECT_TRUE(handler.received_event); |
| } |
| |
| TEST_F(UnknownInteractions, ReceiveFlexibleEventSync) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase { |
| void FlexibleEvent() override { received_event = true; } |
| |
| public: |
| bool received_event = false; |
| }; |
| EventHandler handler; |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleEvent>( |
| ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| EXPECT_TRUE(client.HandleOneEvent(handler).ok()); |
| |
| EXPECT_TRUE(handler.received_event); |
| } |
| |
| TEST_F(UnknownInteractions, ReceiveFlexibleEventSyncMismatchedStrictness) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase { |
| void FlexibleEvent() override { received_event = true; } |
| |
| public: |
| bool received_event = false; |
| }; |
| EventHandler handler; |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleEvent>( |
| ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| EXPECT_TRUE(client.HandleOneEvent(handler).ok()); |
| |
| EXPECT_TRUE(handler.received_event); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| //// Unknown messages - Sync Client |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST_F(UnknownInteractions, UnknownServerSentTwoWaySyncClient) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase {}; |
| EventHandler handler; |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = |
| MakeMessage<FakeUnknownMethod>(0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| auto status = client.HandleOneEvent(handler); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, status.status()); |
| EXPECT_EQ(fidl::Reason::kUnexpectedMessage, status.reason()); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownStrictEventSync) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase {}; |
| EventHandler handler; |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<FakeUnknownMethod>(::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| auto status = client.HandleOneEvent(handler); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, status.status()); |
| EXPECT_EQ(fidl::Reason::kUnexpectedMessage, status.reason()); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownFlexibleEventSync) { |
| class EventHandler : public UnknownInteractionsEventHandlerBase { |
| void handle_unknown_event( |
| ::fidl::UnknownEventMetadata<::test::UnknownInteractionsProtocol> metadata) override { |
| received_event = true; |
| ASSERT_EQ(FakeUnknownMethod::kOrdinal, metadata.event_ordinal); |
| } |
| |
| public: |
| bool received_event = false; |
| }; |
| EventHandler handler; |
| auto client = SyncClient(); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = |
| MakeMessage<FakeUnknownMethod>(::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| EXPECT_TRUE(client.HandleOneEvent(handler).ok()); |
| |
| ASSERT_TRUE(handler.received_event); |
| |
| // Write again to check that the channel is still open. |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownStrictEventSyncAjarProtocol) { |
| class EventHandler : public ::fidl::SyncEventHandler<::test::UnknownInteractionsAjarProtocol> { |
| void handle_unknown_event( |
| ::fidl::UnknownEventMetadata<::test::UnknownInteractionsAjarProtocol> metadata) override { |
| ADD_FAILURE() << "Unexpected flexible unknown event"; |
| } |
| }; |
| |
| EventHandler handler; |
| auto client = fidl::SyncClient<::test::UnknownInteractionsAjarProtocol>( |
| ::fidl::ClientEnd<::test::UnknownInteractionsAjarProtocol>(TakeClientChannel())); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<FakeUnknownMethod>(::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| auto status = client.HandleOneEvent(handler); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, status.status()); |
| EXPECT_EQ(fidl::Reason::kUnexpectedMessage, status.reason()); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownFlexibleEventSyncAjarProtocol) { |
| class EventHandler : public ::fidl::SyncEventHandler<::test::UnknownInteractionsAjarProtocol> { |
| void handle_unknown_event( |
| ::fidl::UnknownEventMetadata<::test::UnknownInteractionsAjarProtocol> metadata) override { |
| received_event = true; |
| ASSERT_EQ(FakeUnknownMethod::kOrdinal, metadata.event_ordinal); |
| } |
| |
| public: |
| bool received_event = false; |
| }; |
| EventHandler handler; |
| auto client = fidl::SyncClient<::test::UnknownInteractionsAjarProtocol>( |
| ::fidl::ClientEnd<::test::UnknownInteractionsAjarProtocol>(TakeClientChannel())); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = |
| MakeMessage<FakeUnknownMethod>(::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| EXPECT_TRUE(client.HandleOneEvent(handler).ok()); |
| |
| ASSERT_TRUE(handler.received_event); |
| |
| // Write again to check that the channel is still open. |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownStrictEventSyncClosedProtocol) { |
| class EventHandler : public ::fidl::SyncEventHandler<::test::UnknownInteractionsClosedProtocol> { |
| }; |
| EventHandler handler; |
| auto client = fidl::SyncClient<::test::UnknownInteractionsClosedProtocol>( |
| ::fidl::ClientEnd<::test::UnknownInteractionsClosedProtocol>(TakeClientChannel())); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = MakeMessage<FakeUnknownMethod>(::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| auto status = client.HandleOneEvent(handler); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, status.status()); |
| EXPECT_EQ(fidl::Reason::kUnexpectedMessage, status.reason()); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownFlexibleEventSyncClosedProtocol) { |
| class EventHandler : public ::fidl::SyncEventHandler<::test::UnknownInteractionsClosedProtocol> { |
| }; |
| EventHandler handler; |
| auto client = fidl::SyncClient<::test::UnknownInteractionsClosedProtocol>( |
| ::fidl::ClientEnd<::test::UnknownInteractionsClosedProtocol>(TakeClientChannel())); |
| auto server = TakeServerChannel(); |
| |
| auto server_message = |
| MakeMessage<FakeUnknownMethod>(::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, server.write(0, &server_message, server_message.size(), nullptr, 0)); |
| |
| auto status = client.HandleOneEvent(handler); |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, status.status()); |
| EXPECT_EQ(fidl::Reason::kUnexpectedMessage, status.reason()); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| /////////////////////////////////////////////////////////////////////////////// |
| //// Server Side Tests |
| /////////////////////////////////////////////////////////////////////////////// |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| //// Events - Server |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST_F(UnknownInteractions, SendStrictEvent) { |
| auto client = TakeClientChannel(); |
| auto server = TakeServerEnd(); |
| |
| EXPECT_TRUE(fidl::SendEvent(server)->StrictEvent().is_ok()); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| |
| auto expected = MakeMessage<test::UnknownInteractionsProtocol::StrictEvent>( |
| fidl::MessageDynamicFlags::kStrictMethod); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, SendFlexibleEvent) { |
| auto client = TakeClientChannel(); |
| auto server = TakeServerEnd(); |
| |
| EXPECT_TRUE(fidl::SendEvent(server)->FlexibleEvent().is_ok()); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| |
| auto expected = MakeMessage<test::UnknownInteractionsProtocol::FlexibleEvent>( |
| fidl::MessageDynamicFlags::kFlexibleMethod); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| //// Two-Way Methods - Server |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST_F(UnknownInteractions, StrictTwoWayResponse) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase { |
| void StrictTwoWay(StrictTwoWayCompleter::Sync& completer) override { completer.Reply(); } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = MakeMessage<::test::UnknownInteractionsProtocol::StrictTwoWay>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = MakeMessage<::test::UnknownInteractionsProtocol::StrictTwoWay>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kStrictMethod); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, StrictTwoWayResponseMismatchedStrictness) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase { |
| void StrictTwoWay(StrictTwoWayCompleter::Sync& completer) override { completer.Reply(); } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| // Server is not supposed to validate the flexible flag for known methods. |
| auto client_request = MakeMessage<::test::UnknownInteractionsProtocol::StrictTwoWay>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = MakeMessage<::test::UnknownInteractionsProtocol::StrictTwoWay>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kStrictMethod); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, StrictTwoWayErrResponse) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase { |
| void StrictTwoWayErr(StrictTwoWayErrCompleter::Sync& completer) override { |
| completer.Reply(fit::ok()); |
| } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = MakeMessage<::test::UnknownInteractionsProtocol::StrictTwoWayErr>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<32>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = MakeMessage<::test::UnknownInteractionsProtocol::StrictTwoWayErr>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kStrictMethod, ResultUnionTag::kSuccess, 0); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, FlexibleTwoWayResponse) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase { |
| void FlexibleTwoWay(FlexibleTwoWayCompleter::Sync& completer) override { completer.Reply(); } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<32>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 0); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, FlexibleTwoWayResponseMismatchedStrictness) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase { |
| void FlexibleTwoWay(FlexibleTwoWayCompleter::Sync& completer) override { completer.Reply(); } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| // Server is not supposed to validate the flexible flag for known methods. |
| auto client_request = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<32>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWay>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 0); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, FlexibleTwoWayFieldsResponse) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase { |
| void FlexibleTwoWayFields(FlexibleTwoWayFieldsCompleter::Sync& completer) override { |
| completer.Reply({{.some_field = 42}}); |
| } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWayFields>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<32>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWayFields>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 42); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, FlexibleTwoWayErrResponse) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase { |
| void FlexibleTwoWayErr(FlexibleTwoWayErrCompleter::Sync& completer) override { |
| completer.Reply(fit::ok()); |
| } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<32>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 0); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, FlexibleTwoWayErrResponseError) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase { |
| void FlexibleTwoWayErr(FlexibleTwoWayErrCompleter::Sync& completer) override { |
| completer.Reply(fit::error(3203)); |
| } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<32>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWayErr>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kDomainError, 3203); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, FlexibleTwoWayFieldsErrResponse) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase { |
| void FlexibleTwoWayFieldsErr(FlexibleTwoWayFieldsErrCompleter::Sync& completer) override { |
| completer.Reply(::fit::ok( |
| ::test::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse({.some_field = 42}))); |
| } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<32>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kSuccess, 42); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, FlexibleTwoWayFieldsErrResponseError) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase { |
| void FlexibleTwoWayFieldsErr(FlexibleTwoWayFieldsErrCompleter::Sync& completer) override { |
| completer.Reply(fit::error(3203)); |
| } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<32>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = MakeMessage<::test::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>( |
| 0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod, ResultUnionTag::kDomainError, 3203); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| //// Unknown messages - Server |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST_F(UnknownInteractions, UnknownStrictOneWay) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase {}; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = |
| MakeMessage<FakeUnknownMethod>(0, ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownFlexibleOneWay) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase { |
| public: |
| bool ran_unknown_interaction_handler = false; |
| |
| void handle_unknown_method( |
| ::fidl::UnknownMethodMetadata<::test::UnknownInteractionsProtocol> metadata, |
| ::fidl::UnknownMethodCompleter::Sync& completer) override { |
| ran_unknown_interaction_handler = true; |
| EXPECT_EQ(FakeUnknownMethod::kOrdinal, metadata.method_ordinal); |
| EXPECT_EQ(::fidl::UnknownMethodType::kOneWay, metadata.unknown_method_type); |
| } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = |
| MakeMessage<FakeUnknownMethod>(0, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| EXPECT_TRUE(server.ran_unknown_interaction_handler); |
| |
| EXPECT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownStrictTwoWay) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase {}; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = |
| MakeMessage<FakeUnknownMethod>(0xABCD, ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownFlexibleTwoWay) { |
| auto client = TakeClientChannel(); |
| class Server : public UnknownInteractionsServerBase { |
| public: |
| bool ran_unknown_interaction_handler = false; |
| |
| void handle_unknown_method( |
| ::fidl::UnknownMethodMetadata<::test::UnknownInteractionsProtocol> metadata, |
| ::fidl::UnknownMethodCompleter::Sync& completer) override { |
| ran_unknown_interaction_handler = true; |
| EXPECT_EQ(FakeUnknownMethod::kOrdinal, metadata.method_ordinal); |
| EXPECT_EQ(::fidl::UnknownMethodType::kTwoWay, metadata.unknown_method_type); |
| } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = |
| MakeMessage<FakeUnknownMethod>(0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| EXPECT_TRUE(server.ran_unknown_interaction_handler); |
| |
| auto received = ReadResult<32>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_OK, received.status); |
| auto expected = |
| MakeMessage<FakeUnknownMethod>(0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod, |
| ResultUnionTag::kFrameworkError, ZX_ERR_NOT_SUPPORTED); |
| EXPECT_THAT(received.buf, ::testing::ContainerEq(expected)); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownStrictOneWayAjarProtocol) { |
| auto client = TakeClientChannel(); |
| class Server : public ::fidl::Server<::test::UnknownInteractionsAjarProtocol> { |
| void handle_unknown_method( |
| ::fidl::UnknownMethodMetadata<::test::UnknownInteractionsAjarProtocol> metadata, |
| ::fidl::UnknownMethodCompleter::Sync& completer) override { |
| ADD_FAILURE() << "Unexpected flexible unknown interaction"; |
| } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = |
| MakeMessage<FakeUnknownMethod>(0, ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownFlexibleOneWayAjarProtocol) { |
| auto client = TakeClientChannel(); |
| class Server : public ::fidl::Server<::test::UnknownInteractionsAjarProtocol> { |
| public: |
| bool ran_unknown_interaction_handler = false; |
| |
| void handle_unknown_method( |
| ::fidl::UnknownMethodMetadata<::test::UnknownInteractionsAjarProtocol> metadata, |
| ::fidl::UnknownMethodCompleter::Sync& completer) override { |
| ran_unknown_interaction_handler = true; |
| EXPECT_EQ(FakeUnknownMethod::kOrdinal, metadata.method_ordinal); |
| } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = |
| MakeMessage<FakeUnknownMethod>(0, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| EXPECT_TRUE(server.ran_unknown_interaction_handler); |
| |
| EXPECT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownStrictTwoWayAjarProtocol) { |
| auto client = TakeClientChannel(); |
| class Server : public ::fidl::Server<::test::UnknownInteractionsAjarProtocol> { |
| void handle_unknown_method( |
| ::fidl::UnknownMethodMetadata<::test::UnknownInteractionsAjarProtocol> metadata, |
| ::fidl::UnknownMethodCompleter::Sync& completer) override { |
| ADD_FAILURE() << "Unexpected flexible unknown interaction"; |
| } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = |
| MakeMessage<FakeUnknownMethod>(0xABCD, ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownFlexibleTwoWayAjarProtocol) { |
| auto client = TakeClientChannel(); |
| class Server : public ::fidl::Server<::test::UnknownInteractionsAjarProtocol> { |
| void handle_unknown_method( |
| ::fidl::UnknownMethodMetadata<::test::UnknownInteractionsAjarProtocol> metadata, |
| ::fidl::UnknownMethodCompleter::Sync& completer) override { |
| ADD_FAILURE() << "Unexpected flexible unknown interaction"; |
| } |
| }; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = |
| MakeMessage<FakeUnknownMethod>(0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownStrictOneWayClosedProtocol) { |
| auto client = TakeClientChannel(); |
| class Server : public ::fidl::Server<::test::UnknownInteractionsClosedProtocol> {}; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = |
| MakeMessage<FakeUnknownMethod>(0, ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownFlexibleOneWayClosedProtocol) { |
| auto client = TakeClientChannel(); |
| class Server : public ::fidl::Server<::test::UnknownInteractionsClosedProtocol> {}; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = |
| MakeMessage<FakeUnknownMethod>(0, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownStrictTwoWayClosedProtocol) { |
| auto client = TakeClientChannel(); |
| class Server : public ::fidl::Server<::test::UnknownInteractionsClosedProtocol> {}; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = |
| MakeMessage<FakeUnknownMethod>(0xABCD, ::fidl::MessageDynamicFlags::kStrictMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| |
| TEST_F(UnknownInteractions, UnknownFlexibleTwoWayClosedProtocol) { |
| auto client = TakeClientChannel(); |
| class Server : public ::fidl::Server<::test::UnknownInteractionsClosedProtocol> {}; |
| Server server; |
| auto server_binding = BindServer(&server); |
| |
| auto client_request = |
| MakeMessage<FakeUnknownMethod>(0xABCD, ::fidl::MessageDynamicFlags::kFlexibleMethod); |
| ASSERT_EQ(ZX_OK, client.write(0, &client_request, client_request.size(), nullptr, 0)); |
| |
| loop().RunUntilIdle(); |
| |
| auto received = ReadResult<16>::ReadFromChannel(client); |
| EXPECT_EQ(ZX_ERR_PEER_CLOSED, received.status); |
| } |
| } // namespace |