From 7be47efac07b6276f02a17cb486f9061a426a837 Mon Sep 17 00:00:00 2001 From: Narumol Prangnawarat Date: Fri, 27 Sep 2019 18:00:11 +0100 Subject: IVGCVSW-3903 Create Counter Stream Buffer * Add implementation of PacketBuffer * Add implementation of BufferManager * Unit tests Signed-off-by: Narumol Prangnawarat Change-Id: Icca3807149ff5a8ed31cc87de73c50b95bca39d4 --- src/profiling/test/BufferTests.cpp | 279 ++++++++++++++++++++++++++ src/profiling/test/SendCounterPacketTests.hpp | 4 +- 2 files changed, 281 insertions(+), 2 deletions(-) create mode 100644 src/profiling/test/BufferTests.cpp (limited to 'src/profiling/test') diff --git a/src/profiling/test/BufferTests.cpp b/src/profiling/test/BufferTests.cpp new file mode 100644 index 0000000000..b678350bb3 --- /dev/null +++ b/src/profiling/test/BufferTests.cpp @@ -0,0 +1,279 @@ +// +// Copyright © 2019 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "BufferManager.hpp" +#include "PacketBuffer.hpp" +#include "ProfilingUtils.hpp" + +#include + +#include + +using namespace armnn::profiling; + +BOOST_AUTO_TEST_SUITE(BufferTests) + +BOOST_AUTO_TEST_CASE(PacketBufferTest0) +{ + std::unique_ptr packetBuffer = std::make_unique(512); + + BOOST_TEST(packetBuffer->GetSize() == 0); + + // Write data to the buffer + WriteUint32(packetBuffer, 0, 10); + WriteUint32(packetBuffer, 4, 20); + WriteUint32(packetBuffer, 8, 30); + WriteUint32(packetBuffer, 12, 40); + + // Commit + packetBuffer->Commit(16); + + // Size of buffer is equal to committed data + BOOST_TEST(packetBuffer->GetSize() == 16); + + // Read data from the buffer + auto readBuffer = packetBuffer->GetReadableData(); + uint32_t readData0 = ReadUint32(readBuffer, 0); + uint32_t readData1 = ReadUint32(readBuffer, 4); + uint32_t readData2 = ReadUint32(readBuffer, 8); + uint32_t readData3 = ReadUint32(readBuffer, 12); + + // Check that data is correct + BOOST_TEST(readData0 == 10); + BOOST_TEST(readData1 == 20); + BOOST_TEST(readData2 == 30); + BOOST_TEST(readData3 == 40); + + // Mark read + packetBuffer->MarkRead(); + + // Size of buffer become 0 after marked read + BOOST_TEST(packetBuffer->GetSize() == 0); +} + +BOOST_AUTO_TEST_CASE(PacketBufferTest1) +{ + std::unique_ptr packetBuffer = std::make_unique(512); + + BOOST_TEST(packetBuffer->GetSize() == 0); + + // Write data to the buffer using GetWritableData + auto writeBuffer = packetBuffer->GetWritableData(); + WriteUint32(writeBuffer, 0, 10); + WriteUint32(writeBuffer, 4, 20); + WriteUint32(writeBuffer, 8, 30); + WriteUint32(writeBuffer, 12, 40); + + packetBuffer->Commit(16); + + BOOST_TEST(packetBuffer->GetSize() == 16); + + // Read data from the buffer + auto readBuffer = packetBuffer->GetReadableData(); + uint32_t readData0 = ReadUint32(readBuffer, 0); + uint32_t readData1 = ReadUint32(readBuffer, 4); + uint32_t readData2 = ReadUint32(readBuffer, 8); + uint32_t readData3 = ReadUint32(readBuffer, 12); + + BOOST_TEST(readData0 == 10); + BOOST_TEST(readData1 == 20); + BOOST_TEST(readData2 == 30); + BOOST_TEST(readData3 == 40); + + packetBuffer->MarkRead(); + + BOOST_TEST(packetBuffer->GetSize() == 0); +} + +BOOST_AUTO_TEST_CASE(PacketBufferReleaseTest) { + std::unique_ptr packetBuffer = std::make_unique(512); + + BOOST_TEST(packetBuffer->GetSize() == 0); + + auto writeBuffer = packetBuffer->GetWritableData(); + + WriteUint32(writeBuffer, 0, 10); + WriteUint32(writeBuffer, 4, 20); + WriteUint32(writeBuffer, 8, 30); + WriteUint32(writeBuffer, 12, 40); + + packetBuffer->Release(); + + // Size of buffer become 0 after release + BOOST_TEST(packetBuffer->GetSize() == 0); +} + +BOOST_AUTO_TEST_CASE(PacketBufferCommitErrorTest) +{ + std::unique_ptr packetBuffer = std::make_unique(8); + + // Cannot commit data bigger than the max size of the buffer + BOOST_CHECK_THROW(packetBuffer->Commit(16);, armnn::RuntimeException); +} + +BOOST_AUTO_TEST_CASE(BufferReserveTest) +{ + BufferManager bufferManager(1, 512); + unsigned int reservedSize = 0; + auto packetBuffer = bufferManager.Reserve(512, reservedSize); + + // Successfully reserved the buffer with requested size + BOOST_TEST(reservedSize == 512); + BOOST_TEST(packetBuffer.get()); +} + +BOOST_AUTO_TEST_CASE(BufferReserveExceedingSpaceTest) +{ + BufferManager bufferManager(1, 512); + unsigned int reservedSize = 0; + + // Cannot reserve buffer bigger than maximum buffer size + BOOST_CHECK_THROW(bufferManager.Reserve(1024, reservedSize), armnn::RuntimeException); +} + +BOOST_AUTO_TEST_CASE(BufferExhaustionTest) +{ + BufferManager bufferManager(1, 512); + unsigned int reservedSize = 0; + auto packetBuffer = bufferManager.Reserve(512, reservedSize); + + // Successfully reserved the buffer with requested size + BOOST_TEST(reservedSize == 512); + BOOST_TEST(packetBuffer.get()); + + // Cannot reserve buffer when buffer is not available + BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize), BufferExhaustion); +} + +BOOST_AUTO_TEST_CASE(BufferReserveMultipleTest) +{ + BufferManager bufferManager(3, 512); + unsigned int reservedSize0 = 0; + auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0); + + // Successfully reserved the buffer with requested size + BOOST_TEST(reservedSize0 == 512); + BOOST_TEST(packetBuffer0.get()); + + unsigned int reservedSize1 = 0; + auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1); + + // Successfully reserved the buffer with requested size + BOOST_TEST(reservedSize1 == 128); + BOOST_TEST(packetBuffer1.get()); + + unsigned int reservedSize2 = 0; + auto packetBuffer2 = bufferManager.Reserve(512, reservedSize2); + + // Successfully reserved the buffer with requested size + BOOST_TEST(reservedSize2 == 512); + BOOST_TEST(packetBuffer2.get()); + + // Cannot reserve when buffer is not available + unsigned int reservedSize3 = 0; + BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize3), BufferExhaustion); +} + +BOOST_AUTO_TEST_CASE(BufferReleaseTest) +{ + BufferManager bufferManager(2, 512); + unsigned int reservedSize0 = 0; + auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0); + + // Successfully reserved the buffer with requested size + BOOST_TEST(reservedSize0 == 512); + BOOST_TEST(packetBuffer0.get()); + + unsigned int reservedSize1 = 0; + auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1); + + // Successfully reserved the buffer with requested size + BOOST_TEST(reservedSize1 == 128); + BOOST_TEST(packetBuffer1.get()); + + // Cannot reserve when buffer is not available + unsigned int reservedSize2 = 0; + BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion); + + bufferManager.Release(packetBuffer0); + + // Buffer should become available after release + auto packetBuffer2 = bufferManager.Reserve(128, reservedSize2); + + BOOST_TEST(reservedSize2 == 128); + BOOST_TEST(packetBuffer2.get()); +} + +BOOST_AUTO_TEST_CASE(BufferCommitTest) +{ + BufferManager bufferManager(2, 512); + unsigned int reservedSize0 = 0; + auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0); + + BOOST_TEST(reservedSize0 == 512); + BOOST_TEST(packetBuffer0.get()); + + unsigned int reservedSize1 = 0; + auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1); + + BOOST_TEST(reservedSize1 == 128); + BOOST_TEST(packetBuffer1.get()); + + unsigned int reservedSize2 = 0; + BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion); + + bufferManager.Commit(packetBuffer0, 256); + + // Buffer should become readable after commit + auto packetBuffer2 = bufferManager.GetReadableBuffer(); + BOOST_TEST(packetBuffer2.get()); + BOOST_TEST(packetBuffer2->GetSize() == 256); + + // Buffer not set back to available list after commit + BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion); +} + +BOOST_AUTO_TEST_CASE(BufferMarkReadTest) +{ + BufferManager bufferManager(2, 512); + unsigned int reservedSize0 = 0; + auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0); + + BOOST_TEST(reservedSize0 == 512); + BOOST_TEST(packetBuffer0.get()); + + unsigned int reservedSize1 = 0; + auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1); + + BOOST_TEST(reservedSize1 == 128); + BOOST_TEST(packetBuffer1.get()); + + // Cannot reserve when buffer is not available + unsigned int reservedSize2 = 0; + BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion); + + bufferManager.Commit(packetBuffer0, 256); + + // Buffer should become readable after commit + auto packetBuffer2 = bufferManager.GetReadableBuffer(); + BOOST_TEST(packetBuffer2.get()); + BOOST_TEST(packetBuffer2->GetSize() == 256); + + // Buffer not set back to available list after commit + BOOST_CHECK_THROW(bufferManager.Reserve(512, reservedSize2), BufferExhaustion); + + bufferManager.MarkRead(packetBuffer2); + + //Buffer should set back to available list after marked read and can be reserved + auto readBuffer = bufferManager.GetReadableBuffer(); + BOOST_TEST(!readBuffer); + unsigned int reservedSize3 = 0; + auto packetBuffer3 = bufferManager.Reserve(56, reservedSize3); + + BOOST_TEST(reservedSize3 == 56); + BOOST_TEST(packetBuffer3.get()); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/profiling/test/SendCounterPacketTests.hpp b/src/profiling/test/SendCounterPacketTests.hpp index c3d47157d0..243731cb2c 100644 --- a/src/profiling/test/SendCounterPacketTests.hpp +++ b/src/profiling/test/SendCounterPacketTests.hpp @@ -147,10 +147,10 @@ public: { std::unique_lock availableListLock(m_AvailableMutex, std::defer_lock); if (requestedSize > m_MaxBufferSize) - { + { throw armnn::Exception("Maximum buffer size that can be requested is [" + std::to_string(m_MaxBufferSize) + "] bytes"); - } + } availableListLock.lock(); if (m_AvailableList.empty()) { -- cgit v1.2.1