diff --git a/src/profiling/test/BufferTests.cpp b/src/profiling/test/BufferTests.cpp
index 7a92ee1..e3abe86 100644
--- a/src/profiling/test/BufferTests.cpp
+++ b/src/profiling/test/BufferTests.cpp
@@ -11,17 +11,17 @@
 
 #include <armnn/Exceptions.hpp>
 
-#include <boost/test/unit_test.hpp>
+#include <doctest/doctest.h>
 
 using namespace armnn::profiling;
 
-BOOST_AUTO_TEST_SUITE(BufferTests)
-
-BOOST_AUTO_TEST_CASE(PacketBufferTest0)
+TEST_SUITE("BufferTests")
+{
+TEST_CASE("PacketBufferTest0")
 {
     IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
 
-    BOOST_TEST(packetBuffer->GetSize() == 0);
+    CHECK(packetBuffer->GetSize() == 0);
 
     // Write data to the buffer
     WriteUint32(packetBuffer, 0, 10);
@@ -33,7 +33,7 @@
     packetBuffer->Commit(16);
 
     // Size of buffer is equal to committed data
-    BOOST_TEST(packetBuffer->GetSize() == 16);
+    CHECK(packetBuffer->GetSize() == 16);
 
     // Read data from the buffer
     auto readBuffer = packetBuffer->GetReadableData();
@@ -43,23 +43,23 @@
     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);
+    CHECK(readData0 == 10);
+    CHECK(readData1 == 20);
+    CHECK(readData2 == 30);
+    CHECK(readData3 == 40);
 
     // Mark read
     packetBuffer->MarkRead();
 
     // Size of buffer become 0 after marked read
-    BOOST_TEST(packetBuffer->GetSize() == 0);
+    CHECK(packetBuffer->GetSize() == 0);
 }
 
-BOOST_AUTO_TEST_CASE(PacketBufferTest1)
+TEST_CASE("PacketBufferTest1")
 {
     IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
 
-    BOOST_TEST(packetBuffer->GetSize() == 0);
+    CHECK(packetBuffer->GetSize() == 0);
 
     // Write data to the buffer using GetWritableData
     auto writeBuffer = packetBuffer->GetWritableData();
@@ -70,7 +70,7 @@
 
     packetBuffer->Commit(16);
 
-    BOOST_TEST(packetBuffer->GetSize() == 16);
+    CHECK(packetBuffer->GetSize() == 16);
 
     // Read data from the buffer
     auto readBuffer = packetBuffer->GetReadableData();
@@ -79,20 +79,21 @@
     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);
+    CHECK(readData0 == 10);
+    CHECK(readData1 == 20);
+    CHECK(readData2 == 30);
+    CHECK(readData3 == 40);
 
     packetBuffer->MarkRead();
 
-    BOOST_TEST(packetBuffer->GetSize() == 0);
+    CHECK(packetBuffer->GetSize() == 0);
 }
 
-BOOST_AUTO_TEST_CASE(PacketBufferReleaseTest) {
+TEST_CASE("PacketBufferReleaseTest")
+{
     IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
 
-    BOOST_TEST(packetBuffer->GetSize() == 0);
+    CHECK(packetBuffer->GetSize() == 0);
 
     auto writeBuffer = packetBuffer->GetWritableData();
 
@@ -104,48 +105,48 @@
     packetBuffer->Release();
 
     // Size of buffer become 0 after release
-    BOOST_TEST(packetBuffer->GetSize() == 0);
+    CHECK(packetBuffer->GetSize() == 0);
 }
 
-BOOST_AUTO_TEST_CASE(PacketBufferCommitErrorTest)
+TEST_CASE("PacketBufferCommitErrorTest")
 {
     IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(8);
 
     // Cannot commit data bigger than the max size of the buffer
-    BOOST_CHECK_THROW(packetBuffer->Commit(16);, armnn::RuntimeException);
+    CHECK_THROWS_AS(packetBuffer->Commit(16);, armnn::RuntimeException);
 }
 
-BOOST_AUTO_TEST_CASE(BufferReserveTest)
+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());
+    CHECK(reservedSize == 512);
+    CHECK(packetBuffer.get());
 }
 
-BOOST_AUTO_TEST_CASE(BufferReserveExceedingSpaceTest)
+TEST_CASE("BufferReserveExceedingSpaceTest")
 {
     BufferManager bufferManager(1, 512);
     unsigned int reservedSize = 0;
 
     // Cannot reserve buffer bigger than maximum buffer size
     auto reservedBuffer = bufferManager.Reserve(1024, reservedSize);
-    BOOST_TEST(reservedSize == 0);
-    BOOST_TEST(!reservedBuffer.get());
+    CHECK(reservedSize == 0);
+    CHECK(!reservedBuffer.get());
 }
 
-BOOST_AUTO_TEST_CASE(BufferExhaustionTest)
+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());
+    CHECK(reservedSize == 512);
+    CHECK(packetBuffer.get());
 
     // Cannot reserve buffer when buffer is not available
     // NOTE: because the buffer manager now has surge capacity of
@@ -154,43 +155,43 @@
     packetBuffer = bufferManager.Reserve(512, reservedSize);
 
     // Successfully reserved the second buffer with requested size
-    BOOST_TEST(reservedSize == 512);
-    BOOST_TEST(packetBuffer.get());
+    CHECK(reservedSize == 512);
+    CHECK(packetBuffer.get());
 
     packetBuffer = bufferManager.Reserve(512, reservedSize);
 
     // Successfully reserved the third buffer with requested size
-    BOOST_TEST(reservedSize == 512);
-    BOOST_TEST(packetBuffer.get());
+    CHECK(reservedSize == 512);
+    CHECK(packetBuffer.get());
 
     auto reservedBuffer = bufferManager.Reserve(512, reservedSize);
-    BOOST_TEST(reservedSize == 0);
-    BOOST_TEST(!reservedBuffer.get());
+    CHECK(reservedSize == 0);
+    CHECK(!reservedBuffer.get());
 }
 
-BOOST_AUTO_TEST_CASE(BufferReserveMultipleTest)
+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());
+    CHECK(reservedSize0 == 512);
+    CHECK(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());
+    CHECK(reservedSize1 == 128);
+    CHECK(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());
+    CHECK(reservedSize2 == 512);
+    CHECK(packetBuffer2.get());
 
     // NOTE: the buffer now has a surge capacity of initial size * 3
     //       so we can grab 9 of them prior to exhaustion now
@@ -201,33 +202,33 @@
         auto packetBuffer = bufferManager.Reserve(512, reservedSize);
 
         // Successfully reserved the third buffer with requested size
-        BOOST_TEST(reservedSize == 512);
-        BOOST_TEST(packetBuffer.get());
+        CHECK(reservedSize == 512);
+        CHECK(packetBuffer.get());
     }
 
     // Cannot reserve when buffer is not available
     unsigned int reservedSize3 = 0;
     auto reservedBuffer = bufferManager.Reserve(512, reservedSize3);
-    BOOST_TEST(reservedSize3 == 0);
-    BOOST_TEST(!reservedBuffer.get());
+    CHECK(reservedSize3 == 0);
+    CHECK(!reservedBuffer.get());
 }
 
-BOOST_AUTO_TEST_CASE(BufferReleaseTest)
+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());
+    CHECK(reservedSize0 == 512);
+    CHECK(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());
+    CHECK(reservedSize1 == 128);
+    CHECK(packetBuffer1.get());
 
     // NOTE: now that we have a surge capacity of up to
     //       initial size * 3 we need to allocate four more
@@ -239,39 +240,39 @@
         auto packetBuffer = bufferManager.Reserve(512, reservedSize);
 
         // Successfully reserved the third buffer with requested size
-        BOOST_TEST(reservedSize == 512);
-        BOOST_TEST(packetBuffer.get());
+        CHECK(reservedSize == 512);
+        CHECK(packetBuffer.get());
     }
 
     // Cannot reserve when buffer is not available
     unsigned int reservedSize2 = 0;
     auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
-    BOOST_TEST(reservedSize2 == 0);
-    BOOST_TEST(!reservedBuffer.get());
+    CHECK(reservedSize2 == 0);
+    CHECK(!reservedBuffer.get());
 
     bufferManager.Release(packetBuffer0);
 
     // Buffer should become available after release
     auto packetBuffer2 = bufferManager.Reserve(128, reservedSize2);
 
-    BOOST_TEST(reservedSize2 == 128);
-    BOOST_TEST(packetBuffer2.get());
+    CHECK(reservedSize2 == 128);
+    CHECK(packetBuffer2.get());
 }
 
-BOOST_AUTO_TEST_CASE(BufferCommitTest)
+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());
+    CHECK(reservedSize0 == 512);
+    CHECK(packetBuffer0.get());
 
     unsigned int reservedSize1 = 0;
     auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
 
-    BOOST_TEST(reservedSize1 == 128);
-    BOOST_TEST(packetBuffer1.get());
+    CHECK(reservedSize1 == 128);
+    CHECK(packetBuffer1.get());
 
     // NOTE: now that we have a surge capacity of up to
     //       initial size * 3 we need to allocate four more
@@ -283,43 +284,43 @@
         auto packetBuffer = bufferManager.Reserve(512, reservedSize);
 
         // Successfully reserved the third buffer with requested size
-        BOOST_TEST(reservedSize == 512);
-        BOOST_TEST(packetBuffer.get());
+        CHECK(reservedSize == 512);
+        CHECK(packetBuffer.get());
     }
 
     unsigned int reservedSize2 = 0;
     auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
-    BOOST_TEST(reservedSize2 == 0);
-    BOOST_TEST(!reservedBuffer.get());
+    CHECK(reservedSize2 == 0);
+    CHECK(!reservedBuffer.get());
 
     bufferManager.Commit(packetBuffer0, 256);
 
     // Buffer should become readable after commit
     auto packetBuffer2 = bufferManager.GetReadableBuffer();
-    BOOST_TEST(packetBuffer2.get());
-    BOOST_TEST(packetBuffer2->GetSize() == 256);
+    CHECK(packetBuffer2.get());
+    CHECK(packetBuffer2->GetSize() == 256);
 
     // Buffer not set back to available list after commit
     unsigned int reservedSize = 0;
     reservedBuffer = bufferManager.Reserve(512, reservedSize);
-    BOOST_TEST(reservedSize == 0);
-    BOOST_TEST(!reservedBuffer.get());
+    CHECK(reservedSize == 0);
+    CHECK(!reservedBuffer.get());
 }
 
-BOOST_AUTO_TEST_CASE(BufferMarkReadTest)
+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());
+    CHECK(reservedSize0 == 512);
+    CHECK(packetBuffer0.get());
 
     unsigned int reservedSize1 = 0;
     auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1);
 
-    BOOST_TEST(reservedSize1 == 128);
-    BOOST_TEST(packetBuffer1.get());
+    CHECK(reservedSize1 == 128);
+    CHECK(packetBuffer1.get());
 
     // NOTE: now that we have a surge capacity of up to
     //       initial size * 3 we need to allocate four more
@@ -331,45 +332,45 @@
         auto packetBuffer = bufferManager.Reserve(512, reservedSize);
 
         // Successfully reserved the third buffer with requested size
-        BOOST_TEST(reservedSize == 512);
-        BOOST_TEST(packetBuffer.get());
+        CHECK(reservedSize == 512);
+        CHECK(packetBuffer.get());
     }
 
     // Cannot reserve when buffer is not available
     unsigned int reservedSize2 = 0;
     auto reservedBuffer = bufferManager.Reserve(512, reservedSize2);
-    BOOST_TEST(reservedSize2 == 0);
-    BOOST_TEST(!reservedBuffer.get());
+    CHECK(reservedSize2 == 0);
+    CHECK(!reservedBuffer.get());
 
     bufferManager.Commit(packetBuffer0, 256);
 
     // Buffer should become readable after commit
     auto packetBuffer2 = bufferManager.GetReadableBuffer();
-    BOOST_TEST(packetBuffer2.get());
-    BOOST_TEST(packetBuffer2->GetSize() == 256);
+    CHECK(packetBuffer2.get());
+    CHECK(packetBuffer2->GetSize() == 256);
 
     // Buffer not set back to available list after commit
     reservedBuffer = bufferManager.Reserve(512, reservedSize2);
-    BOOST_TEST(reservedSize2 == 0);
-    BOOST_TEST(!reservedBuffer.get());
+    CHECK(reservedSize2 == 0);
+    CHECK(!reservedBuffer.get());
 
     bufferManager.MarkRead(packetBuffer2);
 
     //Buffer should set back to available list after marked read and can be reserved
     auto readBuffer = bufferManager.GetReadableBuffer();
-    BOOST_TEST(!readBuffer);
+    CHECK(!readBuffer);
     unsigned int reservedSize3 = 0;
     auto packetBuffer3 = bufferManager.Reserve(56, reservedSize3);
 
-    BOOST_TEST(reservedSize3 == 56);
-    BOOST_TEST(packetBuffer3.get());
+    CHECK(reservedSize3 == 56);
+    CHECK(packetBuffer3.get());
 }
 
-BOOST_AUTO_TEST_CASE(ReadSwTraceMessageExceptionTest0)
+TEST_CASE("ReadSwTraceMessageExceptionTest0")
 {
     IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
 
-    BOOST_TEST(packetBuffer->GetSize() == 0);
+    CHECK(packetBuffer->GetSize() == 0);
 
     // Write zero data to the buffer
     WriteUint32(packetBuffer, 0, 0);
@@ -382,16 +383,16 @@
 
     unsigned int uint32_t_size = sizeof(uint32_t);
     unsigned int offset = uint32_t_size;
-    BOOST_CHECK_THROW(arm::pipe::ReadSwTraceMessage(packetBuffer->GetReadableData(), offset, packetBuffer->GetSize()),
+    CHECK_THROWS_AS(arm::pipe::ReadSwTraceMessage(packetBuffer->GetReadableData(), offset, packetBuffer->GetSize()),
                       arm::pipe::ProfilingException);
 
 }
 
-BOOST_AUTO_TEST_CASE(ReadSwTraceMessageExceptionTest1)
+TEST_CASE("ReadSwTraceMessageExceptionTest1")
 {
     IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512);
 
-    BOOST_TEST(packetBuffer->GetSize() == 0);
+    CHECK(packetBuffer->GetSize() == 0);
 
     // Write data to the buffer
     WriteUint32(packetBuffer, 0, 10);
@@ -404,9 +405,9 @@
 
     unsigned int uint32_t_size = sizeof(uint32_t);
     unsigned int offset = uint32_t_size;
-    BOOST_CHECK_THROW(arm::pipe::ReadSwTraceMessage(packetBuffer->GetReadableData(), offset, packetBuffer->GetSize()),
+    CHECK_THROWS_AS(arm::pipe::ReadSwTraceMessage(packetBuffer->GetReadableData(), offset, packetBuffer->GetSize()),
                       arm::pipe::ProfilingException);
 
 }
 
-BOOST_AUTO_TEST_SUITE_END()
+}
