| // 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 <gtest/gtest.h> | |
| #include "src/virtualization/bin/vmm/phys_mem_fake.h" | |
| #include "src/virtualization/bin/vmm/virtio_device.h" | |
| #include "src/virtualization/bin/vmm/virtio_device_fake.h" | |
| #include "src/virtualization/bin/vmm/virtio_queue_fake.h" | |
| namespace { | |
| TEST(VirtioQueueTest, HandleOverflow) { | |
| VirtioDeviceFake device; | |
| VirtioQueue* queue = device.queue(); | |
| VirtioQueueFake* queue_fake = device.queue_fake(); | |
| // Setup queue pointers so that the next descriptor will wrap avail->idx | |
| // to 0. | |
| VirtioRing* ring = queue_fake->ring(); | |
| const_cast<uint16_t&>(ring->avail->idx) = UINT16_MAX; | |
| ring->index = UINT16_MAX; | |
| uint16_t expected_desc; | |
| uint32_t data = 0x12345678; | |
| ASSERT_EQ(queue_fake->BuildDescriptor().AppendReadable(&data, sizeof(data)).Build(&expected_desc), | |
| ZX_OK); | |
| uint16_t desc; | |
| ASSERT_EQ(queue->NextAvail(&desc), ZX_OK); | |
| ASSERT_EQ(desc, expected_desc); | |
| ASSERT_EQ(queue_fake->ring()->avail->idx, 0); | |
| ASSERT_EQ(queue_fake->ring()->index, 0); | |
| } | |
| } // namespace |