blob: 2ccee5713f5559badc7a0aa7495b7c777847f3ad [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 "src/virtualization/bin/vmm/virtio_queue_waiter.h"
#include <lib/gtest/test_loop_fixture.h>
#include "src/virtualization/bin/vmm/virtio_device_fake.h"
namespace {
using VirtioQueueWaiterTest = ::gtest::TestLoopFixture;
TEST_F(VirtioQueueWaiterTest, Wait) {
bool wait_complete = false;
VirtioDeviceFake device;
VirtioQueueWaiter waiter(dispatcher(), device.queue(), [&](zx_status_t status, uint32_t events) {
EXPECT_EQ(ZX_OK, status);
wait_complete = true;
});
EXPECT_EQ(ZX_OK, waiter.Begin());
RunLoopUntilIdle();
EXPECT_FALSE(wait_complete);
// Signal without a descriptor should not invoke the wait callback.
device.queue()->Notify();
RunLoopUntilIdle();
EXPECT_FALSE(wait_complete);
// Add a descriptor and signal again. This should invoke the waiter.
uint8_t buf[8];
ASSERT_EQ(device.queue_fake()->BuildDescriptor().AppendReadable(buf, sizeof(buf)).Build(), ZX_OK);
device.queue()->Notify();
RunLoopUntilIdle();
EXPECT_TRUE(wait_complete);
}
} // namespace