2626#include "memfault/panics/coredump_impl.h"
2727#include "memfault_self_test_private.h"
2828
29+ // Wrap this definition to prevent unused macro warning
30+ #if !MEMFAULT_DEMO_CLI_SELF_TEST_COREDUMP_STORAGE
31+ #ifndef MEMFAULT_SELF_TEST_COREDUMP_STORAGE_DISABLE_MSG
32+ #define MEMFAULT_SELF_TEST_COREDUMP_STORAGE_DISABLE_MSG \
33+ "Set MEMFAULT_DEMO_CLI_SELF_TEST_COREDUMP_STORAGE in memfault_platform_config.h"
34+ #endif // !MEMFAULT_SELF_TEST_COREDUMP_STORAGE_DISABLE_MSG
35+ #endif // !MEMFAULT_DEMO_CLI_SELF_TEST_COREDUMP_STORAGE
36+
2937#if !defined(MEMFAULT_UNITTEST_SELF_TEST )
3038
3139typedef enum {
@@ -140,9 +148,9 @@ static void prv_device_info_test_describe(uint32_t results) {
140148 }
141149
142150 MEMFAULT_LOG_ERROR ("One or more fields is invalid. Check for correct length and contents" );
143- for (uint8_t i = 0 ; i < kDeviceInfoField_Max ; i ++ ) {
151+ for (size_t i = 0 ; i < kDeviceInfoField_Max ; i ++ ) {
144152 // Check if bit cleared, cleared bits indicate an invalid field
145- if ((results & (1 << i ))) {
153+ if ((results & (1u << i ))) {
146154 MEMFAULT_LOG_ERROR ("%s invalid" , s_device_info_field_names [i ]);
147155 }
148156 }
@@ -232,7 +240,7 @@ static void prv_print_region_group_info(const char *group_name, const sMfltCored
232240 MEMFAULT_LOG_INFO ("-----------------------------" );
233241 MEMFAULT_LOG_INFO ("%10s|%10s|%6s|" , "Address" , "Length" , "Type" );
234242 MEMFAULT_LOG_INFO ("-----------------------------" );
235- for (size_t i = 0 ; i < num_regions ; i ++ ) {
243+ for (size_t i = 0 ; ( regions != NULL ) && ( i < num_regions ) ; i ++ ) {
236244 sMfltCoredumpRegion region = regions [i ];
237245 MEMFAULT_LOG_INFO ("0x%08" PRIxPTR "|%10" PRIu32 "|%6u|" , (uintptr_t )region .region_start ,
238246 region .region_size , region .type );
@@ -378,6 +386,42 @@ uint32_t memfault_self_test_time_test(void) {
378386 return result ;
379387}
380388
389+ uint32_t memfault_self_test_coredump_storage_capacity_test (void ) {
390+ MEMFAULT_SELF_TEST_PRINT_HEADER ("Coredump Storage Capacity Test" );
391+ bool result = memfault_coredump_storage_check_size ();
392+ MEMFAULT_LOG_INFO (MEMFAULT_SELF_TEST_END_OUTPUT );
393+ return result ? 0 : 1 ;
394+ }
395+
396+ uint32_t memfault_self_test_coredump_storage_test (void ) {
397+ MEMFAULT_SELF_TEST_PRINT_HEADER ("Coredump Storage Test" );
398+
399+ if (memfault_coredump_has_valid_coredump (NULL )) {
400+ MEMFAULT_LOG_ERROR ("Aborting test, valid coredump present" );
401+ MEMFAULT_LOG_INFO (MEMFAULT_SELF_TEST_END_OUTPUT );
402+ return (1 << 0 );
403+ }
404+
405+ // Wrap test with calls to disable/enable irqs to allow test to run uninterrupted
406+ // Abort if we cannot disable irqs
407+ bool irqs_disabled = memfault_self_test_platform_disable_irqs ();
408+ if (!irqs_disabled ) {
409+ MEMFAULT_LOG_ERROR ("Aborting test, could not disable interrupts" );
410+ MEMFAULT_LOG_INFO (MEMFAULT_SELF_TEST_END_OUTPUT );
411+ return (1 << 1 );
412+ }
413+
414+ memfault_coredump_storage_debug_test_begin ();
415+ if (!memfault_self_test_platform_enable_irqs ()) {
416+ MEMFAULT_LOG_WARN ("Failed to enable interrupts after test completed" );
417+ }
418+
419+ bool result = memfault_coredump_storage_debug_test_finish ();
420+
421+ MEMFAULT_LOG_INFO (MEMFAULT_SELF_TEST_END_OUTPUT );
422+ return result ? 0 : (1 << 2 );
423+ }
424+
381425#endif // defined(MEMFAULT_UNITTEST_SELF_TEST)
382426
383427int memfault_self_test_run (uint32_t run_flags ) {
@@ -403,5 +447,17 @@ int memfault_self_test_run(uint32_t run_flags) {
403447 if (run_flags & kMemfaultSelfTestFlag_PlatformTime ) {
404448 result |= memfault_self_test_time_test ();
405449 }
450+ if (run_flags & kMemfaultSelfTestFlag_CoredumpStorage ) {
451+ #if MEMFAULT_DEMO_CLI_SELF_TEST_COREDUMP_STORAGE
452+ result |= memfault_self_test_coredump_storage_test ();
453+ #else
454+ MEMFAULT_LOG_ERROR ("Coredump storage test not enabled" );
455+ MEMFAULT_LOG_ERROR (MEMFAULT_SELF_TEST_COREDUMP_STORAGE_DISABLE_MSG );
456+ result = 1 ;
457+ #endif
458+ }
459+ if (run_flags & kMemfaultSelfTestFlag_CoredumpStorageCapacity ) {
460+ result |= memfault_self_test_coredump_storage_capacity_test ();
461+ }
406462 return (result == 0 ) ? 0 : 1 ;
407463}
0 commit comments