diff --git a/src/uart_flash.c b/src/uart_flash.c index 676ea3e2..3623c9c9 100644 --- a/src/uart_flash.c +++ b/src/uart_flash.c @@ -118,7 +118,7 @@ int ext_flash_read(uintptr_t address, uint8_t *data, int len) } for (i = 0; i < len; i++) { if (uart_rx_timeout(&data[i]) != 0) - return 0; + return -1; uart_tx(CMD_ACK); } return i; diff --git a/tools/unit-tests/Makefile b/tools/unit-tests/Makefile index 24b7ccab..62e424b2 100644 --- a/tools/unit-tests/Makefile +++ b/tools/unit-tests/Makefile @@ -44,6 +44,7 @@ endif TESTS:=unit-parser unit-fdt unit-extflash unit-string unit-spi-flash unit-aes128 \ + unit-uart-flash \ unit-aes256 unit-chacha20 unit-pci unit-mock-state unit-sectorflags \ unit-max-space \ unit-image unit-image-rsa unit-nvm unit-nvm-flagshome unit-enc-nvm \ @@ -156,6 +157,9 @@ unit-spi-flash: ../../include/target.h unit-spi-flash.c unit-qspi-flash: ../../include/target.h unit-qspi-flash.c gcc -o $@ $^ $(CFLAGS) $(LDFLAGS) +unit-uart-flash: ../../include/target.h unit-uart-flash.c ../../src/uart_flash.c + gcc -o $@ unit-uart-flash.c $(CFLAGS) $(LDFLAGS) + unit-tpm-rsa-exp: ../../include/target.h unit-tpm-rsa-exp.c ../../src/string.c gcc -o $@ $^ $(CFLAGS) -I$(WOLFBOOT_LIB_WOLFTPM) -DWOLFBOOT_TPM \ -DWOLFTPM_USER_SETTINGS -DWOLFBOOT_TPM_VERIFY -DWOLFBOOT_SIGN_RSA2048 \ diff --git a/tools/unit-tests/unit-uart-flash.c b/tools/unit-tests/unit-uart-flash.c new file mode 100644 index 00000000..12534b81 --- /dev/null +++ b/tools/unit-tests/unit-uart-flash.c @@ -0,0 +1,92 @@ +/* unit-uart-flash.c + * + * Unit tests for the UART flash transport. + */ + +#define UART_FLASH + +#include +#include +#include + +static const uint8_t CMD_ACK = 0x06; + +static uint8_t rx_script[16]; +static int rx_script_len; +static int rx_script_pos; +static uint8_t tx_log[32]; +static int tx_log_len; + +uint32_t wolfBoot_current_firmware_version(void) +{ + return 0; +} + +int uart_tx(const uint8_t c) +{ + ck_assert_int_lt(tx_log_len, (int)sizeof(tx_log)); + tx_log[tx_log_len++] = c; + return 1; +} + +int uart_rx(uint8_t *c) +{ + if (rx_script_pos >= rx_script_len) + return 0; + + *c = rx_script[rx_script_pos++]; + return 1; +} + +#include "../../src/uart_flash.c" + +static void reset_uart_script(const uint8_t *script, int len) +{ + memset(rx_script, 0, sizeof(rx_script)); + memcpy(rx_script, script, len); + rx_script_len = len; + rx_script_pos = 0; + memset(tx_log, 0, sizeof(tx_log)); + tx_log_len = 0; +} + +START_TEST(test_ext_flash_read_timeout_returns_error) +{ + uint8_t data[2] = {0}; + uint8_t script[11]; + int ret; + + memset(script, CMD_ACK, 10); + script[10] = 0x5a; + reset_uart_script(script, sizeof(script)); + + ret = ext_flash_read(0x12345678, data, sizeof(data)); + + ck_assert_int_eq(ret, -1); + ck_assert_uint_eq(data[0], 0x5a); + ck_assert_uint_eq(data[1], 0x00); +} +END_TEST + +Suite *wolfboot_suite(void) +{ + Suite *s = suite_create("wolfBoot"); + TCase *uart_flash = tcase_create("UART flash"); + + tcase_add_test(uart_flash, test_ext_flash_read_timeout_returns_error); + tcase_set_timeout(uart_flash, 20); + suite_add_tcase(s, uart_flash); + + return s; +} + +int main(void) +{ + int fails; + Suite *s = wolfboot_suite(); + SRunner *sr = srunner_create(s); + srunner_run_all(sr, CK_NORMAL); + fails = srunner_ntests_failed(sr); + srunner_free(sr); + return fails; +}