1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #include <client/src/BufferManager.hpp> 7*89c4ff92SAndroid Build Coastguard Worker #include <client/src/PacketBuffer.hpp> 8*89c4ff92SAndroid Build Coastguard Worker #include <client/src/ProfilingUtils.hpp> 9*89c4ff92SAndroid Build Coastguard Worker 10*89c4ff92SAndroid Build Coastguard Worker #include <common/include/SwTrace.hpp> 11*89c4ff92SAndroid Build Coastguard Worker 12*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h> 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker using namespace arm::pipe; 15*89c4ff92SAndroid Build Coastguard Worker 16*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("BufferTests") 17*89c4ff92SAndroid Build Coastguard Worker { 18*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("PacketBufferTest0") 19*89c4ff92SAndroid Build Coastguard Worker { 20*89c4ff92SAndroid Build Coastguard Worker IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512); 21*89c4ff92SAndroid Build Coastguard Worker 22*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer->GetSize() == 0); 23*89c4ff92SAndroid Build Coastguard Worker 24*89c4ff92SAndroid Build Coastguard Worker // Write data to the buffer 25*89c4ff92SAndroid Build Coastguard Worker WriteUint32(packetBuffer, 0, 10); 26*89c4ff92SAndroid Build Coastguard Worker WriteUint32(packetBuffer, 4, 20); 27*89c4ff92SAndroid Build Coastguard Worker WriteUint32(packetBuffer, 8, 30); 28*89c4ff92SAndroid Build Coastguard Worker WriteUint32(packetBuffer, 12, 40); 29*89c4ff92SAndroid Build Coastguard Worker 30*89c4ff92SAndroid Build Coastguard Worker // Commit 31*89c4ff92SAndroid Build Coastguard Worker packetBuffer->Commit(16); 32*89c4ff92SAndroid Build Coastguard Worker 33*89c4ff92SAndroid Build Coastguard Worker // Size of buffer is equal to committed data 34*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer->GetSize() == 16); 35*89c4ff92SAndroid Build Coastguard Worker 36*89c4ff92SAndroid Build Coastguard Worker // Read data from the buffer 37*89c4ff92SAndroid Build Coastguard Worker auto readBuffer = packetBuffer->GetReadableData(); 38*89c4ff92SAndroid Build Coastguard Worker uint32_t readData0 = ReadUint32(readBuffer, 0); 39*89c4ff92SAndroid Build Coastguard Worker uint32_t readData1 = ReadUint32(readBuffer, 4); 40*89c4ff92SAndroid Build Coastguard Worker uint32_t readData2 = ReadUint32(readBuffer, 8); 41*89c4ff92SAndroid Build Coastguard Worker uint32_t readData3 = ReadUint32(readBuffer, 12); 42*89c4ff92SAndroid Build Coastguard Worker 43*89c4ff92SAndroid Build Coastguard Worker // Check that data is correct 44*89c4ff92SAndroid Build Coastguard Worker CHECK(readData0 == 10); 45*89c4ff92SAndroid Build Coastguard Worker CHECK(readData1 == 20); 46*89c4ff92SAndroid Build Coastguard Worker CHECK(readData2 == 30); 47*89c4ff92SAndroid Build Coastguard Worker CHECK(readData3 == 40); 48*89c4ff92SAndroid Build Coastguard Worker 49*89c4ff92SAndroid Build Coastguard Worker // Mark read 50*89c4ff92SAndroid Build Coastguard Worker packetBuffer->MarkRead(); 51*89c4ff92SAndroid Build Coastguard Worker 52*89c4ff92SAndroid Build Coastguard Worker // Size of buffer become 0 after marked read 53*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer->GetSize() == 0); 54*89c4ff92SAndroid Build Coastguard Worker } 55*89c4ff92SAndroid Build Coastguard Worker 56*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("PacketBufferTest1") 57*89c4ff92SAndroid Build Coastguard Worker { 58*89c4ff92SAndroid Build Coastguard Worker IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512); 59*89c4ff92SAndroid Build Coastguard Worker 60*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer->GetSize() == 0); 61*89c4ff92SAndroid Build Coastguard Worker 62*89c4ff92SAndroid Build Coastguard Worker // Write data to the buffer using GetWritableData 63*89c4ff92SAndroid Build Coastguard Worker auto writeBuffer = packetBuffer->GetWritableData(); 64*89c4ff92SAndroid Build Coastguard Worker WriteUint32(writeBuffer, 0, 10); 65*89c4ff92SAndroid Build Coastguard Worker WriteUint32(writeBuffer, 4, 20); 66*89c4ff92SAndroid Build Coastguard Worker WriteUint32(writeBuffer, 8, 30); 67*89c4ff92SAndroid Build Coastguard Worker WriteUint32(writeBuffer, 12, 40); 68*89c4ff92SAndroid Build Coastguard Worker 69*89c4ff92SAndroid Build Coastguard Worker packetBuffer->Commit(16); 70*89c4ff92SAndroid Build Coastguard Worker 71*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer->GetSize() == 16); 72*89c4ff92SAndroid Build Coastguard Worker 73*89c4ff92SAndroid Build Coastguard Worker // Read data from the buffer 74*89c4ff92SAndroid Build Coastguard Worker auto readBuffer = packetBuffer->GetReadableData(); 75*89c4ff92SAndroid Build Coastguard Worker uint32_t readData0 = ReadUint32(readBuffer, 0); 76*89c4ff92SAndroid Build Coastguard Worker uint32_t readData1 = ReadUint32(readBuffer, 4); 77*89c4ff92SAndroid Build Coastguard Worker uint32_t readData2 = ReadUint32(readBuffer, 8); 78*89c4ff92SAndroid Build Coastguard Worker uint32_t readData3 = ReadUint32(readBuffer, 12); 79*89c4ff92SAndroid Build Coastguard Worker 80*89c4ff92SAndroid Build Coastguard Worker CHECK(readData0 == 10); 81*89c4ff92SAndroid Build Coastguard Worker CHECK(readData1 == 20); 82*89c4ff92SAndroid Build Coastguard Worker CHECK(readData2 == 30); 83*89c4ff92SAndroid Build Coastguard Worker CHECK(readData3 == 40); 84*89c4ff92SAndroid Build Coastguard Worker 85*89c4ff92SAndroid Build Coastguard Worker packetBuffer->MarkRead(); 86*89c4ff92SAndroid Build Coastguard Worker 87*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer->GetSize() == 0); 88*89c4ff92SAndroid Build Coastguard Worker } 89*89c4ff92SAndroid Build Coastguard Worker 90*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("PacketBufferReleaseTest") 91*89c4ff92SAndroid Build Coastguard Worker { 92*89c4ff92SAndroid Build Coastguard Worker IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512); 93*89c4ff92SAndroid Build Coastguard Worker 94*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer->GetSize() == 0); 95*89c4ff92SAndroid Build Coastguard Worker 96*89c4ff92SAndroid Build Coastguard Worker auto writeBuffer = packetBuffer->GetWritableData(); 97*89c4ff92SAndroid Build Coastguard Worker 98*89c4ff92SAndroid Build Coastguard Worker WriteUint32(writeBuffer, 0, 10); 99*89c4ff92SAndroid Build Coastguard Worker WriteUint32(writeBuffer, 4, 20); 100*89c4ff92SAndroid Build Coastguard Worker WriteUint32(writeBuffer, 8, 30); 101*89c4ff92SAndroid Build Coastguard Worker WriteUint32(writeBuffer, 12, 40); 102*89c4ff92SAndroid Build Coastguard Worker 103*89c4ff92SAndroid Build Coastguard Worker packetBuffer->Release(); 104*89c4ff92SAndroid Build Coastguard Worker 105*89c4ff92SAndroid Build Coastguard Worker // Size of buffer become 0 after release 106*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer->GetSize() == 0); 107*89c4ff92SAndroid Build Coastguard Worker } 108*89c4ff92SAndroid Build Coastguard Worker 109*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("PacketBufferCommitErrorTest") 110*89c4ff92SAndroid Build Coastguard Worker { 111*89c4ff92SAndroid Build Coastguard Worker IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(8); 112*89c4ff92SAndroid Build Coastguard Worker 113*89c4ff92SAndroid Build Coastguard Worker // Cannot commit data bigger than the max size of the buffer 114*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(packetBuffer->Commit(16);, arm::pipe::ProfilingException); 115*89c4ff92SAndroid Build Coastguard Worker } 116*89c4ff92SAndroid Build Coastguard Worker 117*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("BufferReserveTest") 118*89c4ff92SAndroid Build Coastguard Worker { 119*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(1, 512); 120*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize = 0; 121*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer = bufferManager.Reserve(512, reservedSize); 122*89c4ff92SAndroid Build Coastguard Worker 123*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the buffer with requested size 124*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize == 512); 125*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer.get()); 126*89c4ff92SAndroid Build Coastguard Worker } 127*89c4ff92SAndroid Build Coastguard Worker 128*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("BufferReserveExceedingSpaceTest") 129*89c4ff92SAndroid Build Coastguard Worker { 130*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(1, 512); 131*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize = 0; 132*89c4ff92SAndroid Build Coastguard Worker 133*89c4ff92SAndroid Build Coastguard Worker // Cannot reserve buffer bigger than maximum buffer size 134*89c4ff92SAndroid Build Coastguard Worker auto reservedBuffer = bufferManager.Reserve(1024, reservedSize); 135*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize == 0); 136*89c4ff92SAndroid Build Coastguard Worker CHECK(!reservedBuffer.get()); 137*89c4ff92SAndroid Build Coastguard Worker } 138*89c4ff92SAndroid Build Coastguard Worker 139*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("BufferExhaustionTest") 140*89c4ff92SAndroid Build Coastguard Worker { 141*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(1, 512); 142*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize = 0; 143*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer = bufferManager.Reserve(512, reservedSize); 144*89c4ff92SAndroid Build Coastguard Worker 145*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the buffer with requested size 146*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize == 512); 147*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer.get()); 148*89c4ff92SAndroid Build Coastguard Worker 149*89c4ff92SAndroid Build Coastguard Worker // Cannot reserve buffer when buffer is not available 150*89c4ff92SAndroid Build Coastguard Worker // NOTE: because the buffer manager now has surge capacity of 151*89c4ff92SAndroid Build Coastguard Worker // initial size * 3 we should be able to reserve three 152*89c4ff92SAndroid Build Coastguard Worker // buffers before exhaustion 153*89c4ff92SAndroid Build Coastguard Worker packetBuffer = bufferManager.Reserve(512, reservedSize); 154*89c4ff92SAndroid Build Coastguard Worker 155*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the second buffer with requested size 156*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize == 512); 157*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer.get()); 158*89c4ff92SAndroid Build Coastguard Worker 159*89c4ff92SAndroid Build Coastguard Worker packetBuffer = bufferManager.Reserve(512, reservedSize); 160*89c4ff92SAndroid Build Coastguard Worker 161*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the third buffer with requested size 162*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize == 512); 163*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer.get()); 164*89c4ff92SAndroid Build Coastguard Worker 165*89c4ff92SAndroid Build Coastguard Worker auto reservedBuffer = bufferManager.Reserve(512, reservedSize); 166*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize == 0); 167*89c4ff92SAndroid Build Coastguard Worker CHECK(!reservedBuffer.get()); 168*89c4ff92SAndroid Build Coastguard Worker } 169*89c4ff92SAndroid Build Coastguard Worker 170*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("BufferReserveMultipleTest") 171*89c4ff92SAndroid Build Coastguard Worker { 172*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(3, 512); 173*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize0 = 0; 174*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0); 175*89c4ff92SAndroid Build Coastguard Worker 176*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the buffer with requested size 177*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize0 == 512); 178*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer0.get()); 179*89c4ff92SAndroid Build Coastguard Worker 180*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize1 = 0; 181*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1); 182*89c4ff92SAndroid Build Coastguard Worker 183*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the buffer with requested size 184*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize1 == 128); 185*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer1.get()); 186*89c4ff92SAndroid Build Coastguard Worker 187*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize2 = 0; 188*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer2 = bufferManager.Reserve(512, reservedSize2); 189*89c4ff92SAndroid Build Coastguard Worker 190*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the buffer with requested size 191*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize2 == 512); 192*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer2.get()); 193*89c4ff92SAndroid Build Coastguard Worker 194*89c4ff92SAndroid Build Coastguard Worker // NOTE: the buffer now has a surge capacity of initial size * 3 195*89c4ff92SAndroid Build Coastguard Worker // so we can grab 9 of them prior to exhaustion now 196*89c4ff92SAndroid Build Coastguard Worker for (unsigned int i = 0; i < 6 ; ++i) 197*89c4ff92SAndroid Build Coastguard Worker { 198*89c4ff92SAndroid Build Coastguard Worker // grab another six buffers to exhaust the surge capacity 199*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize = 0; 200*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer = bufferManager.Reserve(512, reservedSize); 201*89c4ff92SAndroid Build Coastguard Worker 202*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the third buffer with requested size 203*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize == 512); 204*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer.get()); 205*89c4ff92SAndroid Build Coastguard Worker } 206*89c4ff92SAndroid Build Coastguard Worker 207*89c4ff92SAndroid Build Coastguard Worker // Cannot reserve when buffer is not available 208*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize3 = 0; 209*89c4ff92SAndroid Build Coastguard Worker auto reservedBuffer = bufferManager.Reserve(512, reservedSize3); 210*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize3 == 0); 211*89c4ff92SAndroid Build Coastguard Worker CHECK(!reservedBuffer.get()); 212*89c4ff92SAndroid Build Coastguard Worker } 213*89c4ff92SAndroid Build Coastguard Worker 214*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("BufferReleaseTest") 215*89c4ff92SAndroid Build Coastguard Worker { 216*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(2, 512); 217*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize0 = 0; 218*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0); 219*89c4ff92SAndroid Build Coastguard Worker 220*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the buffer with requested size 221*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize0 == 512); 222*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer0.get()); 223*89c4ff92SAndroid Build Coastguard Worker 224*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize1 = 0; 225*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1); 226*89c4ff92SAndroid Build Coastguard Worker 227*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the buffer with requested size 228*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize1 == 128); 229*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer1.get()); 230*89c4ff92SAndroid Build Coastguard Worker 231*89c4ff92SAndroid Build Coastguard Worker // NOTE: now that we have a surge capacity of up to 232*89c4ff92SAndroid Build Coastguard Worker // initial size * 3 we need to allocate four more 233*89c4ff92SAndroid Build Coastguard Worker // buffers to exhaust the manager 234*89c4ff92SAndroid Build Coastguard Worker for (unsigned int i = 0; i < 4 ; ++i) 235*89c4ff92SAndroid Build Coastguard Worker { 236*89c4ff92SAndroid Build Coastguard Worker // grab another six buffers to exhaust the surge capacity 237*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize = 0; 238*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer = bufferManager.Reserve(512, reservedSize); 239*89c4ff92SAndroid Build Coastguard Worker 240*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the third buffer with requested size 241*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize == 512); 242*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer.get()); 243*89c4ff92SAndroid Build Coastguard Worker } 244*89c4ff92SAndroid Build Coastguard Worker 245*89c4ff92SAndroid Build Coastguard Worker // Cannot reserve when buffer is not available 246*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize2 = 0; 247*89c4ff92SAndroid Build Coastguard Worker auto reservedBuffer = bufferManager.Reserve(512, reservedSize2); 248*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize2 == 0); 249*89c4ff92SAndroid Build Coastguard Worker CHECK(!reservedBuffer.get()); 250*89c4ff92SAndroid Build Coastguard Worker 251*89c4ff92SAndroid Build Coastguard Worker bufferManager.Release(packetBuffer0); 252*89c4ff92SAndroid Build Coastguard Worker 253*89c4ff92SAndroid Build Coastguard Worker // Buffer should become available after release 254*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer2 = bufferManager.Reserve(128, reservedSize2); 255*89c4ff92SAndroid Build Coastguard Worker 256*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize2 == 128); 257*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer2.get()); 258*89c4ff92SAndroid Build Coastguard Worker } 259*89c4ff92SAndroid Build Coastguard Worker 260*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("BufferCommitTest") 261*89c4ff92SAndroid Build Coastguard Worker { 262*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(2, 512); 263*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize0 = 0; 264*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0); 265*89c4ff92SAndroid Build Coastguard Worker 266*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize0 == 512); 267*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer0.get()); 268*89c4ff92SAndroid Build Coastguard Worker 269*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize1 = 0; 270*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1); 271*89c4ff92SAndroid Build Coastguard Worker 272*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize1 == 128); 273*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer1.get()); 274*89c4ff92SAndroid Build Coastguard Worker 275*89c4ff92SAndroid Build Coastguard Worker // NOTE: now that we have a surge capacity of up to 276*89c4ff92SAndroid Build Coastguard Worker // initial size * 3 we need to allocate four more 277*89c4ff92SAndroid Build Coastguard Worker // buffers to exhaust the manager 278*89c4ff92SAndroid Build Coastguard Worker for (unsigned int i = 0; i < 4 ; ++i) 279*89c4ff92SAndroid Build Coastguard Worker { 280*89c4ff92SAndroid Build Coastguard Worker // grab another six buffers to exhaust the surge capacity 281*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize = 0; 282*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer = bufferManager.Reserve(512, reservedSize); 283*89c4ff92SAndroid Build Coastguard Worker 284*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the third buffer with requested size 285*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize == 512); 286*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer.get()); 287*89c4ff92SAndroid Build Coastguard Worker } 288*89c4ff92SAndroid Build Coastguard Worker 289*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize2 = 0; 290*89c4ff92SAndroid Build Coastguard Worker auto reservedBuffer = bufferManager.Reserve(512, reservedSize2); 291*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize2 == 0); 292*89c4ff92SAndroid Build Coastguard Worker CHECK(!reservedBuffer.get()); 293*89c4ff92SAndroid Build Coastguard Worker 294*89c4ff92SAndroid Build Coastguard Worker bufferManager.Commit(packetBuffer0, 256); 295*89c4ff92SAndroid Build Coastguard Worker 296*89c4ff92SAndroid Build Coastguard Worker // Buffer should become readable after commit 297*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer2 = bufferManager.GetReadableBuffer(); 298*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer2.get()); 299*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer2->GetSize() == 256); 300*89c4ff92SAndroid Build Coastguard Worker 301*89c4ff92SAndroid Build Coastguard Worker // Buffer not set back to available list after commit 302*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize = 0; 303*89c4ff92SAndroid Build Coastguard Worker reservedBuffer = bufferManager.Reserve(512, reservedSize); 304*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize == 0); 305*89c4ff92SAndroid Build Coastguard Worker CHECK(!reservedBuffer.get()); 306*89c4ff92SAndroid Build Coastguard Worker } 307*89c4ff92SAndroid Build Coastguard Worker 308*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("BufferMarkReadTest") 309*89c4ff92SAndroid Build Coastguard Worker { 310*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(2, 512); 311*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize0 = 0; 312*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer0 = bufferManager.Reserve(512, reservedSize0); 313*89c4ff92SAndroid Build Coastguard Worker 314*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize0 == 512); 315*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer0.get()); 316*89c4ff92SAndroid Build Coastguard Worker 317*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize1 = 0; 318*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer1 = bufferManager.Reserve(128, reservedSize1); 319*89c4ff92SAndroid Build Coastguard Worker 320*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize1 == 128); 321*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer1.get()); 322*89c4ff92SAndroid Build Coastguard Worker 323*89c4ff92SAndroid Build Coastguard Worker // NOTE: now that we have a surge capacity of up to 324*89c4ff92SAndroid Build Coastguard Worker // initial size * 3 we need to allocate four more 325*89c4ff92SAndroid Build Coastguard Worker // buffers to exhaust the manager 326*89c4ff92SAndroid Build Coastguard Worker for (unsigned int i = 0; i < 4 ; ++i) 327*89c4ff92SAndroid Build Coastguard Worker { 328*89c4ff92SAndroid Build Coastguard Worker // grab another six buffers to exhaust the surge capacity 329*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize = 0; 330*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer = bufferManager.Reserve(512, reservedSize); 331*89c4ff92SAndroid Build Coastguard Worker 332*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the third buffer with requested size 333*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize == 512); 334*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer.get()); 335*89c4ff92SAndroid Build Coastguard Worker } 336*89c4ff92SAndroid Build Coastguard Worker 337*89c4ff92SAndroid Build Coastguard Worker // Cannot reserve when buffer is not available 338*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize2 = 0; 339*89c4ff92SAndroid Build Coastguard Worker auto reservedBuffer = bufferManager.Reserve(512, reservedSize2); 340*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize2 == 0); 341*89c4ff92SAndroid Build Coastguard Worker CHECK(!reservedBuffer.get()); 342*89c4ff92SAndroid Build Coastguard Worker 343*89c4ff92SAndroid Build Coastguard Worker bufferManager.Commit(packetBuffer0, 256); 344*89c4ff92SAndroid Build Coastguard Worker 345*89c4ff92SAndroid Build Coastguard Worker // Buffer should become readable after commit 346*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer2 = bufferManager.GetReadableBuffer(); 347*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer2.get()); 348*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer2->GetSize() == 256); 349*89c4ff92SAndroid Build Coastguard Worker 350*89c4ff92SAndroid Build Coastguard Worker // Buffer not set back to available list after commit 351*89c4ff92SAndroid Build Coastguard Worker reservedBuffer = bufferManager.Reserve(512, reservedSize2); 352*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize2 == 0); 353*89c4ff92SAndroid Build Coastguard Worker CHECK(!reservedBuffer.get()); 354*89c4ff92SAndroid Build Coastguard Worker 355*89c4ff92SAndroid Build Coastguard Worker bufferManager.MarkRead(packetBuffer2); 356*89c4ff92SAndroid Build Coastguard Worker 357*89c4ff92SAndroid Build Coastguard Worker //Buffer should set back to available list after marked read and can be reserved 358*89c4ff92SAndroid Build Coastguard Worker auto readBuffer = bufferManager.GetReadableBuffer(); 359*89c4ff92SAndroid Build Coastguard Worker CHECK(!readBuffer); 360*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize3 = 0; 361*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer3 = bufferManager.Reserve(56, reservedSize3); 362*89c4ff92SAndroid Build Coastguard Worker 363*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize3 == 56); 364*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer3.get()); 365*89c4ff92SAndroid Build Coastguard Worker } 366*89c4ff92SAndroid Build Coastguard Worker 367*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("ReadSwTraceMessageExceptionTest0") 368*89c4ff92SAndroid Build Coastguard Worker { 369*89c4ff92SAndroid Build Coastguard Worker IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512); 370*89c4ff92SAndroid Build Coastguard Worker 371*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer->GetSize() == 0); 372*89c4ff92SAndroid Build Coastguard Worker 373*89c4ff92SAndroid Build Coastguard Worker // Write zero data to the buffer 374*89c4ff92SAndroid Build Coastguard Worker WriteUint32(packetBuffer, 0, 0); 375*89c4ff92SAndroid Build Coastguard Worker WriteUint32(packetBuffer, 4, 0); 376*89c4ff92SAndroid Build Coastguard Worker WriteUint32(packetBuffer, 8, 0); 377*89c4ff92SAndroid Build Coastguard Worker WriteUint32(packetBuffer, 12, 0); 378*89c4ff92SAndroid Build Coastguard Worker 379*89c4ff92SAndroid Build Coastguard Worker // Commit 380*89c4ff92SAndroid Build Coastguard Worker packetBuffer->Commit(16); 381*89c4ff92SAndroid Build Coastguard Worker 382*89c4ff92SAndroid Build Coastguard Worker unsigned int uint32_t_size = sizeof(uint32_t); 383*89c4ff92SAndroid Build Coastguard Worker unsigned int offset = uint32_t_size; 384*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(ReadSwTraceMessage(packetBuffer->GetReadableData(), offset, packetBuffer->GetSize()), 385*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ProfilingException); 386*89c4ff92SAndroid Build Coastguard Worker 387*89c4ff92SAndroid Build Coastguard Worker } 388*89c4ff92SAndroid Build Coastguard Worker 389*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("ReadSwTraceMessageExceptionTest1") 390*89c4ff92SAndroid Build Coastguard Worker { 391*89c4ff92SAndroid Build Coastguard Worker IPacketBufferPtr packetBuffer = std::make_unique<PacketBuffer>(512); 392*89c4ff92SAndroid Build Coastguard Worker 393*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer->GetSize() == 0); 394*89c4ff92SAndroid Build Coastguard Worker 395*89c4ff92SAndroid Build Coastguard Worker // Write data to the buffer 396*89c4ff92SAndroid Build Coastguard Worker WriteUint32(packetBuffer, 0, 10); 397*89c4ff92SAndroid Build Coastguard Worker WriteUint32(packetBuffer, 4, 20); 398*89c4ff92SAndroid Build Coastguard Worker WriteUint32(packetBuffer, 8, 30); 399*89c4ff92SAndroid Build Coastguard Worker WriteUint32(packetBuffer, 12, 40); 400*89c4ff92SAndroid Build Coastguard Worker 401*89c4ff92SAndroid Build Coastguard Worker // Commit 402*89c4ff92SAndroid Build Coastguard Worker packetBuffer->Commit(16); 403*89c4ff92SAndroid Build Coastguard Worker 404*89c4ff92SAndroid Build Coastguard Worker unsigned int uint32_t_size = sizeof(uint32_t); 405*89c4ff92SAndroid Build Coastguard Worker unsigned int offset = uint32_t_size; 406*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(ReadSwTraceMessage(packetBuffer->GetReadableData(), offset, packetBuffer->GetSize()), 407*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ProfilingException); 408*89c4ff92SAndroid Build Coastguard Worker 409*89c4ff92SAndroid Build Coastguard Worker } 410*89c4ff92SAndroid Build Coastguard Worker 411*89c4ff92SAndroid Build Coastguard Worker } 412