|
20 | 20 | #include "freertos/ringbuf.h" |
21 | 21 | #include "unity.h" |
22 | 22 | #include "esp_rom_sys.h" |
| 23 | +#include "esp_task.h" |
23 | 24 |
|
24 | 25 | #include "test_functions.h" |
25 | 26 |
|
@@ -1318,3 +1319,61 @@ TEST_CASE("Test no-split full buffer becomes empty when oldest is returned last" |
1318 | 1319 | TEST_ASSERT_NOT_NULL(slot); |
1319 | 1320 | vRingbufferDelete(buffer_handle); |
1320 | 1321 | } |
| 1322 | + |
| 1323 | +/* ----------------------------------- Test ring buffer reset -------------------------------------- |
| 1324 | + * Reset Case: Test that vRingbufferReset() empties the ring buffer |
| 1325 | + * Reset unblocks sender: Test that vRingbufferReset() will unblock a previously blocked sender |
| 1326 | + */ |
| 1327 | + |
| 1328 | +static uint8_t item[SMALL_ITEM_SIZE] = {0}; |
| 1329 | + |
| 1330 | +TEST_CASE("Test ring buffer reset", "[esp_ringbuf][linux]") |
| 1331 | +{ |
| 1332 | + // Create buffer |
| 1333 | + RingbufHandle_t rb = xRingbufferCreate(SMALL_ITEM_SIZE, RINGBUF_TYPE_BYTEBUF); |
| 1334 | + TEST_ASSERT_MESSAGE(rb != NULL, "Failed to create ring buffer"); |
| 1335 | + // Fill buffer |
| 1336 | + TEST_ASSERT_EQUAL(pdTRUE, xRingbufferSend(rb, item, SMALL_ITEM_SIZE, 0)); |
| 1337 | + // Confirm buffer is full |
| 1338 | + TEST_ASSERT_EQUAL(0, xRingbufferGetCurFreeSize(rb)); |
| 1339 | + // Reset ring buffer |
| 1340 | + vRingbufferReset(rb); |
| 1341 | + // Confirm buffer is empty |
| 1342 | + TEST_ASSERT_EQUAL(SMALL_ITEM_SIZE, xRingbufferGetCurFreeSize(rb)); |
| 1343 | + // Cleanup |
| 1344 | + vRingbufferDelete(rb); |
| 1345 | +} |
| 1346 | + |
| 1347 | +static volatile bool post_reset_send = false; |
| 1348 | + |
| 1349 | +static void post_reset_send_task(void *arg) |
| 1350 | +{ |
| 1351 | + RingbufHandle_t rb = (RingbufHandle_t)arg; |
| 1352 | + TEST_ASSERT_EQUAL(pdTRUE, xRingbufferSend(rb, item, SMALL_ITEM_SIZE, portMAX_DELAY)); |
| 1353 | + post_reset_send = true; |
| 1354 | + vTaskDelete(NULL); |
| 1355 | +} |
| 1356 | + |
| 1357 | +TEST_CASE("Test ring buffer reset unblocks sender ", "[esp_ringbuf][linux]") |
| 1358 | +{ |
| 1359 | + // Create buffer |
| 1360 | + RingbufHandle_t rb = xRingbufferCreate(SMALL_ITEM_SIZE, RINGBUF_TYPE_BYTEBUF); |
| 1361 | + TEST_ASSERT_MESSAGE(rb != NULL, "Failed to create ring buffer"); |
| 1362 | + // Fill buffer |
| 1363 | + TEST_ASSERT_EQUAL(pdTRUE, xRingbufferSend(rb, item, SMALL_ITEM_SIZE, 0)); |
| 1364 | + // Confirm buffer is full |
| 1365 | + TEST_ASSERT_EQUAL(0, xRingbufferGetCurFreeSize(rb)); |
| 1366 | + // Launch task to block on sending to full ring buffer |
| 1367 | + post_reset_send = false; |
| 1368 | + xTaskCreatePinnedToCore(post_reset_send_task, "send tsk", 2048, (void*)rb, ESP_TASK_MAIN_PRIO + 1, NULL, 0); |
| 1369 | + vTaskDelay(10); |
| 1370 | + // Confirm blocked task has not sent |
| 1371 | + TEST_ASSERT_EQUAL(false, post_reset_send); |
| 1372 | + // Reset the ring buffer |
| 1373 | + vRingbufferReset(rb); |
| 1374 | + |
| 1375 | + TEST_ASSERT_EQUAL(true, post_reset_send); |
| 1376 | + // Cleanup |
| 1377 | + vRingbufferDelete(rb); |
| 1378 | + vTaskDelay(1); |
| 1379 | +} |
0 commit comments