feat: Implement ESP32-C6 UART driver with basic send/receive functionality and unit tests
This commit is contained in:
258
test/uart_driver_test.c
Normal file
258
test/uart_driver_test.c
Normal file
@@ -0,0 +1,258 @@
|
||||
#include "uart_driver.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
// Mock test framework - in a real project, we would use Unity or similar
|
||||
#define TEST_ASSERT(condition) do { \
|
||||
if (!(condition)) { \
|
||||
printf("TEST FAILED: %s:%d: %s\n", __FILE__, __LINE__, #condition); \
|
||||
return 0; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define TEST_ASSERT_EQUAL(expected, actual) do { \
|
||||
if ((expected) != (actual)) { \
|
||||
printf("TEST FAILED: %s:%d: Expected %d, got %d\n", __FILE__, __LINE__, (expected), (actual)); \
|
||||
return 0; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define TEST_ASSERT_NOT_NULL(ptr) do { \
|
||||
if ((ptr) == NULL) { \
|
||||
printf("TEST FAILED: %s:%d: Expected non-NULL pointer\n", __FILE__, __LINE__); \
|
||||
return 0; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define TEST_ASSERT_NULL(ptr) do { \
|
||||
if ((ptr) != NULL) { \
|
||||
printf("TEST FAILED: %s:%d: Expected NULL pointer, got %p\n", __FILE__, __LINE__, (ptr)); \
|
||||
return 0; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
int test_uart_driver_init_valid_config(void) {
|
||||
uart_driver_t driver;
|
||||
uart_config_t config = {
|
||||
.tx_pin = 17,
|
||||
.rx_pin = 18,
|
||||
.baud_rate = 9600,
|
||||
.data_bits = 8,
|
||||
.parity = 0, // none
|
||||
.stop_bits = 1
|
||||
};
|
||||
|
||||
TEST_ASSERT(uart_driver_init(&driver, &config));
|
||||
TEST_ASSERT(uart_driver_is_initialized(&driver));
|
||||
|
||||
uart_driver_deinit(&driver);
|
||||
return 1; // Test passed
|
||||
}
|
||||
|
||||
int test_uart_driver_init_invalid_baud_rate(void) {
|
||||
uart_driver_t driver;
|
||||
uart_config_t config = {
|
||||
.tx_pin = 17,
|
||||
.rx_pin = 18,
|
||||
.baud_rate = 0, // Invalid baud rate
|
||||
.data_bits = 8,
|
||||
.parity = 0,
|
||||
.stop_bits = 1
|
||||
};
|
||||
|
||||
TEST_ASSERT(!uart_driver_init(&driver, &config));
|
||||
TEST_ASSERT(!uart_driver_is_initialized(&driver));
|
||||
|
||||
return 1; // Test passed
|
||||
}
|
||||
|
||||
int test_uart_driver_init_invalid_data_bits(void) {
|
||||
uart_driver_t driver;
|
||||
uart_config_t config = {
|
||||
.tx_pin = 17,
|
||||
.rx_pin = 18,
|
||||
.baud_rate = 9600,
|
||||
.data_bits = 9, // Invalid data bits
|
||||
.parity = 0,
|
||||
.stop_bits = 1
|
||||
};
|
||||
|
||||
TEST_ASSERT(!uart_driver_init(&driver, &config));
|
||||
TEST_ASSERT(!uart_driver_is_initialized(&driver));
|
||||
|
||||
return 1; // Test passed
|
||||
}
|
||||
|
||||
int test_uart_driver_init_null_pointers(void) {
|
||||
uart_driver_t driver;
|
||||
uart_config_t config = {
|
||||
.tx_pin = 17,
|
||||
.rx_pin = 18,
|
||||
.baud_rate = 9600,
|
||||
.data_bits = 8,
|
||||
.parity = 0,
|
||||
.stop_bits = 1
|
||||
};
|
||||
|
||||
// Test NULL driver pointer
|
||||
TEST_ASSERT(!uart_driver_init(NULL, &config));
|
||||
|
||||
// Test NULL config pointer
|
||||
TEST_ASSERT(!uart_driver_init(&driver, NULL));
|
||||
|
||||
return 1; // Test passed
|
||||
}
|
||||
|
||||
int test_uart_driver_send_receive(void) {
|
||||
uart_driver_t driver;
|
||||
uart_config_t config = {
|
||||
.tx_pin = 17,
|
||||
.rx_pin = 18,
|
||||
.baud_rate = 9600,
|
||||
.data_bits = 8,
|
||||
.parity = 0,
|
||||
.stop_bits = 1
|
||||
};
|
||||
|
||||
TEST_ASSERT(uart_driver_init(&driver, &config));
|
||||
TEST_ASSERT(uart_driver_is_initialized(&driver));
|
||||
|
||||
uint8_t test_data[] = {0x01, 0x02, 0x03, 0x04, 0x05};
|
||||
size_t test_length = sizeof(test_data);
|
||||
|
||||
// Test sending data
|
||||
TEST_ASSERT(uart_driver_send(&driver, test_data, test_length, 1000));
|
||||
|
||||
// Test receiving data (should return 0 in our mock implementation)
|
||||
uint8_t rx_buffer[10];
|
||||
int bytes_received = uart_driver_receive(&driver, rx_buffer, sizeof(rx_buffer), 100);
|
||||
TEST_ASSERT_EQUAL(0, bytes_received); // Our mock returns 0 (no data)
|
||||
|
||||
uart_driver_deinit(&driver);
|
||||
return 1; // Test passed
|
||||
}
|
||||
|
||||
int test_uart_driver_send_null_data(void) {
|
||||
uart_driver_t driver;
|
||||
uart_config_t config = {
|
||||
.tx_pin = 17,
|
||||
.rx_pin = 18,
|
||||
.baud_rate = 9600,
|
||||
.data_bits = 8,
|
||||
.parity = 0,
|
||||
.stop_bits = 1
|
||||
};
|
||||
|
||||
TEST_ASSERT(uart_driver_init(&driver, &config));
|
||||
|
||||
// Test sending NULL data
|
||||
TEST_ASSERT(!uart_driver_send(&driver, NULL, 5, 1000));
|
||||
|
||||
uart_driver_deinit(&driver);
|
||||
return 1; // Test passed
|
||||
}
|
||||
|
||||
int test_uart_driver_receive_null_buffer(void) {
|
||||
uart_driver_t driver;
|
||||
uart_config_t config = {
|
||||
.tx_pin = 17,
|
||||
.rx_pin = 18,
|
||||
.baud_rate = 9600,
|
||||
.data_bits = 8,
|
||||
.parity = 0,
|
||||
.stop_bits = 1
|
||||
};
|
||||
|
||||
TEST_ASSERT(uart_driver_init(&driver, &config));
|
||||
|
||||
// Test receiving with NULL buffer
|
||||
TEST_ASSERT_EQUAL(-1, uart_driver_receive(&driver, NULL, 10, 100));
|
||||
|
||||
uart_driver_deinit(&driver);
|
||||
return 1; // Test passed
|
||||
}
|
||||
|
||||
int test_uart_driver_uninitialized_operations(void) {
|
||||
uart_driver_t driver = {0}; // Not initialized
|
||||
uint8_t test_data = 0x01;
|
||||
uint8_t rx_buffer[10];
|
||||
|
||||
// Test operations on uninitialized driver
|
||||
TEST_ASSERT(!uart_driver_send(&driver, &test_data, 1, 1000));
|
||||
TEST_ASSERT_EQUAL(-1, uart_driver_receive(&driver, rx_buffer, sizeof(rx_buffer), 100));
|
||||
TEST_ASSERT(!uart_driver_is_initialized(&driver));
|
||||
|
||||
return 1; // Test passed
|
||||
}
|
||||
|
||||
int test_uart_driver_deinit(void) {
|
||||
uart_driver_t driver;
|
||||
uart_config_t config = {
|
||||
.tx_pin = 17,
|
||||
.rx_pin = 18,
|
||||
.baud_rate = 9600,
|
||||
.data_bits = 8,
|
||||
.parity = 0,
|
||||
.stop_bits = 1
|
||||
};
|
||||
|
||||
TEST_ASSERT(uart_driver_init(&driver, &config));
|
||||
TEST_ASSERT(uart_driver_is_initialized(&driver));
|
||||
|
||||
uart_driver_deinit(&driver);
|
||||
TEST_ASSERT(!uart_driver_is_initialized(&driver));
|
||||
|
||||
return 1; // Test passed
|
||||
}
|
||||
|
||||
// Test runner
|
||||
int run_all_tests(void) {
|
||||
int passed = 0;
|
||||
int total = 0;
|
||||
|
||||
// List of test functions
|
||||
int (*tests[])(void) = {
|
||||
test_uart_driver_init_valid_config,
|
||||
test_uart_driver_init_invalid_baud_rate,
|
||||
test_uart_driver_init_invalid_data_bits,
|
||||
test_uart_driver_init_null_pointers,
|
||||
test_uart_driver_send_receive,
|
||||
test_uart_driver_send_null_data,
|
||||
test_uart_driver_receive_null_buffer,
|
||||
test_uart_driver_uninitialized_operations,
|
||||
test_uart_driver_deinit
|
||||
};
|
||||
|
||||
const char *test_names[] = {
|
||||
"test_uart_driver_init_valid_config",
|
||||
"test_uart_driver_init_invalid_baud_rate",
|
||||
"test_uart_driver_init_invalid_data_bits",
|
||||
"test_uart_driver_init_null_pointers",
|
||||
"test_uart_driver_send_receive",
|
||||
"test_uart_driver_send_null_data",
|
||||
"test_uart_driver_receive_null_buffer",
|
||||
"test_uart_driver_uninitialized_operations",
|
||||
"test_uart_driver_deinit"
|
||||
};
|
||||
|
||||
for (int i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
|
||||
total++;
|
||||
printf("Running %s...", test_names[i]);
|
||||
fflush(stdout);
|
||||
|
||||
if (tests[i]()) {
|
||||
printf(" PASSED\n");
|
||||
passed++;
|
||||
} else {
|
||||
printf(" FAILED\n");
|
||||
}
|
||||
}
|
||||
|
||||
printf("\nResults: %d/%d tests passed\n", passed, total);
|
||||
return (passed == total) ? 0 : 1;
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
return run_all_tests();
|
||||
}
|
||||
Reference in New Issue
Block a user