blob: 5d06f4f3a7a719f26c9d7b6dcc5d7aa8c39b5b48 [file] [log] [blame]
// Copyright 2016 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 "mock/mock_address_space.h"
#include "mock/mock_bus_mapper.h"
#include "ringbuffer.h"
#include "gtest/gtest.h"
class TestRingbuffer {
public:
class AddressSpaceOwner : public AddressSpace::Owner {
public:
virtual ~AddressSpaceOwner() = default;
magma::PlatformBusMapper* GetBusMapper() override { return &bus_mapper_; }
private:
MockBusMapper bus_mapper_;
};
void CreateAndDestroy()
{
uint32_t size = PAGE_SIZE;
std::unique_ptr<Ringbuffer> ringbuffer(
new Ringbuffer(MsdIntelBuffer::Create(size, "test")));
ASSERT_NE(ringbuffer, nullptr);
EXPECT_EQ(ringbuffer->size(), size);
}
void Write()
{
uint32_t size = PAGE_SIZE;
std::unique_ptr<Ringbuffer> ringbuffer(
new Ringbuffer(MsdIntelBuffer::Create(size, "test")));
ASSERT_NE(ringbuffer, nullptr);
EXPECT_EQ(ringbuffer->size(), size);
// Can't store full size because head==tail means empty
EXPECT_FALSE(ringbuffer->HasSpace(size));
EXPECT_TRUE(ringbuffer->HasSpace(size - 4));
auto owner = std::make_unique<AddressSpaceOwner>();
auto address_space = std::make_shared<MockAddressSpace>(owner.get(), 0x10000, size);
EXPECT_TRUE(ringbuffer->Map(address_space));
uint32_t* vaddr = ringbuffer->vaddr();
ASSERT_NE(vaddr, nullptr);
uint32_t start_index = ringbuffer->tail() / 4;
uint32_t size_dwords = size / 4;
// Stuff the ringbuffer - fill to one less
for (unsigned int i = 0; i < size_dwords - 1; i++) {
EXPECT_TRUE(ringbuffer->HasSpace(4));
ringbuffer->write_tail(i);
EXPECT_EQ(vaddr[(start_index + i) % size_dwords], i);
}
ringbuffer->update_head(ringbuffer->tail());
// Do it again
for (unsigned int i = 0; i < size_dwords - 1; i++) {
EXPECT_TRUE(ringbuffer->HasSpace(4));
ringbuffer->write_tail(i);
EXPECT_EQ(vaddr[(start_index + i) % size_dwords], i);
}
EXPECT_TRUE(ringbuffer->Unmap());
}
};
TEST(Ringbuffer, CreateAndDestroy)
{
TestRingbuffer test;
test.CreateAndDestroy();
}
TEST(Ringbuffer, Write)
{
TestRingbuffer test;
test.Write();
}