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