blob: c46be63e5bc97c11b4bcebf4960c050aded9b491 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <lib/async/cpp/trap.h>
#include <unittest/unittest.h>
#include "async_stub.h"
namespace {
class MockAsync : public AsyncStub {
public:
async_guest_bell_trap_t* last_trap = nullptr;
zx_status_t SetGuestBellTrap(async_guest_bell_trap_t* trap) override {
last_trap = trap;
return ZX_OK;
}
};
class Handler {
public:
void HandleGuestBellTrap(async_t* async, const zx_packet_guest_bell_t* bell) {
handler_ran = true;
last_bell = bell;
}
bool handler_ran = false;
const zx_packet_guest_bell_t* last_bell = nullptr;
};
bool guest_bell_trap_test() {
const zx_handle_t dummy_handle = static_cast<zx_handle_t>(1);
const zx_vaddr_t dummy_addr = 0x1000;
const size_t dummy_length = 0x1000;
const zx_packet_guest_bell_t dummy_bell{
.addr = dummy_addr,
.reserved0 = 0u,
.reserved1 = 0u,
.reserved2 = 0u,
};
BEGIN_TEST;
Handler handler;
{
async::GuestBellTrapMethod<Handler, &Handler::HandleGuestBellTrap> default_trap(&handler);
EXPECT_EQ(ZX_HANDLE_INVALID, default_trap.guest());
EXPECT_EQ(0u, default_trap.addr());
EXPECT_EQ(0u, default_trap.length());
default_trap.set_guest(dummy_handle);
EXPECT_EQ(dummy_handle, default_trap.guest());
default_trap.set_addr(dummy_addr);
EXPECT_EQ(dummy_addr, default_trap.addr());
default_trap.set_length(dummy_length);
EXPECT_EQ(dummy_length, default_trap.length());
}
{
async::GuestBellTrapMethod<Handler, &Handler::HandleGuestBellTrap> explicit_trap(
&handler, dummy_handle, dummy_addr, dummy_length);
EXPECT_EQ(dummy_handle, explicit_trap.guest());
EXPECT_EQ(dummy_addr, explicit_trap.addr());
EXPECT_EQ(dummy_length, explicit_trap.length());
MockAsync async;
EXPECT_EQ(ZX_OK, explicit_trap.Begin(&async));
EXPECT_EQ(dummy_handle, async.last_trap->guest);
EXPECT_EQ(dummy_addr, async.last_trap->addr);
EXPECT_EQ(dummy_length, async.last_trap->length);
async.last_trap->handler(&async, async.last_trap, &dummy_bell);
EXPECT_TRUE(handler.handler_ran);
EXPECT_EQ(&dummy_bell, handler.last_bell);
}
END_TEST;
}
} // namespace
BEGIN_TEST_CASE(trap_tests)
RUN_TEST(guest_bell_trap_test)
END_TEST_CASE(trap_tests)