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