| // Copyright 2017 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 <async/receiver.h> |
| |
| #include <unittest/unittest.h> |
| |
| #include "async_stub.h" |
| |
| namespace { |
| |
| class MockAsync : public AsyncStub { |
| public: |
| enum class Op { |
| NONE, |
| QUEUE_PACKET |
| }; |
| |
| Op last_op = Op::NONE; |
| async_receiver_t* last_receiver = nullptr; |
| const zx_packet_user_t* last_data = nullptr; |
| |
| zx_status_t QueuePacket(async_receiver_t* receiver, |
| const zx_packet_user_t* data) override { |
| last_op = Op::QUEUE_PACKET; |
| last_receiver = receiver; |
| last_data = data; |
| return ZX_OK; |
| } |
| }; |
| |
| struct Handler { |
| Handler(async::Receiver* receiver) { |
| receiver->set_handler([this](async_t* async, zx_status_t status, |
| const zx_packet_user_t* data) { |
| handler_ran = true; |
| last_status = status; |
| last_data = data; |
| }); |
| } |
| |
| bool handler_ran = false; |
| zx_status_t last_status = ZX_ERR_INTERNAL; |
| const zx_packet_user_t* last_data = nullptr; |
| }; |
| |
| bool wrapper_test() { |
| const uint32_t dummy_flags = ASYNC_FLAG_HANDLE_SHUTDOWN; |
| const zx_packet_user_t dummy_data{}; |
| |
| BEGIN_TEST; |
| |
| { |
| async::Receiver default_receiver; |
| EXPECT_EQ(0u, default_receiver.flags(), "default flags"); |
| |
| default_receiver.set_flags(dummy_flags); |
| EXPECT_EQ(dummy_flags, default_receiver.flags(), "set flags"); |
| |
| EXPECT_FALSE(!!default_receiver.handler(), "handler"); |
| } |
| |
| { |
| async::Receiver explicit_receiver(dummy_flags); |
| EXPECT_EQ(dummy_flags, explicit_receiver.flags(), "explicit flags"); |
| |
| EXPECT_FALSE(!!explicit_receiver.handler(), "handler"); |
| Handler handler(&explicit_receiver); |
| EXPECT_TRUE(!!explicit_receiver.handler()); |
| |
| MockAsync async; |
| |
| EXPECT_EQ(ZX_OK, explicit_receiver.Queue(&async, nullptr), "queue, null data"); |
| EXPECT_EQ(MockAsync::Op::QUEUE_PACKET, async.last_op, "op"); |
| EXPECT_EQ(dummy_flags, async.last_receiver->flags, "flags"); |
| EXPECT_NULL(async.last_data, "data"); |
| |
| EXPECT_EQ(ZX_OK, explicit_receiver.Queue(&async, &dummy_data), "queue, non-null data"); |
| EXPECT_EQ(MockAsync::Op::QUEUE_PACKET, async.last_op, "op"); |
| EXPECT_EQ(dummy_flags, async.last_receiver->flags, "flags"); |
| EXPECT_EQ(&dummy_data, async.last_data, "data"); |
| |
| async.last_receiver->handler(&async, async.last_receiver, ZX_OK, nullptr); |
| EXPECT_TRUE(handler.handler_ran, "handler ran"); |
| EXPECT_EQ(ZX_OK, handler.last_status, "status"); |
| EXPECT_NULL(handler.last_data, "data"); |
| |
| async.last_receiver->handler(&async, async.last_receiver, ZX_OK, &dummy_data); |
| EXPECT_TRUE(handler.handler_ran, "handler ran"); |
| EXPECT_EQ(ZX_OK, handler.last_status, "status"); |
| EXPECT_EQ(&dummy_data, handler.last_data, "data"); |
| } |
| |
| END_TEST; |
| } |
| |
| bool unsupported_queue_packet_test() { |
| BEGIN_TEST; |
| |
| AsyncStub async; |
| async_receiver_t receiver{}; |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, async_queue_packet(&async, &receiver, nullptr), "valid args without data"); |
| zx_packet_user_t data; |
| EXPECT_EQ(ZX_ERR_NOT_SUPPORTED, async_queue_packet(&async, &receiver, &data), "valid args with data"); |
| |
| END_TEST; |
| } |
| |
| } // namespace |
| |
| BEGIN_TEST_CASE(receiver_tests) |
| RUN_TEST(wrapper_test) |
| RUN_TEST(unsupported_queue_packet_test) |
| END_TEST_CASE(receiver_tests) |