tests: drivers: uart: uart_async_api: test short buffers

Extend testing with short buffers.
Try different lengths of transmitted data.

Signed-off-by: Piotr Kosycarz <piotr.kosycarz@nordicsemi.no>
This commit is contained in:
Piotr Kosycarz 2025-04-29 10:24:27 +02:00 committed by Benjamin Cabé
parent da6f39172f
commit 67eb03c52c
12 changed files with 127 additions and 0 deletions

View File

@ -23,3 +23,11 @@ endif # DCACHE
config TEST_LONG_BUFFER_SIZE
int "Long buffer size"
default 1024
config VAR_LENGTH_BUFFER_TEST_BUADRATE_LIMIT
int "Above this UART baudrate value, var length buffer testing will be skipped"
default 230400
config VAR_LENGTH_BUFFER_MAX_SIZE
int "Max size of uart buffer used for testing. Testing buffer sizes from 1 to this value."
default 10

View File

@ -0,0 +1 @@
CONFIG_VAR_LENGTH_BUFFER_TEST_BUADRATE_LIMIT=57600

View File

@ -0,0 +1 @@
CONFIG_VAR_LENGTH_BUFFER_TEST_BUADRATE_LIMIT=57600

View File

@ -1,2 +1,3 @@
CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y
CONFIG_VAR_LENGTH_BUFFER_TEST_BUADRATE_LIMIT=57600

View File

@ -0,0 +1,3 @@
CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y
CONFIG_VAR_LENGTH_BUFFER_TEST_BUADRATE_LIMIT=57600

View File

@ -1 +1,2 @@
CONFIG_TEST_LONG_BUFFER_SIZE=128
CONFIG_VAR_LENGTH_BUFFER_TEST_BUADRATE_LIMIT=57600

View File

@ -0,0 +1 @@
CONFIG_VAR_LENGTH_BUFFER_TEST_BUADRATE_LIMIT=57600

View File

@ -0,0 +1 @@
CONFIG_VAR_LENGTH_BUFFER_TEST_BUADRATE_LIMIT=57600

View File

@ -0,0 +1 @@
CONFIG_VAR_LENGTH_BUFFER_TEST_BUADRATE_LIMIT=57600

View File

@ -0,0 +1 @@
CONFIG_VAR_LENGTH_BUFFER_TEST_BUADRATE_LIMIT=57600

View File

@ -1 +1,2 @@
CONFIG_ARM_MPU=n
CONFIG_VAR_LENGTH_BUFFER_TEST_BUADRATE_LIMIT=57600

View File

@ -1014,6 +1014,110 @@ ZTEST_USER(uart_async_long_buf, test_long_buffers)
"RX_DISABLED timeout");
}
#define VAR_LENGTH_TX_BUF_SIZE 12
#define VAR_LENGTH_RX_BUF_SIZE (VAR_LENGTH_TX_BUF_SIZE * 4)
#if NOCACHE_MEM
volatile static uint8_t __aligned(sizeof(void *))
var_length_rx_buf[VAR_LENGTH_RX_BUF_SIZE] __used __NOCACHE;
volatile static uint8_t __aligned(sizeof(void *))
var_length_rx_buf_pool[VAR_LENGTH_RX_BUF_SIZE] __used __NOCACHE;
#else
volatile static ZTEST_BMEM
uint8_t __aligned(sizeof(void *)) var_length_rx_buf[VAR_LENGTH_RX_BUF_SIZE];
volatile static ZTEST_BMEM
uint8_t __aligned(sizeof(void *)) var_length_rx_buf_pool[VAR_LENGTH_RX_BUF_SIZE];
#endif /* NOCACHE_MEM */
volatile static ZTEST_BMEM size_t var_length_buf_rx_idx;
volatile static ZTEST_BMEM size_t var_length_buf_rx_pool_idx;
volatile static ZTEST_BMEM size_t var_length_rx_buf_size;
static void test_var_buf_length_callback(const struct device *dev, struct uart_event *evt,
void *user_data)
{
switch (evt->type) {
case UART_RX_RDY:
memcpy((void *)&var_length_rx_buf[var_length_buf_rx_idx],
&evt->data.rx.buf[evt->data.rx.offset], evt->data.rx.len);
var_length_buf_rx_idx += evt->data.rx.len;
break;
case UART_RX_DISABLED:
k_sem_give(&rx_disabled);
break;
case UART_RX_BUF_REQUEST:
uart_rx_buf_rsp(dev, (uint8_t *)&var_length_rx_buf_pool[var_length_buf_rx_pool_idx],
var_length_rx_buf_size);
var_length_buf_rx_pool_idx += var_length_rx_buf_size;
break;
default:
break;
}
}
static void *var_buf_length_setup(void)
{
static int idx;
uart_async_test_init(idx++);
uart_callback_set(uart_dev, test_var_buf_length_callback, NULL);
return NULL;
}
static void test_uart_async_var_buf(size_t buf_len, size_t tx_len)
{
int ret;
uint8_t tx_buffer[VAR_LENGTH_TX_BUF_SIZE];
for (size_t i = 0; i < VAR_LENGTH_TX_BUF_SIZE; ++i) {
tx_buffer[i] = tx_len;
}
var_length_buf_rx_idx = 0;
var_length_buf_rx_pool_idx = 0;
memset((void *)var_length_rx_buf, 0, VAR_LENGTH_RX_BUF_SIZE);
memset((void *)var_length_rx_buf_pool, 0, VAR_LENGTH_RX_BUF_SIZE);
var_length_rx_buf_size = buf_len;
ret = uart_rx_enable(uart_dev,
(uint8_t *)&var_length_rx_buf_pool[var_length_buf_rx_pool_idx],
buf_len, 2 * USEC_PER_MSEC);
zassert_true(ret == 0, "[buff=%d][tx=%d]Failed to enable RX: %d\n", buf_len, tx_len, ret);
var_length_buf_rx_pool_idx += buf_len;
ret = uart_tx(uart_dev, tx_buffer, tx_len, 100 * USEC_PER_MSEC);
zassert_true(ret == 0, "[buff=%d][tx=%d]Failed to TX: %d\n", buf_len, tx_len, ret);
k_msleep(10);
uart_rx_disable(uart_dev);
zassert_equal(k_sem_take(&rx_disabled, K_MSEC(500)), 0,
"[buff=%d][tx=%d]RX_DISABLED timeout\n", buf_len, tx_len);
zassert_equal(var_length_buf_rx_idx, tx_len,
"[buff=%d][tx=%d]Wrong number of bytes received, got: %d, expected: %d\n",
buf_len, tx_len, var_length_buf_rx_idx, tx_len);
zassert_equal(memcmp((void *)var_length_rx_buf, tx_buffer, tx_len), 0,
"[buff=%d][tx=%d]Buffers not equal\n", buf_len, tx_len);
}
ZTEST_USER(uart_async_var_buf_length, test_var_buf_length)
{
struct uart_config uart_cfg;
zassert_equal(uart_config_get(uart_dev, &uart_cfg), 0);
if (uart_cfg.baudrate > CONFIG_VAR_LENGTH_BUFFER_TEST_BUADRATE_LIMIT) {
ztest_test_skip();
}
for (size_t buf_len = 1; buf_len < CONFIG_VAR_LENGTH_BUFFER_MAX_SIZE; ++buf_len) {
for (size_t tx_len = 1; tx_len < VAR_LENGTH_TX_BUF_SIZE; ++tx_len) {
test_uart_async_var_buf(buf_len, tx_len);
}
}
}
ZTEST_SUITE(uart_async_single_read, NULL, single_read_setup,
NULL, NULL, NULL);
@ -1035,6 +1139,9 @@ ZTEST_SUITE(uart_async_chain_write, NULL, chained_write_setup,
ZTEST_SUITE(uart_async_long_buf, NULL, long_buffers_setup,
NULL, NULL, NULL);
ZTEST_SUITE(uart_async_var_buf_length, NULL, var_buf_length_setup,
NULL, NULL, NULL);
ZTEST_SUITE(uart_async_write_abort, NULL, write_abort_setup,
NULL, NULL, NULL);