diff --git a/readme.txt b/readme.txt index 86f79b1c0..6f0d16be2 100644 --- a/readme.txt +++ b/readme.txt @@ -79,10 +79,10 @@ using _sbrk_r() does not contain "holes" caused by other allocators. - LIB: Modified core allocator to be able to get blocks starting from bottom or top of the available memory range. - Removed alignment enforcements for requested block size. Alignment is + Removed alignment enforcement for requested block size. Alignment is only ensured on the returned pointer, this should reduce memory usage is some cases. -- HAL: Added a new interface for rangefinder devices (used by EX). +- HAL: Added a new interface for range-finder devices (used by EX). - HAL: Added mcuconf.h updater tool for STM32F407 (backported to 19.1.1). - NIL: Integrated NIL 4.0. - FIX: Fixed uninitialized variables in STM32 DMA drivers (bug #1010) diff --git a/test/nil/configuration.xml b/test/nil/configuration.xml index 7cee31a3f..2229458d7 100644 --- a/test/nil/configuration.xml +++ b/test/nil/configuration.xml @@ -272,47 +272,8 @@ test_println(""); test_print("--- CH_CFG_USE_EVENTS: "); test_printn(CH_CFG_USE_EVENTS); test_println(""); -test_print("--- CH_CFG_USE_MAILBOXES: "); -test_printn(CH_CFG_USE_MAILBOXES); -test_println(""); -test_print("--- CH_CFG_USE_MEMCORE: "); -test_printn(CH_CFG_USE_MEMCORE); -test_println(""); -test_print("--- CH_CFG_USE_HEAP: "); -test_printn(CH_CFG_USE_HEAP); -test_println(""); -test_print("--- CH_CFG_USE_MEMPOOLS: "); -test_printn(CH_CFG_USE_MEMPOOLS); -test_println(""); -test_print("--- CH_CFG_USE_OBJ_FIFOS: "); -test_printn(CH_CFG_USE_OBJ_FIFOS); -test_println(""); -test_print("--- CH_CFG_MEMCORE_SIZE: "); -test_printn(CH_CFG_MEMCORE_SIZE); -test_println(""); -test_print("--- CH_CFG_USE_FACTORY: "); -test_printn(CH_CFG_USE_FACTORY); -test_println(""); -test_print("--- CH_CFG_FACTORY_MAX_NAMES_LENGTH: "); -test_printn(CH_CFG_FACTORY_MAX_NAMES_LENGTH); -test_println(""); -test_print("--- CH_CFG_FACTORY_OBJECTS_REGISTRY: "); -test_printn(CH_CFG_FACTORY_OBJECTS_REGISTRY); -test_println(""); -test_print("--- CH_CFG_FACTORY_GENERIC_BUFFERS: "); -test_printn(CH_CFG_FACTORY_GENERIC_BUFFERS); -test_println(""); -test_print("--- CH_CFG_FACTORY_SEMAPHORES: "); -test_printn(CH_CFG_FACTORY_SEMAPHORES); -test_println(""); -test_print("--- CH_CFG_FACTORY_MAILBOXES: "); -test_printn(CH_CFG_FACTORY_MAILBOXES); -test_println(""); -test_print("--- CH_CFG_FACTORY_OBJ_FIFOS: "); -test_printn(CH_CFG_FACTORY_OBJ_FIFOS); -test_println(""); -test_print("--- CH_CFG_USE_PIPES: "); -test_printn(CH_CFG_USE_PIPES); +test_print("--- CH_CFG_USE_MESSAGES: "); +test_printn(CH_CFG_USE_MESSAGES); test_println(""); test_print("--- CH_DBG_STATISTICS: "); test_printn(CH_DBG_STATISTICS); diff --git a/test/nil/source/test/nil_test_sequence_001.c b/test/nil/source/test/nil_test_sequence_001.c index fd95f43b1..130474579 100644 --- a/test/nil/source/test/nil_test_sequence_001.c +++ b/test/nil/source/test/nil_test_sequence_001.c @@ -187,47 +187,8 @@ static void nil_test_001_003_execute(void) { test_print("--- CH_CFG_USE_EVENTS: "); test_printn(CH_CFG_USE_EVENTS); test_println(""); - test_print("--- CH_CFG_USE_MAILBOXES: "); - test_printn(CH_CFG_USE_MAILBOXES); - test_println(""); - test_print("--- CH_CFG_USE_MEMCORE: "); - test_printn(CH_CFG_USE_MEMCORE); - test_println(""); - test_print("--- CH_CFG_USE_HEAP: "); - test_printn(CH_CFG_USE_HEAP); - test_println(""); - test_print("--- CH_CFG_USE_MEMPOOLS: "); - test_printn(CH_CFG_USE_MEMPOOLS); - test_println(""); - test_print("--- CH_CFG_USE_OBJ_FIFOS: "); - test_printn(CH_CFG_USE_OBJ_FIFOS); - test_println(""); - test_print("--- CH_CFG_MEMCORE_SIZE: "); - test_printn(CH_CFG_MEMCORE_SIZE); - test_println(""); - test_print("--- CH_CFG_USE_FACTORY: "); - test_printn(CH_CFG_USE_FACTORY); - test_println(""); - test_print("--- CH_CFG_FACTORY_MAX_NAMES_LENGTH: "); - test_printn(CH_CFG_FACTORY_MAX_NAMES_LENGTH); - test_println(""); - test_print("--- CH_CFG_FACTORY_OBJECTS_REGISTRY: "); - test_printn(CH_CFG_FACTORY_OBJECTS_REGISTRY); - test_println(""); - test_print("--- CH_CFG_FACTORY_GENERIC_BUFFERS: "); - test_printn(CH_CFG_FACTORY_GENERIC_BUFFERS); - test_println(""); - test_print("--- CH_CFG_FACTORY_SEMAPHORES: "); - test_printn(CH_CFG_FACTORY_SEMAPHORES); - test_println(""); - test_print("--- CH_CFG_FACTORY_MAILBOXES: "); - test_printn(CH_CFG_FACTORY_MAILBOXES); - test_println(""); - test_print("--- CH_CFG_FACTORY_OBJ_FIFOS: "); - test_printn(CH_CFG_FACTORY_OBJ_FIFOS); - test_println(""); - test_print("--- CH_CFG_USE_PIPES: "); - test_printn(CH_CFG_USE_PIPES); + test_print("--- CH_CFG_USE_MESSAGES: "); + test_printn(CH_CFG_USE_MESSAGES); test_println(""); test_print("--- CH_DBG_STATISTICS: "); test_printn(CH_DBG_STATISTICS); diff --git a/test/oslib/configuration.xml b/test/oslib/configuration.xml index bf35034d8..7f907c531 100644 --- a/test/oslib/configuration.xml +++ b/test/oslib/configuration.xml @@ -45,6 +45,213 @@ + + + Internal Tests + + + Information. + + + This sequence reports configuration and version information about the OS library. + + + + + + + + + + + Port Info. + + + Port-related info are reported. + + + + + + + + + + + + + + + + + + + Prints the version string. + + + + + + + + + + + + + OS Library Info. + + + The version numbers are reported. + + + + + + + + + + + + + + + + + + + Prints the version string. + + + + + + + + + + + + + OS Library Settings. + + + The static OS Library settings are reported. + + + + + + + + + + + + + + + + + + + Prints the configuration options settings. + + + + + + + + + + + + Internal Tests diff --git a/test/oslib/oslib_test.mk b/test/oslib/oslib_test.mk index d4d863f36..cf085f10d 100644 --- a/test/oslib/oslib_test.mk +++ b/test/oslib/oslib_test.mk @@ -4,7 +4,8 @@ TESTSRC += ${CHIBIOS}/test/oslib/source/test/oslib_test_root.c \ ${CHIBIOS}/test/oslib/source/test/oslib_test_sequence_002.c \ ${CHIBIOS}/test/oslib/source/test/oslib_test_sequence_003.c \ ${CHIBIOS}/test/oslib/source/test/oslib_test_sequence_004.c \ - ${CHIBIOS}/test/oslib/source/test/oslib_test_sequence_005.c + ${CHIBIOS}/test/oslib/source/test/oslib_test_sequence_005.c \ + ${CHIBIOS}/test/oslib/source/test/oslib_test_sequence_006.c # Required include directories TESTINC += ${CHIBIOS}/test/oslib/source/test diff --git a/test/oslib/source/test/oslib_test_root.c b/test/oslib/source/test/oslib_test_root.c index 9f65ccc68..e167e29a0 100644 --- a/test/oslib/source/test/oslib_test_root.c +++ b/test/oslib/source/test/oslib_test_root.c @@ -26,6 +26,7 @@ * - @subpage oslib_test_sequence_003 * - @subpage oslib_test_sequence_004 * - @subpage oslib_test_sequence_005 + * - @subpage oslib_test_sequence_006 * . */ @@ -47,20 +48,21 @@ * @brief Array of test sequences. */ const testsequence_t * const oslib_test_suite_array[] = { -#if (CH_CFG_USE_MAILBOXES) || defined(__DOXYGEN__) &oslib_test_sequence_001, -#endif -#if (CH_CFG_USE_PIPES) || defined(__DOXYGEN__) +#if (CH_CFG_USE_MAILBOXES) || defined(__DOXYGEN__) &oslib_test_sequence_002, #endif -#if (CH_CFG_USE_MEMPOOLS) || defined(__DOXYGEN__) +#if (CH_CFG_USE_PIPES) || defined(__DOXYGEN__) &oslib_test_sequence_003, #endif -#if (CH_CFG_USE_HEAP) || defined(__DOXYGEN__) +#if (CH_CFG_USE_MEMPOOLS) || defined(__DOXYGEN__) &oslib_test_sequence_004, #endif -#if ((CH_CFG_USE_FACTORY == TRUE) && (CH_CFG_USE_MEMPOOLS == TRUE) && (CH_CFG_USE_HEAP == TRUE)) || defined(__DOXYGEN__) +#if (CH_CFG_USE_HEAP) || defined(__DOXYGEN__) &oslib_test_sequence_005, +#endif +#if ((CH_CFG_USE_FACTORY == TRUE) && (CH_CFG_USE_MEMPOOLS == TRUE) && (CH_CFG_USE_HEAP == TRUE)) || defined(__DOXYGEN__) + &oslib_test_sequence_006, #endif NULL }; diff --git a/test/oslib/source/test/oslib_test_root.h b/test/oslib/source/test/oslib_test_root.h index 01b6eefe9..b81cb93d1 100644 --- a/test/oslib/source/test/oslib_test_root.h +++ b/test/oslib/source/test/oslib_test_root.h @@ -29,6 +29,7 @@ #include "oslib_test_sequence_003.h" #include "oslib_test_sequence_004.h" #include "oslib_test_sequence_005.h" +#include "oslib_test_sequence_006.h" #if !defined(__DOXYGEN__) diff --git a/test/oslib/source/test/oslib_test_sequence_001.c b/test/oslib/source/test/oslib_test_sequence_001.c index 076efa102..334218e71 100644 --- a/test/oslib/source/test/oslib_test_sequence_001.c +++ b/test/oslib/source/test/oslib_test_sequence_001.c @@ -21,19 +21,13 @@ * @file oslib_test_sequence_001.c * @brief Test Sequence 001 code. * - * @page oslib_test_sequence_001 [1] Mailboxes + * @page oslib_test_sequence_001 [1] Information * * File: @ref oslib_test_sequence_001.c * *

Description

- * This sequence tests the ChibiOS library functionalities related to - * mailboxes. - * - *

Conditions

- * This sequence is only executed if the following preprocessor condition - * evaluates to true: - * - CH_CFG_USE_MAILBOXES - * . + * This sequence reports configuration and version information about + * the OS library. * *

Test Cases

* - @subpage oslib_test_001_001 @@ -42,352 +36,176 @@ * . */ -#if (CH_CFG_USE_MAILBOXES) || defined(__DOXYGEN__) - /**************************************************************************** * Shared code. ****************************************************************************/ -#define MB_SIZE 4 - -static msg_t mb_buffer[MB_SIZE]; -static MAILBOX_DECL(mb1, mb_buffer, MB_SIZE); +#include "ch.h" /**************************************************************************** * Test cases. ****************************************************************************/ /** - * @page oslib_test_001_001 [1.1] Mailbox normal API, non-blocking tests + * @page oslib_test_001_001 [1.1] Port Info * *

Description

- * The mailbox normal API is tested without triggering blocking - * conditions. + * Port-related info are reported. * *

Test Steps

- * - [1.1.1] Testing the mailbox size. - * - [1.1.2] Resetting the mailbox, conditions are checked, no errors - * expected. - * - [1.1.3] Testing the behavior of API when the mailbox is in reset - * state then return in active state. - * - [1.1.4] Filling the mailbox using chMBPostTimeout() and - * chMBPostAheadTimeout() once, no errors expected. - * - [1.1.5] Testing intermediate conditions. Data pointers must be - * aligned, semaphore counters are checked. - * - [1.1.6] Emptying the mailbox using chMBFetchTimeout(), no errors - * expected. - * - [1.1.7] Posting and then fetching one more message, no errors - * expected. - * - [1.1.8] Testing final conditions. Data pointers must be aligned to - * buffer start, semaphore counters are checked. + * - [1.1.1] Prints the version string. * . */ -static void oslib_test_001_001_setup(void) { - chMBObjectInit(&mb1, mb_buffer, MB_SIZE); -} - -static void oslib_test_001_001_teardown(void) { - chMBReset(&mb1); -} - static void oslib_test_001_001_execute(void) { - msg_t msg1, msg2; - unsigned i; - /* [1.1.1] Testing the mailbox size.*/ + /* [1.1.1] Prints the version string.*/ test_set_step(1); { - test_assert_lock(chMBGetFreeCountI(&mb1) == MB_SIZE, "wrong size"); - } - - /* [1.1.2] Resetting the mailbox, conditions are checked, no errors - expected.*/ - test_set_step(2); - { - chMBReset(&mb1); - test_assert_lock(chMBGetFreeCountI(&mb1) == MB_SIZE, "not empty"); - test_assert_lock(chMBGetUsedCountI(&mb1) == 0, "still full"); - test_assert_lock(mb1.buffer == mb1.wrptr, "write pointer not aligned to base"); - test_assert_lock(mb1.buffer == mb1.rdptr, "read pointer not aligned to base"); - } - - /* [1.1.3] Testing the behavior of API when the mailbox is in reset - state then return in active state.*/ - test_set_step(3); - { - msg1 = chMBPostTimeout(&mb1, (msg_t)0, TIME_INFINITE); - test_assert(msg1 == MSG_RESET, "not in reset state"); - msg1 = chMBPostAheadTimeout(&mb1, (msg_t)0, TIME_INFINITE); - test_assert(msg1 == MSG_RESET, "not in reset state"); - msg1 = chMBFetchTimeout(&mb1, &msg2, TIME_INFINITE); - test_assert(msg1 == MSG_RESET, "not in reset state"); - chMBResumeX(&mb1); - } - - /* [1.1.4] Filling the mailbox using chMBPostTimeout() and - chMBPostAheadTimeout() once, no errors expected.*/ - test_set_step(4); - { - for (i = 0; i < MB_SIZE - 1; i++) { - msg1 = chMBPostTimeout(&mb1, 'B' + i, TIME_INFINITE); - test_assert(msg1 == MSG_OK, "wrong wake-up message"); - } - msg1 = chMBPostAheadTimeout(&mb1, 'A', TIME_INFINITE); - test_assert(msg1 == MSG_OK, "wrong wake-up message"); - } - - /* [1.1.5] Testing intermediate conditions. Data pointers must be - aligned, semaphore counters are checked.*/ - test_set_step(5); - { - test_assert_lock(chMBGetFreeCountI(&mb1) == 0, "still empty"); - test_assert_lock(chMBGetUsedCountI(&mb1) == MB_SIZE, "not full"); - test_assert_lock(mb1.rdptr == mb1.wrptr, "pointers not aligned"); - } - - /* [1.1.6] Emptying the mailbox using chMBFetchTimeout(), no errors - expected.*/ - test_set_step(6); - { - for (i = 0; i < MB_SIZE; i++) { - msg1 = chMBFetchTimeout(&mb1, &msg2, TIME_INFINITE); - test_assert(msg1 == MSG_OK, "wrong wake-up message"); - test_emit_token(msg2); - } - test_assert_sequence("ABCD", "wrong get sequence"); - } - - /* [1.1.7] Posting and then fetching one more message, no errors - expected.*/ - test_set_step(7); - { - msg1 = chMBPostTimeout(&mb1, 'B' + i, TIME_INFINITE); - test_assert(msg1 == MSG_OK, "wrong wake-up message"); - msg1 = chMBFetchTimeout(&mb1, &msg2, TIME_INFINITE); - test_assert(msg1 == MSG_OK, "wrong wake-up message"); - } - - /* [1.1.8] Testing final conditions. Data pointers must be aligned to - buffer start, semaphore counters are checked.*/ - test_set_step(8); - { - test_assert_lock(chMBGetFreeCountI(&mb1) == MB_SIZE, "not empty"); - test_assert_lock(chMBGetUsedCountI(&mb1) == 0, "still full"); - test_assert(mb1.buffer == mb1.wrptr, "write pointer not aligned to base"); - test_assert(mb1.buffer == mb1.rdptr, "read pointer not aligned to base"); +#if defined(PORT_ARCHITECTURE_NAME) + test_print("--- Architecture: "); + test_println(PORT_ARCHITECTURE_NAME); +#endif +#if defined(PORT_CORE_VARIANT_NAME) + test_print("--- Core Variant: "); + test_println(PORT_CORE_VARIANT_NAME); +#endif +#if defined(PORT_COMPILER_NAME) + test_print("--- Compiler: "); + test_println(PORT_COMPILER_NAME); +#endif +#if defined(PORT_INFO) + test_print("--- Port Info: "); + test_println(PORT_INFO); +#endif +#if defined(PORT_NATURAL_ALIGN) + test_print("--- Natural alignment: "); + test_printn(PORT_NATURAL_ALIGN); + test_println(""); +#endif +#if defined(PORT_STACK_ALIGN) + test_print("--- Stack alignment: "); + test_printn(PORT_STACK_ALIGN); + test_println(""); +#endif +#if defined(PORT_WORKING_AREA_ALIGN) + test_print("--- Working area alignment: "); + test_printn(PORT_WORKING_AREA_ALIGN); + test_println(""); +#endif } } static const testcase_t oslib_test_001_001 = { - "Mailbox normal API, non-blocking tests", - oslib_test_001_001_setup, - oslib_test_001_001_teardown, + "Port Info", + NULL, + NULL, oslib_test_001_001_execute }; /** - * @page oslib_test_001_002 [1.2] Mailbox I-Class API, non-blocking tests + * @page oslib_test_001_002 [1.2] OS Library Info * *

Description

- * The mailbox I-Class API is tested without triggering blocking - * conditions. + * The version numbers are reported. * *

Test Steps

- * - [1.2.1] Testing the mailbox size. - * - [1.2.2] Resetting the mailbox, conditions are checked, no errors - * expected. The mailbox is then returned in active state. - * - [1.2.3] Filling the mailbox using chMBPostI() and chMBPostAheadI() - * once, no errors expected. - * - [1.2.4] Testing intermediate conditions. Data pointers must be - * aligned, semaphore counters are checked. - * - [1.2.5] Emptying the mailbox using chMBFetchI(), no errors - * expected. - * - [1.2.6] Posting and then fetching one more message, no errors - * expected. - * - [1.2.7] Testing final conditions. Data pointers must be aligned to - * buffer start, semaphore counters are checked. + * - [1.2.1] Prints the version string. * . */ -static void oslib_test_001_002_setup(void) { - chMBObjectInit(&mb1, mb_buffer, MB_SIZE); -} - -static void oslib_test_001_002_teardown(void) { - chMBReset(&mb1); -} - static void oslib_test_001_002_execute(void) { - msg_t msg1, msg2; - unsigned i; - /* [1.2.1] Testing the mailbox size.*/ + /* [1.2.1] Prints the version string.*/ test_set_step(1); { - test_assert_lock(chMBGetFreeCountI(&mb1) == MB_SIZE, "wrong size"); - } - - /* [1.2.2] Resetting the mailbox, conditions are checked, no errors - expected. The mailbox is then returned in active state.*/ - test_set_step(2); - { - chSysLock(); - chMBResetI(&mb1); - chSysUnlock(); - test_assert_lock(chMBGetFreeCountI(&mb1) == MB_SIZE, "not empty"); - test_assert_lock(chMBGetUsedCountI(&mb1) == 0, "still full"); - test_assert_lock(mb1.buffer == mb1.wrptr, "write pointer not aligned to base"); - test_assert_lock(mb1.buffer == mb1.rdptr, "read pointer not aligned to base"); - chMBResumeX(&mb1); - } - - /* [1.2.3] Filling the mailbox using chMBPostI() and chMBPostAheadI() - once, no errors expected.*/ - test_set_step(3); - { - for (i = 0; i < MB_SIZE - 1; i++) { - chSysLock(); - msg1 = chMBPostI(&mb1, 'B' + i); - chSysUnlock(); - test_assert(msg1 == MSG_OK, "wrong wake-up message"); - } - chSysLock(); - msg1 = chMBPostAheadI(&mb1, 'A'); - chSysUnlock(); - test_assert(msg1 == MSG_OK, "wrong wake-up message"); - } - - /* [1.2.4] Testing intermediate conditions. Data pointers must be - aligned, semaphore counters are checked.*/ - test_set_step(4); - { - test_assert_lock(chMBGetFreeCountI(&mb1) == 0, "still empty"); - test_assert_lock(chMBGetUsedCountI(&mb1) == MB_SIZE, "not full"); - test_assert_lock(mb1.rdptr == mb1.wrptr, "pointers not aligned"); - } - - /* [1.2.5] Emptying the mailbox using chMBFetchI(), no errors - expected.*/ - test_set_step(5); - { - for (i = 0; i < MB_SIZE; i++) { - chSysLock(); - msg1 = chMBFetchI(&mb1, &msg2); - chSysUnlock(); - test_assert(msg1 == MSG_OK, "wrong wake-up message"); - test_emit_token(msg2); - } - test_assert_sequence("ABCD", "wrong get sequence"); - } - - /* [1.2.6] Posting and then fetching one more message, no errors - expected.*/ - test_set_step(6); - { - msg1 = chMBPostTimeout(&mb1, 'B' + i, TIME_INFINITE); - test_assert(msg1 == MSG_OK, "wrong wake-up message"); - msg1 = chMBFetchTimeout(&mb1, &msg2, TIME_INFINITE); - test_assert(msg1 == MSG_OK, "wrong wake-up message"); - } - - /* [1.2.7] Testing final conditions. Data pointers must be aligned to - buffer start, semaphore counters are checked.*/ - test_set_step(7); - { - test_assert_lock(chMBGetFreeCountI(&mb1) == MB_SIZE, "not empty"); - test_assert_lock(chMBGetUsedCountI(&mb1) == 0, "still full"); - test_assert(mb1.buffer == mb1.wrptr, "write pointer not aligned to base"); - test_assert(mb1.buffer == mb1.rdptr, "read pointer not aligned to base"); + test_println("--- Product: ChibiOS/LIB"); + test_print("--- Stable Flag: "); + test_printn(CH_OSLIB_STABLE); + test_println(""); + test_print("--- Version String: "); + test_println(CH_OSLIB_VERSION); + test_print("--- Major Number: "); + test_printn(CH_OSLIB_MAJOR); + test_println(""); + test_print("--- Minor Number: "); + test_printn(CH_OSLIB_MINOR); + test_println(""); + test_print("--- Patch Number: "); + test_printn(CH_OSLIB_PATCH); + test_println(""); } } static const testcase_t oslib_test_001_002 = { - "Mailbox I-Class API, non-blocking tests", - oslib_test_001_002_setup, - oslib_test_001_002_teardown, + "OS Library Info", + NULL, + NULL, oslib_test_001_002_execute }; /** - * @page oslib_test_001_003 [1.3] Mailbox timeouts + * @page oslib_test_001_003 [1.3] OS Library Settings * *

Description

- * The mailbox API is tested for timeouts. + * The static OS Library settings are reported. * *

Test Steps

- * - [1.3.1] Filling the mailbox. - * - [1.3.2] Testing chMBPostTimeout(), chMBPostI(), - * chMBPostAheadTimeout() and chMBPostAheadI() timeout. - * - [1.3.3] Resetting the mailbox. The mailbox is then returned in - * active state. - * - [1.3.4] Testing chMBFetchTimeout() and chMBFetchI() timeout. + * - [1.3.1] Prints the configuration options settings. * . */ -static void oslib_test_001_003_setup(void) { - chMBObjectInit(&mb1, mb_buffer, MB_SIZE); -} - -static void oslib_test_001_003_teardown(void) { - chMBReset(&mb1); -} - static void oslib_test_001_003_execute(void) { - msg_t msg1, msg2; - unsigned i; - /* [1.3.1] Filling the mailbox.*/ + /* [1.3.1] Prints the configuration options settings.*/ test_set_step(1); { - for (i = 0; i < MB_SIZE; i++) { - msg1 = chMBPostTimeout(&mb1, 'B' + i, TIME_INFINITE); - test_assert(msg1 == MSG_OK, "wrong wake-up message"); - } - } - - /* [1.3.2] Testing chMBPostTimeout(), chMBPostI(), - chMBPostAheadTimeout() and chMBPostAheadI() timeout.*/ - test_set_step(2); - { - msg1 = chMBPostTimeout(&mb1, 'X', 1); - test_assert(msg1 == MSG_TIMEOUT, "wrong wake-up message"); - chSysLock(); - msg1 = chMBPostI(&mb1, 'X'); - chSysUnlock(); - test_assert(msg1 == MSG_TIMEOUT, "wrong wake-up message"); - msg1 = chMBPostAheadTimeout(&mb1, 'X', 1); - test_assert(msg1 == MSG_TIMEOUT, "wrong wake-up message"); - chSysLock(); - msg1 = chMBPostAheadI(&mb1, 'X'); - chSysUnlock(); - test_assert(msg1 == MSG_TIMEOUT, "wrong wake-up message"); - } - - /* [1.3.3] Resetting the mailbox. The mailbox is then returned in - active state.*/ - test_set_step(3); - { - chMBReset(&mb1); - chMBResumeX(&mb1); - } - - /* [1.3.4] Testing chMBFetchTimeout() and chMBFetchI() timeout.*/ - test_set_step(4); - { - msg1 = chMBFetchTimeout(&mb1, &msg2, 1); - test_assert(msg1 == MSG_TIMEOUT, "wrong wake-up message"); - chSysLock(); - msg1 = chMBFetchI(&mb1, &msg2); - chSysUnlock(); - test_assert(msg1 == MSG_TIMEOUT, "wrong wake-up message"); + test_print("--- CH_CFG_USE_MEMCORE: "); + test_printn(CH_CFG_USE_MEMCORE); + test_println(""); + test_print("--- CH_CFG_USE_HEAP: "); + test_printn(CH_CFG_USE_HEAP); + test_println(""); + test_print("--- CH_CFG_USE_MEMPOOLS: "); + test_printn(CH_CFG_USE_MEMPOOLS); + test_println(""); + test_print("--- CH_CFG_USE_OBJ_FIFOS: "); + test_printn(CH_CFG_USE_OBJ_FIFOS); + test_println(""); + test_print("--- CH_CFG_USE_PIPES: "); + test_printn(CH_CFG_USE_PIPES); + test_println(""); + test_print("--- CH_CFG_USE_FACTORY: "); + test_printn(CH_CFG_USE_FACTORY); + test_println(""); + test_print("--- CH_CFG_FACTORY_MAX_NAMES_LENGTH: "); + test_printn(CH_CFG_FACTORY_MAX_NAMES_LENGTH); + test_println(""); + test_print("--- CH_CFG_FACTORY_OBJECTS_REGISTRY: "); + test_printn(CH_CFG_FACTORY_OBJECTS_REGISTRY); + test_println(""); + test_print("--- CH_CFG_FACTORY_GENERIC_BUFFERS: "); + test_printn(CH_CFG_FACTORY_GENERIC_BUFFERS); + test_println(""); + test_print("--- CH_CFG_FACTORY_SEMAPHORES: "); + test_printn(CH_CFG_FACTORY_SEMAPHORES); + test_println(""); + test_print("--- CH_CFG_FACTORY_MAILBOXES: "); + test_printn(CH_CFG_FACTORY_MAILBOXES); + test_println(""); + test_print("--- CH_CFG_FACTORY_OBJ_FIFOS: "); + test_printn(CH_CFG_FACTORY_OBJ_FIFOS); + test_println(""); + test_print("--- CH_CFG_FACTORY_PIPES: "); + test_printn(CH_CFG_FACTORY_PIPES); + test_println(""); } } static const testcase_t oslib_test_001_003 = { - "Mailbox timeouts", - oslib_test_001_003_setup, - oslib_test_001_003_teardown, + "OS Library Settings", + NULL, + NULL, oslib_test_001_003_execute }; @@ -406,11 +224,9 @@ const testcase_t * const oslib_test_sequence_001_array[] = { }; /** - * @brief Mailboxes. + * @brief Information. */ const testsequence_t oslib_test_sequence_001 = { - "Mailboxes", + "Information", oslib_test_sequence_001_array }; - -#endif /* CH_CFG_USE_MAILBOXES */ diff --git a/test/oslib/source/test/oslib_test_sequence_002.c b/test/oslib/source/test/oslib_test_sequence_002.c index 18af59335..832a7a5ab 100644 --- a/test/oslib/source/test/oslib_test_sequence_002.c +++ b/test/oslib/source/test/oslib_test_sequence_002.c @@ -21,325 +21,376 @@ * @file oslib_test_sequence_002.c * @brief Test Sequence 002 code. * - * @page oslib_test_sequence_002 [2] Pipes + * @page oslib_test_sequence_002 [2] Mailboxes * * File: @ref oslib_test_sequence_002.c * *

Description

* This sequence tests the ChibiOS library functionalities related to - * pipes. + * mailboxes. * *

Conditions

* This sequence is only executed if the following preprocessor condition * evaluates to true: - * - CH_CFG_USE_PIPES + * - CH_CFG_USE_MAILBOXES * . * *

Test Cases

* - @subpage oslib_test_002_001 * - @subpage oslib_test_002_002 + * - @subpage oslib_test_002_003 * . */ -#if (CH_CFG_USE_PIPES) || defined(__DOXYGEN__) +#if (CH_CFG_USE_MAILBOXES) || defined(__DOXYGEN__) /**************************************************************************** * Shared code. ****************************************************************************/ -#include +#define MB_SIZE 4 -#define PIPE_SIZE 16 - -static uint8_t buffer[PIPE_SIZE]; -static PIPE_DECL(pipe1, buffer, PIPE_SIZE); - -static const uint8_t pipe_pattern[] = "0123456789ABCDEF"; +static msg_t mb_buffer[MB_SIZE]; +static MAILBOX_DECL(mb1, mb_buffer, MB_SIZE); /**************************************************************************** * Test cases. ****************************************************************************/ /** - * @page oslib_test_002_001 [2.1] Pipes normal API, non-blocking tests + * @page oslib_test_002_001 [2.1] Mailbox normal API, non-blocking tests * *

Description

- * The pipe functionality is tested by loading and emptying it, all - * conditions are tested. + * The mailbox normal API is tested without triggering blocking + * conditions. * *

Test Steps

- * - [2.1.1] Resetting pipe. - * - [2.1.2] Writing data, must fail. - * - [2.1.3] Reading data, must fail. - * - [2.1.4] Reactivating pipe. - * - [2.1.5] Filling whole pipe. - * - [2.1.6] Emptying pipe. - * - [2.1.7] Small write. - * - [2.1.8] Filling remaining space. - * - [2.1.9] Small Read. - * - [2.1.10] Reading remaining data. - * - [2.1.11] Small Write. - * - [2.1.12] Small Read. - * - [2.1.13] Write wrapping buffer boundary. - * - [2.1.14] Read wrapping buffer boundary. + * - [2.1.1] Testing the mailbox size. + * - [2.1.2] Resetting the mailbox, conditions are checked, no errors + * expected. + * - [2.1.3] Testing the behavior of API when the mailbox is in reset + * state then return in active state. + * - [2.1.4] Filling the mailbox using chMBPostTimeout() and + * chMBPostAheadTimeout() once, no errors expected. + * - [2.1.5] Testing intermediate conditions. Data pointers must be + * aligned, semaphore counters are checked. + * - [2.1.6] Emptying the mailbox using chMBFetchTimeout(), no errors + * expected. + * - [2.1.7] Posting and then fetching one more message, no errors + * expected. + * - [2.1.8] Testing final conditions. Data pointers must be aligned to + * buffer start, semaphore counters are checked. * . */ static void oslib_test_002_001_setup(void) { - chPipeObjectInit(&pipe1, buffer, PIPE_SIZE); + chMBObjectInit(&mb1, mb_buffer, MB_SIZE); +} + +static void oslib_test_002_001_teardown(void) { + chMBReset(&mb1); } static void oslib_test_002_001_execute(void) { + msg_t msg1, msg2; + unsigned i; - /* [2.1.1] Resetting pipe.*/ + /* [2.1.1] Testing the mailbox size.*/ test_set_step(1); { - chPipeReset(&pipe1); - - test_assert((pipe1.rdptr == pipe1.buffer) && - (pipe1.wrptr == pipe1.buffer) && - (pipe1.cnt == 0), - "invalid pipe state"); + test_assert_lock(chMBGetFreeCountI(&mb1) == MB_SIZE, "wrong size"); } - /* [2.1.2] Writing data, must fail.*/ + /* [2.1.2] Resetting the mailbox, conditions are checked, no errors + expected.*/ test_set_step(2); { - size_t n; - - n = chPipeWriteTimeout(&pipe1, pipe_pattern, PIPE_SIZE, TIME_IMMEDIATE); - test_assert(n == 0, "not reset"); - test_assert((pipe1.rdptr == pipe1.buffer) && - (pipe1.wrptr == pipe1.buffer) && - (pipe1.cnt == 0), - "invalid pipe state"); + chMBReset(&mb1); + test_assert_lock(chMBGetFreeCountI(&mb1) == MB_SIZE, "not empty"); + test_assert_lock(chMBGetUsedCountI(&mb1) == 0, "still full"); + test_assert_lock(mb1.buffer == mb1.wrptr, "write pointer not aligned to base"); + test_assert_lock(mb1.buffer == mb1.rdptr, "read pointer not aligned to base"); } - /* [2.1.3] Reading data, must fail.*/ + /* [2.1.3] Testing the behavior of API when the mailbox is in reset + state then return in active state.*/ test_set_step(3); { - size_t n; - uint8_t buf[PIPE_SIZE]; - - n = chPipeReadTimeout(&pipe1, buf, PIPE_SIZE, TIME_IMMEDIATE); - test_assert(n == 0, "not reset"); - test_assert((pipe1.rdptr == pipe1.buffer) && - (pipe1.wrptr == pipe1.buffer) && - (pipe1.cnt == 0), - "invalid pipe state"); + msg1 = chMBPostTimeout(&mb1, (msg_t)0, TIME_INFINITE); + test_assert(msg1 == MSG_RESET, "not in reset state"); + msg1 = chMBPostAheadTimeout(&mb1, (msg_t)0, TIME_INFINITE); + test_assert(msg1 == MSG_RESET, "not in reset state"); + msg1 = chMBFetchTimeout(&mb1, &msg2, TIME_INFINITE); + test_assert(msg1 == MSG_RESET, "not in reset state"); + chMBResumeX(&mb1); } - /* [2.1.4] Reactivating pipe.*/ + /* [2.1.4] Filling the mailbox using chMBPostTimeout() and + chMBPostAheadTimeout() once, no errors expected.*/ test_set_step(4); { - chPipeResume(&pipe1); - test_assert((pipe1.rdptr == pipe1.buffer) && - (pipe1.wrptr == pipe1.buffer) && - (pipe1.cnt == 0), - "invalid pipe state"); + for (i = 0; i < MB_SIZE - 1; i++) { + msg1 = chMBPostTimeout(&mb1, 'B' + i, TIME_INFINITE); + test_assert(msg1 == MSG_OK, "wrong wake-up message"); + } + msg1 = chMBPostAheadTimeout(&mb1, 'A', TIME_INFINITE); + test_assert(msg1 == MSG_OK, "wrong wake-up message"); } - /* [2.1.5] Filling whole pipe.*/ + /* [2.1.5] Testing intermediate conditions. Data pointers must be + aligned, semaphore counters are checked.*/ test_set_step(5); { - size_t n; - - n = chPipeWriteTimeout(&pipe1, pipe_pattern, PIPE_SIZE, TIME_IMMEDIATE); - test_assert(n == PIPE_SIZE, "wrong size"); - test_assert((pipe1.rdptr == pipe1.buffer) && - (pipe1.wrptr == pipe1.buffer) && - (pipe1.cnt == PIPE_SIZE), - "invalid pipe state"); + test_assert_lock(chMBGetFreeCountI(&mb1) == 0, "still empty"); + test_assert_lock(chMBGetUsedCountI(&mb1) == MB_SIZE, "not full"); + test_assert_lock(mb1.rdptr == mb1.wrptr, "pointers not aligned"); } - /* [2.1.6] Emptying pipe.*/ + /* [2.1.6] Emptying the mailbox using chMBFetchTimeout(), no errors + expected.*/ test_set_step(6); { - size_t n; - uint8_t buf[PIPE_SIZE]; - - n = chPipeReadTimeout(&pipe1, buf, PIPE_SIZE, TIME_IMMEDIATE); - test_assert(n == PIPE_SIZE, "wrong size"); - test_assert((pipe1.rdptr == pipe1.buffer) && - (pipe1.wrptr == pipe1.buffer) && - (pipe1.cnt == 0), - "invalid pipe state"); - test_assert(memcmp(pipe_pattern, buf, PIPE_SIZE) == 0, "content mismatch"); + for (i = 0; i < MB_SIZE; i++) { + msg1 = chMBFetchTimeout(&mb1, &msg2, TIME_INFINITE); + test_assert(msg1 == MSG_OK, "wrong wake-up message"); + test_emit_token(msg2); + } + test_assert_sequence("ABCD", "wrong get sequence"); } - /* [2.1.7] Small write.*/ + /* [2.1.7] Posting and then fetching one more message, no errors + expected.*/ test_set_step(7); { - size_t n; - - n = chPipeWriteTimeout(&pipe1, pipe_pattern, 4, TIME_IMMEDIATE); - test_assert(n == 4, "wrong size"); - test_assert((pipe1.rdptr != pipe1.wrptr) && - (pipe1.rdptr == pipe1.buffer) && - (pipe1.cnt == 4), - "invalid pipe state"); + msg1 = chMBPostTimeout(&mb1, 'B' + i, TIME_INFINITE); + test_assert(msg1 == MSG_OK, "wrong wake-up message"); + msg1 = chMBFetchTimeout(&mb1, &msg2, TIME_INFINITE); + test_assert(msg1 == MSG_OK, "wrong wake-up message"); } - /* [2.1.8] Filling remaining space.*/ + /* [2.1.8] Testing final conditions. Data pointers must be aligned to + buffer start, semaphore counters are checked.*/ test_set_step(8); { - size_t n; - - n = chPipeWriteTimeout(&pipe1, pipe_pattern, PIPE_SIZE - 4, TIME_IMMEDIATE); - test_assert(n == PIPE_SIZE - 4, "wrong size"); - test_assert((pipe1.rdptr == pipe1.buffer) && - (pipe1.wrptr == pipe1.buffer) && - (pipe1.cnt == PIPE_SIZE), - "invalid pipe state"); - } - - /* [2.1.9] Small Read.*/ - test_set_step(9); - { - size_t n; - uint8_t buf[PIPE_SIZE]; - - n = chPipeReadTimeout(&pipe1, buf, 4, TIME_IMMEDIATE); - test_assert(n == 4, "wrong size"); - test_assert((pipe1.rdptr != pipe1.buffer) && - (pipe1.wrptr == pipe1.buffer) && - (pipe1.cnt == PIPE_SIZE - 4), - "invalid pipe state"); - test_assert(memcmp(pipe_pattern, buf, 4) == 0, "content mismatch"); - } - - /* [2.1.10] Reading remaining data.*/ - test_set_step(10); - { - size_t n; - uint8_t buf[PIPE_SIZE]; - - n = chPipeReadTimeout(&pipe1, buf, PIPE_SIZE - 4, TIME_IMMEDIATE); - test_assert(n == PIPE_SIZE - 4, "wrong size"); - test_assert((pipe1.rdptr == pipe1.buffer) && - (pipe1.wrptr == pipe1.buffer) && - (pipe1.cnt == 0), - "invalid pipe state"); - test_assert(memcmp(pipe_pattern, buf, PIPE_SIZE - 4) == 0, "content mismatch"); - } - - /* [2.1.11] Small Write.*/ - test_set_step(11); - { - size_t n; - - n = chPipeWriteTimeout(&pipe1, pipe_pattern, 5, TIME_IMMEDIATE); - test_assert(n == 5, "wrong size"); - test_assert((pipe1.rdptr != pipe1.wrptr) && - (pipe1.rdptr == pipe1.buffer) && - (pipe1.cnt == 5), - "invalid pipe state"); - } - - /* [2.1.12] Small Read.*/ - test_set_step(12); - { - size_t n; - uint8_t buf[PIPE_SIZE]; - - n = chPipeReadTimeout(&pipe1, buf, 5, TIME_IMMEDIATE); - test_assert(n == 5, "wrong size"); - test_assert((pipe1.rdptr == pipe1.wrptr) && - (pipe1.wrptr != pipe1.buffer) && - (pipe1.cnt == 0), - "invalid pipe state"); - test_assert(memcmp(pipe_pattern, buf, 5) == 0, "content mismatch"); - } - - /* [2.1.13] Write wrapping buffer boundary.*/ - test_set_step(13); - { - size_t n; - - n = chPipeWriteTimeout(&pipe1, pipe_pattern, PIPE_SIZE, TIME_IMMEDIATE); - test_assert(n == PIPE_SIZE, "wrong size"); - test_assert((pipe1.rdptr == pipe1.wrptr) && - (pipe1.wrptr != pipe1.buffer) && - (pipe1.cnt == PIPE_SIZE), - "invalid pipe state"); - } - - /* [2.1.14] Read wrapping buffer boundary.*/ - test_set_step(14); - { - size_t n; - uint8_t buf[PIPE_SIZE]; - - n = chPipeReadTimeout(&pipe1, buf, PIPE_SIZE, TIME_IMMEDIATE); - test_assert(n == PIPE_SIZE, "wrong size"); - test_assert((pipe1.rdptr == pipe1.wrptr) && - (pipe1.wrptr != pipe1.buffer) && - (pipe1.cnt == 0), - "invalid pipe state"); - test_assert(memcmp(pipe_pattern, buf, PIPE_SIZE) == 0, "content mismatch"); + test_assert_lock(chMBGetFreeCountI(&mb1) == MB_SIZE, "not empty"); + test_assert_lock(chMBGetUsedCountI(&mb1) == 0, "still full"); + test_assert(mb1.buffer == mb1.wrptr, "write pointer not aligned to base"); + test_assert(mb1.buffer == mb1.rdptr, "read pointer not aligned to base"); } } static const testcase_t oslib_test_002_001 = { - "Pipes normal API, non-blocking tests", + "Mailbox normal API, non-blocking tests", oslib_test_002_001_setup, - NULL, + oslib_test_002_001_teardown, oslib_test_002_001_execute }; /** - * @page oslib_test_002_002 [2.2] Pipe timeouts + * @page oslib_test_002_002 [2.2] Mailbox I-Class API, non-blocking tests * *

Description

- * The pipe API is tested for timeouts. + * The mailbox I-Class API is tested without triggering blocking + * conditions. * *

Test Steps

- * - [2.2.1] Reading while pipe is empty. - * - [2.2.2] Writing a string larger than pipe buffer. + * - [2.2.1] Testing the mailbox size. + * - [2.2.2] Resetting the mailbox, conditions are checked, no errors + * expected. The mailbox is then returned in active state. + * - [2.2.3] Filling the mailbox using chMBPostI() and chMBPostAheadI() + * once, no errors expected. + * - [2.2.4] Testing intermediate conditions. Data pointers must be + * aligned, semaphore counters are checked. + * - [2.2.5] Emptying the mailbox using chMBFetchI(), no errors + * expected. + * - [2.2.6] Posting and then fetching one more message, no errors + * expected. + * - [2.2.7] Testing final conditions. Data pointers must be aligned to + * buffer start, semaphore counters are checked. * . */ static void oslib_test_002_002_setup(void) { - chPipeObjectInit(&pipe1, buffer, PIPE_SIZE / 2); + chMBObjectInit(&mb1, mb_buffer, MB_SIZE); +} + +static void oslib_test_002_002_teardown(void) { + chMBReset(&mb1); } static void oslib_test_002_002_execute(void) { + msg_t msg1, msg2; + unsigned i; - /* [2.2.1] Reading while pipe is empty.*/ + /* [2.2.1] Testing the mailbox size.*/ test_set_step(1); { - size_t n; - uint8_t buf[PIPE_SIZE]; - - n = chPipeReadTimeout(&pipe1, buf, PIPE_SIZE, TIME_IMMEDIATE); - test_assert(n == 0, "wrong size"); - test_assert((pipe1.rdptr == pipe1.buffer) && - (pipe1.wrptr == pipe1.buffer) && - (pipe1.cnt == 0), - "invalid pipe state"); + test_assert_lock(chMBGetFreeCountI(&mb1) == MB_SIZE, "wrong size"); } - /* [2.2.2] Writing a string larger than pipe buffer.*/ + /* [2.2.2] Resetting the mailbox, conditions are checked, no errors + expected. The mailbox is then returned in active state.*/ test_set_step(2); { - size_t n; + chSysLock(); + chMBResetI(&mb1); + chSysUnlock(); + test_assert_lock(chMBGetFreeCountI(&mb1) == MB_SIZE, "not empty"); + test_assert_lock(chMBGetUsedCountI(&mb1) == 0, "still full"); + test_assert_lock(mb1.buffer == mb1.wrptr, "write pointer not aligned to base"); + test_assert_lock(mb1.buffer == mb1.rdptr, "read pointer not aligned to base"); + chMBResumeX(&mb1); + } - n = chPipeWriteTimeout(&pipe1, pipe_pattern, PIPE_SIZE, TIME_IMMEDIATE); - test_assert(n == PIPE_SIZE / 2, "wrong size"); - test_assert((pipe1.rdptr == pipe1.wrptr) && - (pipe1.wrptr == pipe1.buffer) && - (pipe1.cnt == PIPE_SIZE / 2), - "invalid pipe state"); + /* [2.2.3] Filling the mailbox using chMBPostI() and chMBPostAheadI() + once, no errors expected.*/ + test_set_step(3); + { + for (i = 0; i < MB_SIZE - 1; i++) { + chSysLock(); + msg1 = chMBPostI(&mb1, 'B' + i); + chSysUnlock(); + test_assert(msg1 == MSG_OK, "wrong wake-up message"); + } + chSysLock(); + msg1 = chMBPostAheadI(&mb1, 'A'); + chSysUnlock(); + test_assert(msg1 == MSG_OK, "wrong wake-up message"); + } + + /* [2.2.4] Testing intermediate conditions. Data pointers must be + aligned, semaphore counters are checked.*/ + test_set_step(4); + { + test_assert_lock(chMBGetFreeCountI(&mb1) == 0, "still empty"); + test_assert_lock(chMBGetUsedCountI(&mb1) == MB_SIZE, "not full"); + test_assert_lock(mb1.rdptr == mb1.wrptr, "pointers not aligned"); + } + + /* [2.2.5] Emptying the mailbox using chMBFetchI(), no errors + expected.*/ + test_set_step(5); + { + for (i = 0; i < MB_SIZE; i++) { + chSysLock(); + msg1 = chMBFetchI(&mb1, &msg2); + chSysUnlock(); + test_assert(msg1 == MSG_OK, "wrong wake-up message"); + test_emit_token(msg2); + } + test_assert_sequence("ABCD", "wrong get sequence"); + } + + /* [2.2.6] Posting and then fetching one more message, no errors + expected.*/ + test_set_step(6); + { + msg1 = chMBPostTimeout(&mb1, 'B' + i, TIME_INFINITE); + test_assert(msg1 == MSG_OK, "wrong wake-up message"); + msg1 = chMBFetchTimeout(&mb1, &msg2, TIME_INFINITE); + test_assert(msg1 == MSG_OK, "wrong wake-up message"); + } + + /* [2.2.7] Testing final conditions. Data pointers must be aligned to + buffer start, semaphore counters are checked.*/ + test_set_step(7); + { + test_assert_lock(chMBGetFreeCountI(&mb1) == MB_SIZE, "not empty"); + test_assert_lock(chMBGetUsedCountI(&mb1) == 0, "still full"); + test_assert(mb1.buffer == mb1.wrptr, "write pointer not aligned to base"); + test_assert(mb1.buffer == mb1.rdptr, "read pointer not aligned to base"); } } static const testcase_t oslib_test_002_002 = { - "Pipe timeouts", + "Mailbox I-Class API, non-blocking tests", oslib_test_002_002_setup, - NULL, + oslib_test_002_002_teardown, oslib_test_002_002_execute }; +/** + * @page oslib_test_002_003 [2.3] Mailbox timeouts + * + *

Description

+ * The mailbox API is tested for timeouts. + * + *

Test Steps

+ * - [2.3.1] Filling the mailbox. + * - [2.3.2] Testing chMBPostTimeout(), chMBPostI(), + * chMBPostAheadTimeout() and chMBPostAheadI() timeout. + * - [2.3.3] Resetting the mailbox. The mailbox is then returned in + * active state. + * - [2.3.4] Testing chMBFetchTimeout() and chMBFetchI() timeout. + * . + */ + +static void oslib_test_002_003_setup(void) { + chMBObjectInit(&mb1, mb_buffer, MB_SIZE); +} + +static void oslib_test_002_003_teardown(void) { + chMBReset(&mb1); +} + +static void oslib_test_002_003_execute(void) { + msg_t msg1, msg2; + unsigned i; + + /* [2.3.1] Filling the mailbox.*/ + test_set_step(1); + { + for (i = 0; i < MB_SIZE; i++) { + msg1 = chMBPostTimeout(&mb1, 'B' + i, TIME_INFINITE); + test_assert(msg1 == MSG_OK, "wrong wake-up message"); + } + } + + /* [2.3.2] Testing chMBPostTimeout(), chMBPostI(), + chMBPostAheadTimeout() and chMBPostAheadI() timeout.*/ + test_set_step(2); + { + msg1 = chMBPostTimeout(&mb1, 'X', 1); + test_assert(msg1 == MSG_TIMEOUT, "wrong wake-up message"); + chSysLock(); + msg1 = chMBPostI(&mb1, 'X'); + chSysUnlock(); + test_assert(msg1 == MSG_TIMEOUT, "wrong wake-up message"); + msg1 = chMBPostAheadTimeout(&mb1, 'X', 1); + test_assert(msg1 == MSG_TIMEOUT, "wrong wake-up message"); + chSysLock(); + msg1 = chMBPostAheadI(&mb1, 'X'); + chSysUnlock(); + test_assert(msg1 == MSG_TIMEOUT, "wrong wake-up message"); + } + + /* [2.3.3] Resetting the mailbox. The mailbox is then returned in + active state.*/ + test_set_step(3); + { + chMBReset(&mb1); + chMBResumeX(&mb1); + } + + /* [2.3.4] Testing chMBFetchTimeout() and chMBFetchI() timeout.*/ + test_set_step(4); + { + msg1 = chMBFetchTimeout(&mb1, &msg2, 1); + test_assert(msg1 == MSG_TIMEOUT, "wrong wake-up message"); + chSysLock(); + msg1 = chMBFetchI(&mb1, &msg2); + chSysUnlock(); + test_assert(msg1 == MSG_TIMEOUT, "wrong wake-up message"); + } +} + +static const testcase_t oslib_test_002_003 = { + "Mailbox timeouts", + oslib_test_002_003_setup, + oslib_test_002_003_teardown, + oslib_test_002_003_execute +}; + /**************************************************************************** * Exported data. ****************************************************************************/ @@ -350,15 +401,16 @@ static const testcase_t oslib_test_002_002 = { const testcase_t * const oslib_test_sequence_002_array[] = { &oslib_test_002_001, &oslib_test_002_002, + &oslib_test_002_003, NULL }; /** - * @brief Pipes. + * @brief Mailboxes. */ const testsequence_t oslib_test_sequence_002 = { - "Pipes", + "Mailboxes", oslib_test_sequence_002_array }; -#endif /* CH_CFG_USE_PIPES */ +#endif /* CH_CFG_USE_MAILBOXES */ diff --git a/test/oslib/source/test/oslib_test_sequence_003.c b/test/oslib/source/test/oslib_test_sequence_003.c index 7bfd208e0..554724e2c 100644 --- a/test/oslib/source/test/oslib_test_sequence_003.c +++ b/test/oslib/source/test/oslib_test_sequence_003.c @@ -21,258 +21,324 @@ * @file oslib_test_sequence_003.c * @brief Test Sequence 003 code. * - * @page oslib_test_sequence_003 [3] Memory Pools + * @page oslib_test_sequence_003 [3] Pipes * * File: @ref oslib_test_sequence_003.c * *

Description

* This sequence tests the ChibiOS library functionalities related to - * memory pools. + * pipes. * *

Conditions

* This sequence is only executed if the following preprocessor condition * evaluates to true: - * - CH_CFG_USE_MEMPOOLS + * - CH_CFG_USE_PIPES * . * *

Test Cases

* - @subpage oslib_test_003_001 * - @subpage oslib_test_003_002 - * - @subpage oslib_test_003_003 * . */ -#if (CH_CFG_USE_MEMPOOLS) || defined(__DOXYGEN__) +#if (CH_CFG_USE_PIPES) || defined(__DOXYGEN__) /**************************************************************************** * Shared code. ****************************************************************************/ -#define MEMORY_POOL_SIZE 4 +#include -static uint32_t objects[MEMORY_POOL_SIZE]; -static MEMORYPOOL_DECL(mp1, sizeof (uint32_t), PORT_NATURAL_ALIGN, NULL); +#define PIPE_SIZE 16 -#if CH_CFG_USE_SEMAPHORES -static GUARDEDMEMORYPOOL_DECL(gmp1, sizeof (uint32_t), PORT_NATURAL_ALIGN); -#endif +static uint8_t buffer[PIPE_SIZE]; +static PIPE_DECL(pipe1, buffer, PIPE_SIZE); -static void *null_provider(size_t size, unsigned align) { - - (void)size; - (void)align; - - return NULL; -} +static const uint8_t pipe_pattern[] = "0123456789ABCDEF"; /**************************************************************************** * Test cases. ****************************************************************************/ /** - * @page oslib_test_003_001 [3.1] Loading and emptying a memory pool + * @page oslib_test_003_001 [3.1] Pipes normal API, non-blocking tests * *

Description

- * The memory pool functionality is tested by loading and emptying it, - * all conditions are tested. + * The pipe functionality is tested by loading and emptying it, all + * conditions are tested. * *

Test Steps

- * - [3.1.1] Adding the objects to the pool using chPoolLoadArray(). - * - [3.1.2] Emptying the pool using chPoolAlloc(). - * - [3.1.3] Now must be empty. - * - [3.1.4] Adding the objects to the pool using chPoolFree(). - * - [3.1.5] Emptying the pool using chPoolAlloc() again. - * - [3.1.6] Now must be empty again. - * - [3.1.7] Covering the case where a provider is unable to return - * more memory. + * - [3.1.1] Resetting pipe. + * - [3.1.2] Writing data, must fail. + * - [3.1.3] Reading data, must fail. + * - [3.1.4] Reactivating pipe. + * - [3.1.5] Filling whole pipe. + * - [3.1.6] Emptying pipe. + * - [3.1.7] Small write. + * - [3.1.8] Filling remaining space. + * - [3.1.9] Small Read. + * - [3.1.10] Reading remaining data. + * - [3.1.11] Small Write. + * - [3.1.12] Small Read. + * - [3.1.13] Write wrapping buffer boundary. + * - [3.1.14] Read wrapping buffer boundary. * . */ static void oslib_test_003_001_setup(void) { - chPoolObjectInit(&mp1, sizeof (uint32_t), NULL); + chPipeObjectInit(&pipe1, buffer, PIPE_SIZE); } static void oslib_test_003_001_execute(void) { - unsigned i; - /* [3.1.1] Adding the objects to the pool using chPoolLoadArray().*/ + /* [3.1.1] Resetting pipe.*/ test_set_step(1); { - chPoolLoadArray(&mp1, objects, MEMORY_POOL_SIZE); + chPipeReset(&pipe1); + + test_assert((pipe1.rdptr == pipe1.buffer) && + (pipe1.wrptr == pipe1.buffer) && + (pipe1.cnt == 0), + "invalid pipe state"); } - /* [3.1.2] Emptying the pool using chPoolAlloc().*/ + /* [3.1.2] Writing data, must fail.*/ test_set_step(2); { - for (i = 0; i < MEMORY_POOL_SIZE; i++) - test_assert(chPoolAlloc(&mp1) != NULL, "list empty"); + size_t n; + + n = chPipeWriteTimeout(&pipe1, pipe_pattern, PIPE_SIZE, TIME_IMMEDIATE); + test_assert(n == 0, "not reset"); + test_assert((pipe1.rdptr == pipe1.buffer) && + (pipe1.wrptr == pipe1.buffer) && + (pipe1.cnt == 0), + "invalid pipe state"); } - /* [3.1.3] Now must be empty.*/ + /* [3.1.3] Reading data, must fail.*/ test_set_step(3); { - test_assert(chPoolAlloc(&mp1) == NULL, "list not empty"); + size_t n; + uint8_t buf[PIPE_SIZE]; + + n = chPipeReadTimeout(&pipe1, buf, PIPE_SIZE, TIME_IMMEDIATE); + test_assert(n == 0, "not reset"); + test_assert((pipe1.rdptr == pipe1.buffer) && + (pipe1.wrptr == pipe1.buffer) && + (pipe1.cnt == 0), + "invalid pipe state"); } - /* [3.1.4] Adding the objects to the pool using chPoolFree().*/ + /* [3.1.4] Reactivating pipe.*/ test_set_step(4); { - for (i = 0; i < MEMORY_POOL_SIZE; i++) - chPoolFree(&mp1, &objects[i]); + chPipeResume(&pipe1); + test_assert((pipe1.rdptr == pipe1.buffer) && + (pipe1.wrptr == pipe1.buffer) && + (pipe1.cnt == 0), + "invalid pipe state"); } - /* [3.1.5] Emptying the pool using chPoolAlloc() again.*/ + /* [3.1.5] Filling whole pipe.*/ test_set_step(5); { - for (i = 0; i < MEMORY_POOL_SIZE; i++) - test_assert(chPoolAlloc(&mp1) != NULL, "list empty"); + size_t n; + + n = chPipeWriteTimeout(&pipe1, pipe_pattern, PIPE_SIZE, TIME_IMMEDIATE); + test_assert(n == PIPE_SIZE, "wrong size"); + test_assert((pipe1.rdptr == pipe1.buffer) && + (pipe1.wrptr == pipe1.buffer) && + (pipe1.cnt == PIPE_SIZE), + "invalid pipe state"); } - /* [3.1.6] Now must be empty again.*/ + /* [3.1.6] Emptying pipe.*/ test_set_step(6); { - test_assert(chPoolAlloc(&mp1) == NULL, "list not empty"); + size_t n; + uint8_t buf[PIPE_SIZE]; + + n = chPipeReadTimeout(&pipe1, buf, PIPE_SIZE, TIME_IMMEDIATE); + test_assert(n == PIPE_SIZE, "wrong size"); + test_assert((pipe1.rdptr == pipe1.buffer) && + (pipe1.wrptr == pipe1.buffer) && + (pipe1.cnt == 0), + "invalid pipe state"); + test_assert(memcmp(pipe_pattern, buf, PIPE_SIZE) == 0, "content mismatch"); } - /* [3.1.7] Covering the case where a provider is unable to return - more memory.*/ + /* [3.1.7] Small write.*/ test_set_step(7); { - chPoolObjectInit(&mp1, sizeof (uint32_t), null_provider); - test_assert(chPoolAlloc(&mp1) == NULL, "provider returned memory"); + size_t n; + + n = chPipeWriteTimeout(&pipe1, pipe_pattern, 4, TIME_IMMEDIATE); + test_assert(n == 4, "wrong size"); + test_assert((pipe1.rdptr != pipe1.wrptr) && + (pipe1.rdptr == pipe1.buffer) && + (pipe1.cnt == 4), + "invalid pipe state"); + } + + /* [3.1.8] Filling remaining space.*/ + test_set_step(8); + { + size_t n; + + n = chPipeWriteTimeout(&pipe1, pipe_pattern, PIPE_SIZE - 4, TIME_IMMEDIATE); + test_assert(n == PIPE_SIZE - 4, "wrong size"); + test_assert((pipe1.rdptr == pipe1.buffer) && + (pipe1.wrptr == pipe1.buffer) && + (pipe1.cnt == PIPE_SIZE), + "invalid pipe state"); + } + + /* [3.1.9] Small Read.*/ + test_set_step(9); + { + size_t n; + uint8_t buf[PIPE_SIZE]; + + n = chPipeReadTimeout(&pipe1, buf, 4, TIME_IMMEDIATE); + test_assert(n == 4, "wrong size"); + test_assert((pipe1.rdptr != pipe1.buffer) && + (pipe1.wrptr == pipe1.buffer) && + (pipe1.cnt == PIPE_SIZE - 4), + "invalid pipe state"); + test_assert(memcmp(pipe_pattern, buf, 4) == 0, "content mismatch"); + } + + /* [3.1.10] Reading remaining data.*/ + test_set_step(10); + { + size_t n; + uint8_t buf[PIPE_SIZE]; + + n = chPipeReadTimeout(&pipe1, buf, PIPE_SIZE - 4, TIME_IMMEDIATE); + test_assert(n == PIPE_SIZE - 4, "wrong size"); + test_assert((pipe1.rdptr == pipe1.buffer) && + (pipe1.wrptr == pipe1.buffer) && + (pipe1.cnt == 0), + "invalid pipe state"); + test_assert(memcmp(pipe_pattern, buf, PIPE_SIZE - 4) == 0, "content mismatch"); + } + + /* [3.1.11] Small Write.*/ + test_set_step(11); + { + size_t n; + + n = chPipeWriteTimeout(&pipe1, pipe_pattern, 5, TIME_IMMEDIATE); + test_assert(n == 5, "wrong size"); + test_assert((pipe1.rdptr != pipe1.wrptr) && + (pipe1.rdptr == pipe1.buffer) && + (pipe1.cnt == 5), + "invalid pipe state"); + } + + /* [3.1.12] Small Read.*/ + test_set_step(12); + { + size_t n; + uint8_t buf[PIPE_SIZE]; + + n = chPipeReadTimeout(&pipe1, buf, 5, TIME_IMMEDIATE); + test_assert(n == 5, "wrong size"); + test_assert((pipe1.rdptr == pipe1.wrptr) && + (pipe1.wrptr != pipe1.buffer) && + (pipe1.cnt == 0), + "invalid pipe state"); + test_assert(memcmp(pipe_pattern, buf, 5) == 0, "content mismatch"); + } + + /* [3.1.13] Write wrapping buffer boundary.*/ + test_set_step(13); + { + size_t n; + + n = chPipeWriteTimeout(&pipe1, pipe_pattern, PIPE_SIZE, TIME_IMMEDIATE); + test_assert(n == PIPE_SIZE, "wrong size"); + test_assert((pipe1.rdptr == pipe1.wrptr) && + (pipe1.wrptr != pipe1.buffer) && + (pipe1.cnt == PIPE_SIZE), + "invalid pipe state"); + } + + /* [3.1.14] Read wrapping buffer boundary.*/ + test_set_step(14); + { + size_t n; + uint8_t buf[PIPE_SIZE]; + + n = chPipeReadTimeout(&pipe1, buf, PIPE_SIZE, TIME_IMMEDIATE); + test_assert(n == PIPE_SIZE, "wrong size"); + test_assert((pipe1.rdptr == pipe1.wrptr) && + (pipe1.wrptr != pipe1.buffer) && + (pipe1.cnt == 0), + "invalid pipe state"); + test_assert(memcmp(pipe_pattern, buf, PIPE_SIZE) == 0, "content mismatch"); } } static const testcase_t oslib_test_003_001 = { - "Loading and emptying a memory pool", + "Pipes normal API, non-blocking tests", oslib_test_003_001_setup, NULL, oslib_test_003_001_execute }; -#if (CH_CFG_USE_SEMAPHORES) || defined(__DOXYGEN__) /** - * @page oslib_test_003_002 [3.2] Loading and emptying a guarded memory pool without waiting + * @page oslib_test_003_002 [3.2] Pipe timeouts * *

Description

- * The memory pool functionality is tested by loading and emptying it, - * all conditions are tested. - * - *

Conditions

- * This test is only executed if the following preprocessor condition - * evaluates to true: - * - CH_CFG_USE_SEMAPHORES - * . + * The pipe API is tested for timeouts. * *

Test Steps

- * - [3.2.1] Adding the objects to the pool using - * chGuardedPoolLoadArray(). - * - [3.2.2] Emptying the pool using chGuardedPoolAllocTimeout(). - * - [3.2.3] Now must be empty. - * - [3.2.4] Adding the objects to the pool using chGuardedPoolFree(). - * - [3.2.5] Emptying the pool using chGuardedPoolAllocTimeout() again. - * - [3.2.6] Now must be empty again. + * - [3.2.1] Reading while pipe is empty. + * - [3.2.2] Writing a string larger than pipe buffer. * . */ static void oslib_test_003_002_setup(void) { - chGuardedPoolObjectInit(&gmp1, sizeof (uint32_t)); + chPipeObjectInit(&pipe1, buffer, PIPE_SIZE / 2); } static void oslib_test_003_002_execute(void) { - unsigned i; - /* [3.2.1] Adding the objects to the pool using - chGuardedPoolLoadArray().*/ + /* [3.2.1] Reading while pipe is empty.*/ test_set_step(1); { - chGuardedPoolLoadArray(&gmp1, objects, MEMORY_POOL_SIZE); + size_t n; + uint8_t buf[PIPE_SIZE]; + + n = chPipeReadTimeout(&pipe1, buf, PIPE_SIZE, TIME_IMMEDIATE); + test_assert(n == 0, "wrong size"); + test_assert((pipe1.rdptr == pipe1.buffer) && + (pipe1.wrptr == pipe1.buffer) && + (pipe1.cnt == 0), + "invalid pipe state"); } - /* [3.2.2] Emptying the pool using chGuardedPoolAllocTimeout().*/ + /* [3.2.2] Writing a string larger than pipe buffer.*/ test_set_step(2); { - for (i = 0; i < MEMORY_POOL_SIZE; i++) - test_assert(chGuardedPoolAllocTimeout(&gmp1, TIME_IMMEDIATE) != NULL, "list empty"); - } + size_t n; - /* [3.2.3] Now must be empty.*/ - test_set_step(3); - { - test_assert(chGuardedPoolAllocTimeout(&gmp1, TIME_IMMEDIATE) == NULL, "list not empty"); - } - - /* [3.2.4] Adding the objects to the pool using - chGuardedPoolFree().*/ - test_set_step(4); - { - for (i = 0; i < MEMORY_POOL_SIZE; i++) - chGuardedPoolFree(&gmp1, &objects[i]); - } - - /* [3.2.5] Emptying the pool using chGuardedPoolAllocTimeout() - again.*/ - test_set_step(5); - { - for (i = 0; i < MEMORY_POOL_SIZE; i++) - test_assert(chGuardedPoolAllocTimeout(&gmp1, TIME_IMMEDIATE) != NULL, "list empty"); - } - - /* [3.2.6] Now must be empty again.*/ - test_set_step(6); - { - test_assert(chGuardedPoolAllocTimeout(&gmp1, TIME_IMMEDIATE) == NULL, "list not empty"); + n = chPipeWriteTimeout(&pipe1, pipe_pattern, PIPE_SIZE, TIME_IMMEDIATE); + test_assert(n == PIPE_SIZE / 2, "wrong size"); + test_assert((pipe1.rdptr == pipe1.wrptr) && + (pipe1.wrptr == pipe1.buffer) && + (pipe1.cnt == PIPE_SIZE / 2), + "invalid pipe state"); } } static const testcase_t oslib_test_003_002 = { - "Loading and emptying a guarded memory pool without waiting", + "Pipe timeouts", oslib_test_003_002_setup, NULL, oslib_test_003_002_execute }; -#endif /* CH_CFG_USE_SEMAPHORES */ - -#if (CH_CFG_USE_SEMAPHORES) || defined(__DOXYGEN__) -/** - * @page oslib_test_003_003 [3.3] Guarded Memory Pools timeout - * - *

Description

- * The timeout features for the Guarded Memory Pools is tested. - * - *

Conditions

- * This test is only executed if the following preprocessor condition - * evaluates to true: - * - CH_CFG_USE_SEMAPHORES - * . - * - *

Test Steps

- * - [3.3.1] Trying to allocate with 100mS timeout, must fail because - * the pool is empty. - * . - */ - -static void oslib_test_003_003_setup(void) { - chGuardedPoolObjectInit(&gmp1, sizeof (uint32_t)); -} - -static void oslib_test_003_003_execute(void) { - - /* [3.3.1] Trying to allocate with 100mS timeout, must fail because - the pool is empty.*/ - test_set_step(1); - { - test_assert(chGuardedPoolAllocTimeout(&gmp1, TIME_MS2I(100)) == NULL, "list not empty"); - } -} - -static const testcase_t oslib_test_003_003 = { - "Guarded Memory Pools timeout", - oslib_test_003_003_setup, - NULL, - oslib_test_003_003_execute -}; -#endif /* CH_CFG_USE_SEMAPHORES */ /**************************************************************************** * Exported data. @@ -283,21 +349,16 @@ static const testcase_t oslib_test_003_003 = { */ const testcase_t * const oslib_test_sequence_003_array[] = { &oslib_test_003_001, -#if (CH_CFG_USE_SEMAPHORES) || defined(__DOXYGEN__) &oslib_test_003_002, -#endif -#if (CH_CFG_USE_SEMAPHORES) || defined(__DOXYGEN__) - &oslib_test_003_003, -#endif NULL }; /** - * @brief Memory Pools. + * @brief Pipes. */ const testsequence_t oslib_test_sequence_003 = { - "Memory Pools", + "Pipes", oslib_test_sequence_003_array }; -#endif /* CH_CFG_USE_MEMPOOLS */ +#endif /* CH_CFG_USE_PIPES */ diff --git a/test/oslib/source/test/oslib_test_sequence_004.c b/test/oslib/source/test/oslib_test_sequence_004.c index 84b466a64..7ecf4b6d6 100644 --- a/test/oslib/source/test/oslib_test_sequence_004.c +++ b/test/oslib/source/test/oslib_test_sequence_004.c @@ -21,240 +21,258 @@ * @file oslib_test_sequence_004.c * @brief Test Sequence 004 code. * - * @page oslib_test_sequence_004 [4] Memory Heaps + * @page oslib_test_sequence_004 [4] Memory Pools * * File: @ref oslib_test_sequence_004.c * *

Description

* This sequence tests the ChibiOS library functionalities related to - * memory heaps. + * memory pools. * *

Conditions

* This sequence is only executed if the following preprocessor condition * evaluates to true: - * - CH_CFG_USE_HEAP + * - CH_CFG_USE_MEMPOOLS * . * *

Test Cases

* - @subpage oslib_test_004_001 * - @subpage oslib_test_004_002 + * - @subpage oslib_test_004_003 * . */ -#if (CH_CFG_USE_HEAP) || defined(__DOXYGEN__) +#if (CH_CFG_USE_MEMPOOLS) || defined(__DOXYGEN__) /**************************************************************************** * Shared code. ****************************************************************************/ -#define ALLOC_SIZE 16 -#define HEAP_SIZE (ALLOC_SIZE * 8) +#define MEMORY_POOL_SIZE 4 -static memory_heap_t test_heap; -static uint8_t test_heap_buffer[HEAP_SIZE]; +static uint32_t objects[MEMORY_POOL_SIZE]; +static MEMORYPOOL_DECL(mp1, sizeof (uint32_t), PORT_NATURAL_ALIGN, NULL); + +#if CH_CFG_USE_SEMAPHORES +static GUARDEDMEMORYPOOL_DECL(gmp1, sizeof (uint32_t), PORT_NATURAL_ALIGN); +#endif + +static void *null_provider(size_t size, unsigned align) { + + (void)size; + (void)align; + + return NULL; +} /**************************************************************************** * Test cases. ****************************************************************************/ /** - * @page oslib_test_004_001 [4.1] Allocation and fragmentation + * @page oslib_test_004_001 [4.1] Loading and emptying a memory pool * *

Description

- * Series of allocations/deallocations are performed in carefully - * designed sequences in order to stimulate all the possible code paths - * inside the allocator. The test expects to find the heap back to the - * initial status after each sequence. + * The memory pool functionality is tested by loading and emptying it, + * all conditions are tested. * *

Test Steps

- * - [4.1.1] Testing initial conditions, the heap must not be - * fragmented and one free block present. - * - [4.1.2] Trying to allocate an block bigger than available space, - * an error is expected. - * - [4.1.3] Single block allocation using chHeapAlloc() then the block - * is freed using chHeapFree(), must not fail. - * - [4.1.4] Using chHeapStatus() to assess the heap state. There must - * be at least one free block of sufficient size. - * - [4.1.5] Allocating then freeing in the same order. - * - [4.1.6] Allocating then freeing in reverse order. - * - [4.1.7] Small fragments handling. Checking the behavior when - * allocating blocks with size not multiple of alignment unit. - * - [4.1.8] Skipping a fragment, the first fragment in the list is too - * small so the allocator must pick the second one. - * - [4.1.9] Allocating the whole available space. - * - [4.1.10] Testing final conditions. The heap geometry must be the - * same than the one registered at beginning. + * - [4.1.1] Adding the objects to the pool using chPoolLoadArray(). + * - [4.1.2] Emptying the pool using chPoolAlloc(). + * - [4.1.3] Now must be empty. + * - [4.1.4] Adding the objects to the pool using chPoolFree(). + * - [4.1.5] Emptying the pool using chPoolAlloc() again. + * - [4.1.6] Now must be empty again. + * - [4.1.7] Covering the case where a provider is unable to return + * more memory. * . */ static void oslib_test_004_001_setup(void) { - chHeapObjectInit(&test_heap, test_heap_buffer, sizeof(test_heap_buffer)); + chPoolObjectInit(&mp1, sizeof (uint32_t), NULL); } static void oslib_test_004_001_execute(void) { - void *p1, *p2, *p3; - size_t n, sz; + unsigned i; - /* [4.1.1] Testing initial conditions, the heap must not be - fragmented and one free block present.*/ + /* [4.1.1] Adding the objects to the pool using chPoolLoadArray().*/ test_set_step(1); { - test_assert(chHeapStatus(&test_heap, &sz, NULL) == 1, "heap fragmented"); + chPoolLoadArray(&mp1, objects, MEMORY_POOL_SIZE); } - /* [4.1.2] Trying to allocate an block bigger than available space, - an error is expected.*/ + /* [4.1.2] Emptying the pool using chPoolAlloc().*/ test_set_step(2); { - p1 = chHeapAlloc(&test_heap, sizeof test_heap_buffer * 2); - test_assert(p1 == NULL, "allocation not failed"); + for (i = 0; i < MEMORY_POOL_SIZE; i++) + test_assert(chPoolAlloc(&mp1) != NULL, "list empty"); } - /* [4.1.3] Single block allocation using chHeapAlloc() then the block - is freed using chHeapFree(), must not fail.*/ + /* [4.1.3] Now must be empty.*/ test_set_step(3); { - p1 = chHeapAlloc(&test_heap, ALLOC_SIZE); - test_assert(p1 != NULL, "allocation failed"); - chHeapFree(p1); + test_assert(chPoolAlloc(&mp1) == NULL, "list not empty"); } - /* [4.1.4] Using chHeapStatus() to assess the heap state. There must - be at least one free block of sufficient size.*/ + /* [4.1.4] Adding the objects to the pool using chPoolFree().*/ test_set_step(4); { - size_t total_size, largest_size; - - n = chHeapStatus(&test_heap, &total_size, &largest_size); - test_assert(n == 1, "missing free block"); - test_assert(total_size >= ALLOC_SIZE, "unexpected heap state"); - test_assert(total_size == largest_size, "unexpected heap state"); + for (i = 0; i < MEMORY_POOL_SIZE; i++) + chPoolFree(&mp1, &objects[i]); } - /* [4.1.5] Allocating then freeing in the same order.*/ + /* [4.1.5] Emptying the pool using chPoolAlloc() again.*/ test_set_step(5); { - p1 = chHeapAlloc(&test_heap, ALLOC_SIZE); - p2 = chHeapAlloc(&test_heap, ALLOC_SIZE); - p3 = chHeapAlloc(&test_heap, ALLOC_SIZE); - chHeapFree(p1); /* Does not merge.*/ - chHeapFree(p2); /* Merges backward.*/ - chHeapFree(p3); /* Merges both sides.*/ - test_assert(chHeapStatus(&test_heap, &n, NULL) == 1, "heap fragmented"); + for (i = 0; i < MEMORY_POOL_SIZE; i++) + test_assert(chPoolAlloc(&mp1) != NULL, "list empty"); } - /* [4.1.6] Allocating then freeing in reverse order.*/ + /* [4.1.6] Now must be empty again.*/ test_set_step(6); { - p1 = chHeapAlloc(&test_heap, ALLOC_SIZE); - p2 = chHeapAlloc(&test_heap, ALLOC_SIZE); - p3 = chHeapAlloc(&test_heap, ALLOC_SIZE); - chHeapFree(p3); /* Merges forward.*/ - chHeapFree(p2); /* Merges forward.*/ - chHeapFree(p1); /* Merges forward.*/ - test_assert(chHeapStatus(&test_heap, &n, NULL) == 1, "heap fragmented"); + test_assert(chPoolAlloc(&mp1) == NULL, "list not empty"); } - /* [4.1.7] Small fragments handling. Checking the behavior when - allocating blocks with size not multiple of alignment unit.*/ + /* [4.1.7] Covering the case where a provider is unable to return + more memory.*/ test_set_step(7); { - p1 = chHeapAlloc(&test_heap, ALLOC_SIZE + 1); - p2 = chHeapAlloc(&test_heap, ALLOC_SIZE); - chHeapFree(p1); - test_assert(chHeapStatus(&test_heap, &n, NULL) == 2, "invalid state"); - p1 = chHeapAlloc(&test_heap, ALLOC_SIZE); - /* Note, the first situation happens when the alignment size is smaller - than the header size, the second in the other cases.*/ - test_assert((chHeapStatus(&test_heap, &n, NULL) == 1) || - (chHeapStatus(&test_heap, &n, NULL) == 2), "heap fragmented"); - chHeapFree(p2); - chHeapFree(p1); - test_assert(chHeapStatus(&test_heap, &n, NULL) == 1, "heap fragmented"); - } - - /* [4.1.8] Skipping a fragment, the first fragment in the list is too - small so the allocator must pick the second one.*/ - test_set_step(8); - { - p1 = chHeapAlloc(&test_heap, ALLOC_SIZE); - p2 = chHeapAlloc(&test_heap, ALLOC_SIZE); - chHeapFree(p1); - test_assert( chHeapStatus(&test_heap, &n, NULL) == 2, "invalid state"); - p1 = chHeapAlloc(&test_heap, ALLOC_SIZE * 2); /* Skips first fragment.*/ - chHeapFree(p1); - chHeapFree(p2); - test_assert(chHeapStatus(&test_heap, &n, NULL) == 1, "heap fragmented"); - } - - /* [4.1.9] Allocating the whole available space.*/ - test_set_step(9); - { - (void)chHeapStatus(&test_heap, &n, NULL); - p1 = chHeapAlloc(&test_heap, n); - test_assert(p1 != NULL, "allocation failed"); - test_assert(chHeapStatus(&test_heap, NULL, NULL) == 0, "not empty"); - chHeapFree(p1); - } - - /* [4.1.10] Testing final conditions. The heap geometry must be the - same than the one registered at beginning.*/ - test_set_step(10); - { - test_assert(chHeapStatus(&test_heap, &n, NULL) == 1, "heap fragmented"); - test_assert(n == sz, "size changed"); + chPoolObjectInit(&mp1, sizeof (uint32_t), null_provider); + test_assert(chPoolAlloc(&mp1) == NULL, "provider returned memory"); } } static const testcase_t oslib_test_004_001 = { - "Allocation and fragmentation", + "Loading and emptying a memory pool", oslib_test_004_001_setup, NULL, oslib_test_004_001_execute }; +#if (CH_CFG_USE_SEMAPHORES) || defined(__DOXYGEN__) /** - * @page oslib_test_004_002 [4.2] Default Heap + * @page oslib_test_004_002 [4.2] Loading and emptying a guarded memory pool without waiting * *

Description

- * The default heap is pre-allocated in the system. We test base - * functionality. + * The memory pool functionality is tested by loading and emptying it, + * all conditions are tested. + * + *

Conditions

+ * This test is only executed if the following preprocessor condition + * evaluates to true: + * - CH_CFG_USE_SEMAPHORES + * . * *

Test Steps

- * - [4.2.1] Single block allocation using chHeapAlloc() then the block - * is freed using chHeapFree(), must not fail. - * - [4.2.2] Testing allocation failure. + * - [4.2.1] Adding the objects to the pool using + * chGuardedPoolLoadArray(). + * - [4.2.2] Emptying the pool using chGuardedPoolAllocTimeout(). + * - [4.2.3] Now must be empty. + * - [4.2.4] Adding the objects to the pool using chGuardedPoolFree(). + * - [4.2.5] Emptying the pool using chGuardedPoolAllocTimeout() again. + * - [4.2.6] Now must be empty again. * . */ -static void oslib_test_004_002_execute(void) { - void *p1; - size_t total_size, largest_size; +static void oslib_test_004_002_setup(void) { + chGuardedPoolObjectInit(&gmp1, sizeof (uint32_t)); +} - /* [4.2.1] Single block allocation using chHeapAlloc() then the block - is freed using chHeapFree(), must not fail.*/ +static void oslib_test_004_002_execute(void) { + unsigned i; + + /* [4.2.1] Adding the objects to the pool using + chGuardedPoolLoadArray().*/ test_set_step(1); { - (void)chHeapStatus(NULL, &total_size, &largest_size); - p1 = chHeapAlloc(&test_heap, ALLOC_SIZE); - test_assert(p1 != NULL, "allocation failed"); - chHeapFree(p1); + chGuardedPoolLoadArray(&gmp1, objects, MEMORY_POOL_SIZE); } - /* [4.2.2] Testing allocation failure.*/ + /* [4.2.2] Emptying the pool using chGuardedPoolAllocTimeout().*/ test_set_step(2); { - p1 = chHeapAlloc(NULL, (size_t)-256); - test_assert(p1 == NULL, "allocation not failed"); + for (i = 0; i < MEMORY_POOL_SIZE; i++) + test_assert(chGuardedPoolAllocTimeout(&gmp1, TIME_IMMEDIATE) != NULL, "list empty"); + } + + /* [4.2.3] Now must be empty.*/ + test_set_step(3); + { + test_assert(chGuardedPoolAllocTimeout(&gmp1, TIME_IMMEDIATE) == NULL, "list not empty"); + } + + /* [4.2.4] Adding the objects to the pool using + chGuardedPoolFree().*/ + test_set_step(4); + { + for (i = 0; i < MEMORY_POOL_SIZE; i++) + chGuardedPoolFree(&gmp1, &objects[i]); + } + + /* [4.2.5] Emptying the pool using chGuardedPoolAllocTimeout() + again.*/ + test_set_step(5); + { + for (i = 0; i < MEMORY_POOL_SIZE; i++) + test_assert(chGuardedPoolAllocTimeout(&gmp1, TIME_IMMEDIATE) != NULL, "list empty"); + } + + /* [4.2.6] Now must be empty again.*/ + test_set_step(6); + { + test_assert(chGuardedPoolAllocTimeout(&gmp1, TIME_IMMEDIATE) == NULL, "list not empty"); } } static const testcase_t oslib_test_004_002 = { - "Default Heap", - NULL, + "Loading and emptying a guarded memory pool without waiting", + oslib_test_004_002_setup, NULL, oslib_test_004_002_execute }; +#endif /* CH_CFG_USE_SEMAPHORES */ + +#if (CH_CFG_USE_SEMAPHORES) || defined(__DOXYGEN__) +/** + * @page oslib_test_004_003 [4.3] Guarded Memory Pools timeout + * + *

Description

+ * The timeout features for the Guarded Memory Pools is tested. + * + *

Conditions

+ * This test is only executed if the following preprocessor condition + * evaluates to true: + * - CH_CFG_USE_SEMAPHORES + * . + * + *

Test Steps

+ * - [4.3.1] Trying to allocate with 100mS timeout, must fail because + * the pool is empty. + * . + */ + +static void oslib_test_004_003_setup(void) { + chGuardedPoolObjectInit(&gmp1, sizeof (uint32_t)); +} + +static void oslib_test_004_003_execute(void) { + + /* [4.3.1] Trying to allocate with 100mS timeout, must fail because + the pool is empty.*/ + test_set_step(1); + { + test_assert(chGuardedPoolAllocTimeout(&gmp1, TIME_MS2I(100)) == NULL, "list not empty"); + } +} + +static const testcase_t oslib_test_004_003 = { + "Guarded Memory Pools timeout", + oslib_test_004_003_setup, + NULL, + oslib_test_004_003_execute +}; +#endif /* CH_CFG_USE_SEMAPHORES */ /**************************************************************************** * Exported data. @@ -265,16 +283,21 @@ static const testcase_t oslib_test_004_002 = { */ const testcase_t * const oslib_test_sequence_004_array[] = { &oslib_test_004_001, +#if (CH_CFG_USE_SEMAPHORES) || defined(__DOXYGEN__) &oslib_test_004_002, +#endif +#if (CH_CFG_USE_SEMAPHORES) || defined(__DOXYGEN__) + &oslib_test_004_003, +#endif NULL }; /** - * @brief Memory Heaps. + * @brief Memory Pools. */ const testsequence_t oslib_test_sequence_004 = { - "Memory Heaps", + "Memory Pools", oslib_test_sequence_004_array }; -#endif /* CH_CFG_USE_HEAP */ +#endif /* CH_CFG_USE_MEMPOOLS */ diff --git a/test/oslib/source/test/oslib_test_sequence_005.c b/test/oslib/source/test/oslib_test_sequence_005.c index 88be96fa8..f33d9cadf 100644 --- a/test/oslib/source/test/oslib_test_sequence_005.c +++ b/test/oslib/source/test/oslib_test_sequence_005.c @@ -21,725 +21,240 @@ * @file oslib_test_sequence_005.c * @brief Test Sequence 005 code. * - * @page oslib_test_sequence_005 [5] Objects Factory + * @page oslib_test_sequence_005 [5] Memory Heaps * * File: @ref oslib_test_sequence_005.c * *

Description

* This sequence tests the ChibiOS library functionalities related to - * the object factory. + * memory heaps. * *

Conditions

* This sequence is only executed if the following preprocessor condition * evaluates to true: - * - (CH_CFG_USE_FACTORY == TRUE) && (CH_CFG_USE_MEMPOOLS == TRUE) && (CH_CFG_USE_HEAP == TRUE) + * - CH_CFG_USE_HEAP * . * *

Test Cases

* - @subpage oslib_test_005_001 * - @subpage oslib_test_005_002 - * - @subpage oslib_test_005_003 - * - @subpage oslib_test_005_004 - * - @subpage oslib_test_005_005 - * - @subpage oslib_test_005_006 * . */ -#if ((CH_CFG_USE_FACTORY == TRUE) && (CH_CFG_USE_MEMPOOLS == TRUE) && (CH_CFG_USE_HEAP == TRUE)) || defined(__DOXYGEN__) +#if (CH_CFG_USE_HEAP) || defined(__DOXYGEN__) /**************************************************************************** * Shared code. ****************************************************************************/ +#define ALLOC_SIZE 16 +#define HEAP_SIZE (ALLOC_SIZE * 8) + +static memory_heap_t test_heap; +static uint8_t test_heap_buffer[HEAP_SIZE]; /**************************************************************************** * Test cases. ****************************************************************************/ -#if (CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE) || defined(__DOXYGEN__) /** - * @page oslib_test_005_001 [5.1] Objects Registry + * @page oslib_test_005_001 [5.1] Allocation and fragmentation * *

Description

- * This test case verifies the static objects registry. - * - *

Conditions

- * This test is only executed if the following preprocessor condition - * evaluates to true: - * - CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE - * . + * Series of allocations/deallocations are performed in carefully + * designed sequences in order to stimulate all the possible code paths + * inside the allocator. The test expects to find the heap back to the + * initial status after each sequence. * *

Test Steps

- * - [5.1.1] Retrieving a registered object by name, must not exist. - * - [5.1.2] Registering an object, it must not exists, must succeed. - * - [5.1.3] Registering an object with the same name, must fail. - * - [5.1.4] Retrieving the registered object by name, must exist, then - * increasing the reference counter, finally releasing both - * references. - * - [5.1.5] Releasing the first reference to the object, must not - * trigger an assertion. - * - [5.1.6] Retrieving the registered object by name again, must not - * exist. + * - [5.1.1] Testing initial conditions, the heap must not be + * fragmented and one free block present. + * - [5.1.2] Trying to allocate an block bigger than available space, + * an error is expected. + * - [5.1.3] Single block allocation using chHeapAlloc() then the block + * is freed using chHeapFree(), must not fail. + * - [5.1.4] Using chHeapStatus() to assess the heap state. There must + * be at least one free block of sufficient size. + * - [5.1.5] Allocating then freeing in the same order. + * - [5.1.6] Allocating then freeing in reverse order. + * - [5.1.7] Small fragments handling. Checking the behavior when + * allocating blocks with size not multiple of alignment unit. + * - [5.1.8] Skipping a fragment, the first fragment in the list is too + * small so the allocator must pick the second one. + * - [5.1.9] Allocating the whole available space. + * - [5.1.10] Testing final conditions. The heap geometry must be the + * same than the one registered at beginning. * . */ -static void oslib_test_005_001_teardown(void) { - registered_object_t *rop; - - rop = chFactoryFindObject("myobj"); - if (rop != NULL) { - while (rop->element.refs > 0U) { - chFactoryReleaseObject(rop); - } - } +static void oslib_test_005_001_setup(void) { + chHeapObjectInit(&test_heap, test_heap_buffer, sizeof(test_heap_buffer)); } static void oslib_test_005_001_execute(void) { - registered_object_t *rop; + void *p1, *p2, *p3; + size_t n, sz; - /* [5.1.1] Retrieving a registered object by name, must not exist.*/ + /* [5.1.1] Testing initial conditions, the heap must not be + fragmented and one free block present.*/ test_set_step(1); { - rop = chFactoryFindObject("myobj"); - test_assert(rop == NULL, "found"); + test_assert(chHeapStatus(&test_heap, &sz, NULL) == 1, "heap fragmented"); } - /* [5.1.2] Registering an object, it must not exists, must succeed.*/ + /* [5.1.2] Trying to allocate an block bigger than available space, + an error is expected.*/ test_set_step(2); { - static uint32_t myobj = 0x55aa; - - rop = chFactoryRegisterObject("myobj", (void *)&myobj); - test_assert(rop != NULL, "cannot register"); + p1 = chHeapAlloc(&test_heap, sizeof test_heap_buffer * 2); + test_assert(p1 == NULL, "allocation not failed"); } - /* [5.1.3] Registering an object with the same name, must fail.*/ + /* [5.1.3] Single block allocation using chHeapAlloc() then the block + is freed using chHeapFree(), must not fail.*/ test_set_step(3); { - registered_object_t *rop1; - static uint32_t myobj = 0x55aa; - - rop1 = chFactoryRegisterObject("myobj", (void *)&myobj); - test_assert(rop1 == NULL, "can register"); + p1 = chHeapAlloc(&test_heap, ALLOC_SIZE); + test_assert(p1 != NULL, "allocation failed"); + chHeapFree(p1); } - /* [5.1.4] Retrieving the registered object by name, must exist, then - increasing the reference counter, finally releasing both - references.*/ + /* [5.1.4] Using chHeapStatus() to assess the heap state. There must + be at least one free block of sufficient size.*/ test_set_step(4); { - registered_object_t *rop1, *rop2; + size_t total_size, largest_size; - rop1 = chFactoryFindObject("myobj"); - test_assert(rop1 != NULL, "not found"); - test_assert(*(uint32_t *)(rop1->objp) == 0x55aa, "object mismatch"); - test_assert(rop == rop1, "object reference mismatch"); - test_assert(rop1->element.refs == 2, "object reference mismatch"); - - rop2 = (registered_object_t *)chFactoryDuplicateReference(&rop1->element); - test_assert(rop1 == rop2, "object reference mismatch"); - test_assert(*(uint32_t *)(rop2->objp) == 0x55aa, "object mismatch"); - test_assert(rop2->element.refs == 3, "object reference mismatch"); - - chFactoryReleaseObject(rop2); - test_assert(rop1->element.refs == 2, "references mismatch"); - - chFactoryReleaseObject(rop1); - test_assert(rop->element.refs == 1, "references mismatch"); + n = chHeapStatus(&test_heap, &total_size, &largest_size); + test_assert(n == 1, "missing free block"); + test_assert(total_size >= ALLOC_SIZE, "unexpected heap state"); + test_assert(total_size == largest_size, "unexpected heap state"); } - /* [5.1.5] Releasing the first reference to the object, must not - trigger an assertion.*/ + /* [5.1.5] Allocating then freeing in the same order.*/ test_set_step(5); { - chFactoryReleaseObject(rop); + p1 = chHeapAlloc(&test_heap, ALLOC_SIZE); + p2 = chHeapAlloc(&test_heap, ALLOC_SIZE); + p3 = chHeapAlloc(&test_heap, ALLOC_SIZE); + chHeapFree(p1); /* Does not merge.*/ + chHeapFree(p2); /* Merges backward.*/ + chHeapFree(p3); /* Merges both sides.*/ + test_assert(chHeapStatus(&test_heap, &n, NULL) == 1, "heap fragmented"); } - /* [5.1.6] Retrieving the registered object by name again, must not - exist.*/ + /* [5.1.6] Allocating then freeing in reverse order.*/ test_set_step(6); { - rop = chFactoryFindObject("myobj"); - test_assert(rop == NULL, "found"); + p1 = chHeapAlloc(&test_heap, ALLOC_SIZE); + p2 = chHeapAlloc(&test_heap, ALLOC_SIZE); + p3 = chHeapAlloc(&test_heap, ALLOC_SIZE); + chHeapFree(p3); /* Merges forward.*/ + chHeapFree(p2); /* Merges forward.*/ + chHeapFree(p1); /* Merges forward.*/ + test_assert(chHeapStatus(&test_heap, &n, NULL) == 1, "heap fragmented"); + } + + /* [5.1.7] Small fragments handling. Checking the behavior when + allocating blocks with size not multiple of alignment unit.*/ + test_set_step(7); + { + p1 = chHeapAlloc(&test_heap, ALLOC_SIZE + 1); + p2 = chHeapAlloc(&test_heap, ALLOC_SIZE); + chHeapFree(p1); + test_assert(chHeapStatus(&test_heap, &n, NULL) == 2, "invalid state"); + p1 = chHeapAlloc(&test_heap, ALLOC_SIZE); + /* Note, the first situation happens when the alignment size is smaller + than the header size, the second in the other cases.*/ + test_assert((chHeapStatus(&test_heap, &n, NULL) == 1) || + (chHeapStatus(&test_heap, &n, NULL) == 2), "heap fragmented"); + chHeapFree(p2); + chHeapFree(p1); + test_assert(chHeapStatus(&test_heap, &n, NULL) == 1, "heap fragmented"); + } + + /* [5.1.8] Skipping a fragment, the first fragment in the list is too + small so the allocator must pick the second one.*/ + test_set_step(8); + { + p1 = chHeapAlloc(&test_heap, ALLOC_SIZE); + p2 = chHeapAlloc(&test_heap, ALLOC_SIZE); + chHeapFree(p1); + test_assert( chHeapStatus(&test_heap, &n, NULL) == 2, "invalid state"); + p1 = chHeapAlloc(&test_heap, ALLOC_SIZE * 2); /* Skips first fragment.*/ + chHeapFree(p1); + chHeapFree(p2); + test_assert(chHeapStatus(&test_heap, &n, NULL) == 1, "heap fragmented"); + } + + /* [5.1.9] Allocating the whole available space.*/ + test_set_step(9); + { + (void)chHeapStatus(&test_heap, &n, NULL); + p1 = chHeapAlloc(&test_heap, n); + test_assert(p1 != NULL, "allocation failed"); + test_assert(chHeapStatus(&test_heap, NULL, NULL) == 0, "not empty"); + chHeapFree(p1); + } + + /* [5.1.10] Testing final conditions. The heap geometry must be the + same than the one registered at beginning.*/ + test_set_step(10); + { + test_assert(chHeapStatus(&test_heap, &n, NULL) == 1, "heap fragmented"); + test_assert(n == sz, "size changed"); } } static const testcase_t oslib_test_005_001 = { - "Objects Registry", + "Allocation and fragmentation", + oslib_test_005_001_setup, NULL, - oslib_test_005_001_teardown, oslib_test_005_001_execute }; -#endif /* CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE */ -#if (CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE) || defined(__DOXYGEN__) /** - * @page oslib_test_005_002 [5.2] Dynamic Buffers Factory + * @page oslib_test_005_002 [5.2] Default Heap * *

Description

- * This test case verifies the dynamic buffers factory. - * - *

Conditions

- * This test is only executed if the following preprocessor condition - * evaluates to true: - * - CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE - * . + * The default heap is pre-allocated in the system. We test base + * functionality. * *

Test Steps

- * - [5.2.1] Retrieving a dynamic buffer by name, must not exist. - * - [5.2.2] Creating a dynamic buffer it must not exists, must - * succeed. - * - [5.2.3] Creating a dynamic buffer with the same name, must fail. - * - [5.2.4] Retrieving the dynamic buffer by name, must exist, then - * increasing the reference counter, finally releasing both - * references. - * - [5.2.5] Releasing the first reference to the dynamic buffer, must - * not trigger an assertion. - * - [5.2.6] Retrieving the dynamic buffer by name again, must not - * exist. + * - [5.2.1] Single block allocation using chHeapAlloc() then the block + * is freed using chHeapFree(), must not fail. + * - [5.2.2] Testing allocation failure. * . */ -static void oslib_test_005_002_teardown(void) { - dyn_buffer_t *dbp; - - dbp = chFactoryFindBuffer("mybuf"); - if (dbp != NULL) { - while (dbp->element.refs > 0U) { - chFactoryReleaseBuffer(dbp); - } - } -} - static void oslib_test_005_002_execute(void) { - dyn_buffer_t *dbp; + void *p1; + size_t total_size, largest_size; - /* [5.2.1] Retrieving a dynamic buffer by name, must not exist.*/ + /* [5.2.1] Single block allocation using chHeapAlloc() then the block + is freed using chHeapFree(), must not fail.*/ test_set_step(1); { - dbp = chFactoryFindBuffer("mybuf"); - test_assert(dbp == NULL, "found"); + (void)chHeapStatus(NULL, &total_size, &largest_size); + p1 = chHeapAlloc(&test_heap, ALLOC_SIZE); + test_assert(p1 != NULL, "allocation failed"); + chHeapFree(p1); } - /* [5.2.2] Creating a dynamic buffer it must not exists, must - succeed.*/ + /* [5.2.2] Testing allocation failure.*/ test_set_step(2); { - dbp = chFactoryCreateBuffer("mybuf", 128U); - test_assert(dbp != NULL, "cannot create"); - } - - /* [5.2.3] Creating a dynamic buffer with the same name, must fail.*/ - test_set_step(3); - { - dyn_buffer_t *dbp1; - - dbp1 = chFactoryCreateBuffer("mybuf", 128U); - test_assert(dbp1 == NULL, "can create"); - } - - /* [5.2.4] Retrieving the dynamic buffer by name, must exist, then - increasing the reference counter, finally releasing both - references.*/ - test_set_step(4); - { - dyn_buffer_t *dbp1, *dbp2; - - dbp1 = chFactoryFindBuffer("mybuf"); - test_assert(dbp1 != NULL, "not found"); - test_assert(dbp == dbp1, "object reference mismatch"); - test_assert(dbp1->element.refs == 2, "object reference mismatch"); - - dbp2 = (dyn_buffer_t *)chFactoryDuplicateReference(&dbp1->element); - test_assert(dbp1 == dbp2, "object reference mismatch"); - test_assert(dbp2->element.refs == 3, "object reference mismatch"); - - chFactoryReleaseBuffer(dbp2); - test_assert(dbp1->element.refs == 2, "references mismatch"); - - chFactoryReleaseBuffer(dbp1); - test_assert(dbp->element.refs == 1, "references mismatch"); - } - - /* [5.2.5] Releasing the first reference to the dynamic buffer, must - not trigger an assertion.*/ - test_set_step(5); - { - chFactoryReleaseBuffer(dbp); - } - - /* [5.2.6] Retrieving the dynamic buffer by name again, must not - exist.*/ - test_set_step(6); - { - dbp = chFactoryFindBuffer("mybuf"); - test_assert(dbp == NULL, "found"); + p1 = chHeapAlloc(NULL, (size_t)-256); + test_assert(p1 == NULL, "allocation not failed"); } } static const testcase_t oslib_test_005_002 = { - "Dynamic Buffers Factory", + "Default Heap", + NULL, NULL, - oslib_test_005_002_teardown, oslib_test_005_002_execute }; -#endif /* CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE */ - -#if (CH_CFG_FACTORY_SEMAPHORES == TRUE) || defined(__DOXYGEN__) -/** - * @page oslib_test_005_003 [5.3] Dynamic Semaphores Factory - * - *

Description

- * This test case verifies the dynamic semaphores factory. - * - *

Conditions

- * This test is only executed if the following preprocessor condition - * evaluates to true: - * - CH_CFG_FACTORY_SEMAPHORES == TRUE - * . - * - *

Test Steps

- * - [5.3.1] Retrieving a dynamic semaphore by name, must not exist. - * - [5.3.2] Creating a dynamic semaphore it must not exists, must - * succeed. - * - [5.3.3] Creating a dynamic semaphore with the same name, must - * fail. - * - [5.3.4] Retrieving the dynamic semaphore by name, must exist, then - * increasing the reference counter, finally releasing both - * references. - * - [5.3.5] Releasing the first reference to the dynamic semaphore - * must not trigger an assertion. - * - [5.3.6] Retrieving the dynamic semaphore by name again, must not - * exist. - * . - */ - -static void oslib_test_005_003_teardown(void) { - dyn_semaphore_t *dsp; - - dsp = chFactoryFindSemaphore("mysem"); - if (dsp != NULL) { - while (dsp->element.refs > 0U) { - chFactoryReleaseSemaphore(dsp); - } - } -} - -static void oslib_test_005_003_execute(void) { - dyn_semaphore_t *dsp; - - /* [5.3.1] Retrieving a dynamic semaphore by name, must not exist.*/ - test_set_step(1); - { - dsp = chFactoryFindSemaphore("mysem"); - test_assert(dsp == NULL, "found"); - } - - /* [5.3.2] Creating a dynamic semaphore it must not exists, must - succeed.*/ - test_set_step(2); - { - dsp = chFactoryCreateSemaphore("mysem", 0); - test_assert(dsp != NULL, "cannot create"); - } - - /* [5.3.3] Creating a dynamic semaphore with the same name, must - fail.*/ - test_set_step(3); - { - dyn_semaphore_t *dsp1; - - dsp1 = chFactoryCreateSemaphore("mysem", 0); - test_assert(dsp1 == NULL, "can create"); - } - - /* [5.3.4] Retrieving the dynamic semaphore by name, must exist, then - increasing the reference counter, finally releasing both - references.*/ - test_set_step(4); - { - dyn_semaphore_t *dsp1, *dsp2; - - dsp1 = chFactoryFindSemaphore("mysem"); - test_assert(dsp1 != NULL, "not found"); - test_assert(dsp == dsp1, "object reference mismatch"); - test_assert(dsp1->element.refs == 2, "object reference mismatch"); - - dsp2 = (dyn_semaphore_t *)chFactoryDuplicateReference(&dsp1->element); - test_assert(dsp1 == dsp2, "object reference mismatch"); - test_assert(dsp2->element.refs == 3, "object reference mismatch"); - - chFactoryReleaseSemaphore(dsp2); - test_assert(dsp1->element.refs == 2, "references mismatch"); - - chFactoryReleaseSemaphore(dsp1); - test_assert(dsp->element.refs == 1, "references mismatch"); - } - - /* [5.3.5] Releasing the first reference to the dynamic semaphore - must not trigger an assertion.*/ - test_set_step(5); - { - chFactoryReleaseSemaphore(dsp); - } - - /* [5.3.6] Retrieving the dynamic semaphore by name again, must not - exist.*/ - test_set_step(6); - { - dsp = chFactoryFindSemaphore("mysem"); - test_assert(dsp == NULL, "found"); - } -} - -static const testcase_t oslib_test_005_003 = { - "Dynamic Semaphores Factory", - NULL, - oslib_test_005_003_teardown, - oslib_test_005_003_execute -}; -#endif /* CH_CFG_FACTORY_SEMAPHORES == TRUE */ - -#if (CH_CFG_FACTORY_MAILBOXES == TRUE) || defined(__DOXYGEN__) -/** - * @page oslib_test_005_004 [5.4] Dynamic Mailboxes Factory - * - *

Description

- * This test case verifies the dynamic mailboxes factory. - * - *

Conditions

- * This test is only executed if the following preprocessor condition - * evaluates to true: - * - CH_CFG_FACTORY_MAILBOXES == TRUE - * . - * - *

Test Steps

- * - [5.4.1] Retrieving a dynamic mailbox by name, must not exist. - * - [5.4.2] Creating a dynamic mailbox it must not exists, must - * succeed. - * - [5.4.3] Creating a dynamic mailbox with the same name, must fail. - * - [5.4.4] Retrieving the dynamic mailbox by name, must exist, then - * increasing the reference counter, finally releasing both - * references. - * - [5.4.5] Releasing the first reference to the dynamic mailbox must - * not trigger an assertion. - * - [5.4.6] Retrieving the dynamic mailbox by name again, must not - * exist. - * . - */ - -static void oslib_test_005_004_teardown(void) { - dyn_mailbox_t *dmp; - - dmp = chFactoryFindMailbox("mymbx"); - if (dmp != NULL) { - while (dmp->element.refs > 0U) { - chFactoryReleaseMailbox(dmp); - } - } -} - -static void oslib_test_005_004_execute(void) { - dyn_mailbox_t *dmp; - - /* [5.4.1] Retrieving a dynamic mailbox by name, must not exist.*/ - test_set_step(1); - { - dmp = chFactoryFindMailbox("mymbx"); - test_assert(dmp == NULL, "found"); - } - - /* [5.4.2] Creating a dynamic mailbox it must not exists, must - succeed.*/ - test_set_step(2); - { - dmp = chFactoryCreateMailbox("mymbx", 16U); - test_assert(dmp != NULL, "cannot create"); - } - - /* [5.4.3] Creating a dynamic mailbox with the same name, must - fail.*/ - test_set_step(3); - { - dyn_mailbox_t *dmp1; - - dmp1 = chFactoryCreateMailbox("mymbx", 16U); - test_assert(dmp1 == NULL, "can create"); - } - - /* [5.4.4] Retrieving the dynamic mailbox by name, must exist, then - increasing the reference counter, finally releasing both - references.*/ - test_set_step(4); - { - dyn_mailbox_t *dmp1, *dmp2; - - dmp1 = chFactoryFindMailbox("mymbx"); - test_assert(dmp1 != NULL, "not found"); - test_assert(dmp == dmp1, "object reference mismatch"); - test_assert(dmp1->element.refs == 2, "object reference mismatch"); - - dmp2 = (dyn_mailbox_t *)chFactoryDuplicateReference(&dmp1->element); - test_assert(dmp1 == dmp2, "object reference mismatch"); - test_assert(dmp2->element.refs == 3, "object reference mismatch"); - - chFactoryReleaseMailbox(dmp2); - test_assert(dmp1->element.refs == 2, "references mismatch"); - - chFactoryReleaseMailbox(dmp1); - test_assert(dmp->element.refs == 1, "references mismatch"); - } - - /* [5.4.5] Releasing the first reference to the dynamic mailbox must - not trigger an assertion.*/ - test_set_step(5); - { - chFactoryReleaseMailbox(dmp); - } - - /* [5.4.6] Retrieving the dynamic mailbox by name again, must not - exist.*/ - test_set_step(6); - { - dmp = chFactoryFindMailbox("mymbx"); - test_assert(dmp == NULL, "found"); - } -} - -static const testcase_t oslib_test_005_004 = { - "Dynamic Mailboxes Factory", - NULL, - oslib_test_005_004_teardown, - oslib_test_005_004_execute -}; -#endif /* CH_CFG_FACTORY_MAILBOXES == TRUE */ - -#if (CH_CFG_FACTORY_OBJ_FIFOS == TRUE) || defined(__DOXYGEN__) -/** - * @page oslib_test_005_005 [5.5] Dynamic Objects FIFOs Factory - * - *

Description

- * This test case verifies the dynamic objects FIFOs factory. - * - *

Conditions

- * This test is only executed if the following preprocessor condition - * evaluates to true: - * - CH_CFG_FACTORY_OBJ_FIFOS == TRUE - * . - * - *

Test Steps

- * - [5.5.1] Retrieving a dynamic objects FIFO by name, must not exist. - * - [5.5.2] Creating a dynamic objects FIFO it must not exists, must - * succeed. - * - [5.5.3] Creating a dynamic objects FIFO with the same name, must - * fail. - * - [5.5.4] Retrieving the dynamic objects FIFO by name, must exist, - * then increasing the reference counter, finally releasing both - * references. - * - [5.5.5] Releasing the first reference to the dynamic objects FIFO - * must not trigger an assertion. - * - [5.5.6] Retrieving the dynamic objects FIFO by name again, must - * not exist. - * . - */ - -static void oslib_test_005_005_teardown(void) { - dyn_objects_fifo_t *dofp; - - dofp = chFactoryFindObjectsFIFO("myfifo"); - if (dofp != NULL) { - while (dofp->element.refs > 0U) { - chFactoryReleaseObjectsFIFO(dofp); - } - } -} - -static void oslib_test_005_005_execute(void) { - dyn_objects_fifo_t *dofp; - - /* [5.5.1] Retrieving a dynamic objects FIFO by name, must not - exist.*/ - test_set_step(1); - { - dofp = chFactoryFindObjectsFIFO("myfifo"); - test_assert(dofp == NULL, "found"); - } - - /* [5.5.2] Creating a dynamic objects FIFO it must not exists, must - succeed.*/ - test_set_step(2); - { - dofp = chFactoryCreateObjectsFIFO("myfifo", 16U, 16U, PORT_NATURAL_ALIGN); - test_assert(dofp != NULL, "cannot create"); - } - - /* [5.5.3] Creating a dynamic objects FIFO with the same name, must - fail.*/ - test_set_step(3); - { - dyn_objects_fifo_t *dofp1; - - dofp1 = chFactoryCreateObjectsFIFO("myfifo", 16U, 16U, PORT_NATURAL_ALIGN); - test_assert(dofp1 == NULL, "can create"); - } - - /* [5.5.4] Retrieving the dynamic objects FIFO by name, must exist, - then increasing the reference counter, finally releasing both - references.*/ - test_set_step(4); - { - dyn_objects_fifo_t *dofp1, *dofp2; - - dofp1 = chFactoryFindObjectsFIFO("myfifo"); - test_assert(dofp1 != NULL, "not found"); - test_assert(dofp == dofp1, "object reference mismatch"); - test_assert(dofp1->element.refs == 2, "object reference mismatch"); - - dofp2 = (dyn_objects_fifo_t *)chFactoryDuplicateReference(&dofp1->element); - test_assert(dofp1 == dofp2, "object reference mismatch"); - test_assert(dofp2->element.refs == 3, "object reference mismatch"); - - chFactoryReleaseObjectsFIFO(dofp2); - test_assert(dofp1->element.refs == 2, "references mismatch"); - - chFactoryReleaseObjectsFIFO(dofp1); - test_assert(dofp->element.refs == 1, "references mismatch"); - } - - /* [5.5.5] Releasing the first reference to the dynamic objects FIFO - must not trigger an assertion.*/ - test_set_step(5); - { - chFactoryReleaseObjectsFIFO(dofp); - } - - /* [5.5.6] Retrieving the dynamic objects FIFO by name again, must - not exist.*/ - test_set_step(6); - { - dofp = chFactoryFindObjectsFIFO("myfifo"); - test_assert(dofp == NULL, "found"); - } -} - -static const testcase_t oslib_test_005_005 = { - "Dynamic Objects FIFOs Factory", - NULL, - oslib_test_005_005_teardown, - oslib_test_005_005_execute -}; -#endif /* CH_CFG_FACTORY_OBJ_FIFOS == TRUE */ - -#if (CH_CFG_FACTORY_PIPES == TRUE) || defined(__DOXYGEN__) -/** - * @page oslib_test_005_006 [5.6] Dynamic Pipes Factory - * - *

Description

- * This test case verifies the dynamic pipes factory. - * - *

Conditions

- * This test is only executed if the following preprocessor condition - * evaluates to true: - * - CH_CFG_FACTORY_PIPES == TRUE - * . - * - *

Test Steps

- * - [5.6.1] Retrieving a dynamic pipe by name, must not exist. - * - [5.6.2] Creating a dynamic pipe it must not exists, must succeed. - * - [5.6.3] Creating a dynamic pipe with the same name, must fail. - * - [5.6.4] Retrieving the dynamic pipe by name, must exist, then - * increasing the reference counter, finally releasing both - * references. - * - [5.6.5] Releasing the first reference to the dynamic pipe must not - * trigger an assertion. - * - [5.6.6] Retrieving the dynamic pipe by name again, must not exist. - * . - */ - -static void oslib_test_005_006_teardown(void) { - dyn_pipe_t *dpp; - - dpp = chFactoryFindPipe("mypipe"); - if (dpp != NULL) { - while (dpp->element.refs > 0U) { - chFactoryReleasePipe(dpp); - } - } -} - -static void oslib_test_005_006_execute(void) { - dyn_pipe_t *dpp; - - /* [5.6.1] Retrieving a dynamic pipe by name, must not exist.*/ - test_set_step(1); - { - dpp = chFactoryFindPipe("mypipe"); - test_assert(dpp == NULL, "found"); - } - - /* [5.6.2] Creating a dynamic pipe it must not exists, must - succeed.*/ - test_set_step(2); - { - dpp = chFactoryCreatePipe("mypipe", 16U); - test_assert(dpp != NULL, "cannot create"); - } - - /* [5.6.3] Creating a dynamic pipe with the same name, must fail.*/ - test_set_step(3); - { - dyn_pipe_t *dpp1; - - dpp1 = chFactoryCreatePipe("mypipe", 16U); - test_assert(dpp1 == NULL, "can create"); - } - - /* [5.6.4] Retrieving the dynamic pipe by name, must exist, then - increasing the reference counter, finally releasing both - references.*/ - test_set_step(4); - { - dyn_pipe_t *dpp1, *dpp2; - - dpp1 = chFactoryFindPipe("mypipe"); - test_assert(dpp1 != NULL, "not found"); - test_assert(dpp == dpp1, "object reference mismatch"); - test_assert(dpp1->element.refs == 2, "object reference mismatch"); - - dpp2 = (dyn_pipe_t *)chFactoryDuplicateReference(&dpp1->element); - test_assert(dpp1 == dpp2, "object reference mismatch"); - test_assert(dpp2->element.refs == 3, "object reference mismatch"); - - chFactoryReleasePipe(dpp2); - test_assert(dpp1->element.refs == 2, "references mismatch"); - - chFactoryReleasePipe(dpp1); - test_assert(dpp->element.refs == 1, "references mismatch"); - } - - /* [5.6.5] Releasing the first reference to the dynamic pipe must not - trigger an assertion.*/ - test_set_step(5); - { - chFactoryReleasePipe(dpp); - } - - /* [5.6.6] Retrieving the dynamic pipe by name again, must not - exist.*/ - test_set_step(6); - { - dpp = chFactoryFindPipe("mypipe"); - test_assert(dpp == NULL, "found"); - } -} - -static const testcase_t oslib_test_005_006 = { - "Dynamic Pipes Factory", - NULL, - oslib_test_005_006_teardown, - oslib_test_005_006_execute -}; -#endif /* CH_CFG_FACTORY_PIPES == TRUE */ /**************************************************************************** * Exported data. @@ -749,33 +264,17 @@ static const testcase_t oslib_test_005_006 = { * @brief Array of test cases. */ const testcase_t * const oslib_test_sequence_005_array[] = { -#if (CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE) || defined(__DOXYGEN__) &oslib_test_005_001, -#endif -#if (CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE) || defined(__DOXYGEN__) &oslib_test_005_002, -#endif -#if (CH_CFG_FACTORY_SEMAPHORES == TRUE) || defined(__DOXYGEN__) - &oslib_test_005_003, -#endif -#if (CH_CFG_FACTORY_MAILBOXES == TRUE) || defined(__DOXYGEN__) - &oslib_test_005_004, -#endif -#if (CH_CFG_FACTORY_OBJ_FIFOS == TRUE) || defined(__DOXYGEN__) - &oslib_test_005_005, -#endif -#if (CH_CFG_FACTORY_PIPES == TRUE) || defined(__DOXYGEN__) - &oslib_test_005_006, -#endif NULL }; /** - * @brief Objects Factory. + * @brief Memory Heaps. */ const testsequence_t oslib_test_sequence_005 = { - "Objects Factory", + "Memory Heaps", oslib_test_sequence_005_array }; -#endif /* (CH_CFG_USE_FACTORY == TRUE) && (CH_CFG_USE_MEMPOOLS == TRUE) && (CH_CFG_USE_HEAP == TRUE) */ +#endif /* CH_CFG_USE_HEAP */ diff --git a/test/oslib/source/test/oslib_test_sequence_006.c b/test/oslib/source/test/oslib_test_sequence_006.c new file mode 100644 index 000000000..0cef3a1ca --- /dev/null +++ b/test/oslib/source/test/oslib_test_sequence_006.c @@ -0,0 +1,781 @@ +/* + ChibiOS - Copyright (C) 2006..2017 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "hal.h" +#include "oslib_test_root.h" + +/** + * @file oslib_test_sequence_006.c + * @brief Test Sequence 006 code. + * + * @page oslib_test_sequence_006 [6] Objects Factory + * + * File: @ref oslib_test_sequence_006.c + * + *

Description

+ * This sequence tests the ChibiOS library functionalities related to + * the object factory. + * + *

Conditions

+ * This sequence is only executed if the following preprocessor condition + * evaluates to true: + * - (CH_CFG_USE_FACTORY == TRUE) && (CH_CFG_USE_MEMPOOLS == TRUE) && (CH_CFG_USE_HEAP == TRUE) + * . + * + *

Test Cases

+ * - @subpage oslib_test_006_001 + * - @subpage oslib_test_006_002 + * - @subpage oslib_test_006_003 + * - @subpage oslib_test_006_004 + * - @subpage oslib_test_006_005 + * - @subpage oslib_test_006_006 + * . + */ + +#if ((CH_CFG_USE_FACTORY == TRUE) && (CH_CFG_USE_MEMPOOLS == TRUE) && (CH_CFG_USE_HEAP == TRUE)) || defined(__DOXYGEN__) + +/**************************************************************************** + * Shared code. + ****************************************************************************/ + + +/**************************************************************************** + * Test cases. + ****************************************************************************/ + +#if (CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE) || defined(__DOXYGEN__) +/** + * @page oslib_test_006_001 [6.1] Objects Registry + * + *

Description

+ * This test case verifies the static objects registry. + * + *

Conditions

+ * This test is only executed if the following preprocessor condition + * evaluates to true: + * - CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE + * . + * + *

Test Steps

+ * - [6.1.1] Retrieving a registered object by name, must not exist. + * - [6.1.2] Registering an object, it must not exists, must succeed. + * - [6.1.3] Registering an object with the same name, must fail. + * - [6.1.4] Retrieving the registered object by name, must exist, then + * increasing the reference counter, finally releasing both + * references. + * - [6.1.5] Releasing the first reference to the object, must not + * trigger an assertion. + * - [6.1.6] Retrieving the registered object by name again, must not + * exist. + * . + */ + +static void oslib_test_006_001_teardown(void) { + registered_object_t *rop; + + rop = chFactoryFindObject("myobj"); + if (rop != NULL) { + while (rop->element.refs > 0U) { + chFactoryReleaseObject(rop); + } + } +} + +static void oslib_test_006_001_execute(void) { + registered_object_t *rop; + + /* [6.1.1] Retrieving a registered object by name, must not exist.*/ + test_set_step(1); + { + rop = chFactoryFindObject("myobj"); + test_assert(rop == NULL, "found"); + } + + /* [6.1.2] Registering an object, it must not exists, must succeed.*/ + test_set_step(2); + { + static uint32_t myobj = 0x55aa; + + rop = chFactoryRegisterObject("myobj", (void *)&myobj); + test_assert(rop != NULL, "cannot register"); + } + + /* [6.1.3] Registering an object with the same name, must fail.*/ + test_set_step(3); + { + registered_object_t *rop1; + static uint32_t myobj = 0x55aa; + + rop1 = chFactoryRegisterObject("myobj", (void *)&myobj); + test_assert(rop1 == NULL, "can register"); + } + + /* [6.1.4] Retrieving the registered object by name, must exist, then + increasing the reference counter, finally releasing both + references.*/ + test_set_step(4); + { + registered_object_t *rop1, *rop2; + + rop1 = chFactoryFindObject("myobj"); + test_assert(rop1 != NULL, "not found"); + test_assert(*(uint32_t *)(rop1->objp) == 0x55aa, "object mismatch"); + test_assert(rop == rop1, "object reference mismatch"); + test_assert(rop1->element.refs == 2, "object reference mismatch"); + + rop2 = (registered_object_t *)chFactoryDuplicateReference(&rop1->element); + test_assert(rop1 == rop2, "object reference mismatch"); + test_assert(*(uint32_t *)(rop2->objp) == 0x55aa, "object mismatch"); + test_assert(rop2->element.refs == 3, "object reference mismatch"); + + chFactoryReleaseObject(rop2); + test_assert(rop1->element.refs == 2, "references mismatch"); + + chFactoryReleaseObject(rop1); + test_assert(rop->element.refs == 1, "references mismatch"); + } + + /* [6.1.5] Releasing the first reference to the object, must not + trigger an assertion.*/ + test_set_step(5); + { + chFactoryReleaseObject(rop); + } + + /* [6.1.6] Retrieving the registered object by name again, must not + exist.*/ + test_set_step(6); + { + rop = chFactoryFindObject("myobj"); + test_assert(rop == NULL, "found"); + } +} + +static const testcase_t oslib_test_006_001 = { + "Objects Registry", + NULL, + oslib_test_006_001_teardown, + oslib_test_006_001_execute +}; +#endif /* CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE */ + +#if (CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE) || defined(__DOXYGEN__) +/** + * @page oslib_test_006_002 [6.2] Dynamic Buffers Factory + * + *

Description

+ * This test case verifies the dynamic buffers factory. + * + *

Conditions

+ * This test is only executed if the following preprocessor condition + * evaluates to true: + * - CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE + * . + * + *

Test Steps

+ * - [6.2.1] Retrieving a dynamic buffer by name, must not exist. + * - [6.2.2] Creating a dynamic buffer it must not exists, must + * succeed. + * - [6.2.3] Creating a dynamic buffer with the same name, must fail. + * - [6.2.4] Retrieving the dynamic buffer by name, must exist, then + * increasing the reference counter, finally releasing both + * references. + * - [6.2.5] Releasing the first reference to the dynamic buffer, must + * not trigger an assertion. + * - [6.2.6] Retrieving the dynamic buffer by name again, must not + * exist. + * . + */ + +static void oslib_test_006_002_teardown(void) { + dyn_buffer_t *dbp; + + dbp = chFactoryFindBuffer("mybuf"); + if (dbp != NULL) { + while (dbp->element.refs > 0U) { + chFactoryReleaseBuffer(dbp); + } + } +} + +static void oslib_test_006_002_execute(void) { + dyn_buffer_t *dbp; + + /* [6.2.1] Retrieving a dynamic buffer by name, must not exist.*/ + test_set_step(1); + { + dbp = chFactoryFindBuffer("mybuf"); + test_assert(dbp == NULL, "found"); + } + + /* [6.2.2] Creating a dynamic buffer it must not exists, must + succeed.*/ + test_set_step(2); + { + dbp = chFactoryCreateBuffer("mybuf", 128U); + test_assert(dbp != NULL, "cannot create"); + } + + /* [6.2.3] Creating a dynamic buffer with the same name, must fail.*/ + test_set_step(3); + { + dyn_buffer_t *dbp1; + + dbp1 = chFactoryCreateBuffer("mybuf", 128U); + test_assert(dbp1 == NULL, "can create"); + } + + /* [6.2.4] Retrieving the dynamic buffer by name, must exist, then + increasing the reference counter, finally releasing both + references.*/ + test_set_step(4); + { + dyn_buffer_t *dbp1, *dbp2; + + dbp1 = chFactoryFindBuffer("mybuf"); + test_assert(dbp1 != NULL, "not found"); + test_assert(dbp == dbp1, "object reference mismatch"); + test_assert(dbp1->element.refs == 2, "object reference mismatch"); + + dbp2 = (dyn_buffer_t *)chFactoryDuplicateReference(&dbp1->element); + test_assert(dbp1 == dbp2, "object reference mismatch"); + test_assert(dbp2->element.refs == 3, "object reference mismatch"); + + chFactoryReleaseBuffer(dbp2); + test_assert(dbp1->element.refs == 2, "references mismatch"); + + chFactoryReleaseBuffer(dbp1); + test_assert(dbp->element.refs == 1, "references mismatch"); + } + + /* [6.2.5] Releasing the first reference to the dynamic buffer, must + not trigger an assertion.*/ + test_set_step(5); + { + chFactoryReleaseBuffer(dbp); + } + + /* [6.2.6] Retrieving the dynamic buffer by name again, must not + exist.*/ + test_set_step(6); + { + dbp = chFactoryFindBuffer("mybuf"); + test_assert(dbp == NULL, "found"); + } +} + +static const testcase_t oslib_test_006_002 = { + "Dynamic Buffers Factory", + NULL, + oslib_test_006_002_teardown, + oslib_test_006_002_execute +}; +#endif /* CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE */ + +#if (CH_CFG_FACTORY_SEMAPHORES == TRUE) || defined(__DOXYGEN__) +/** + * @page oslib_test_006_003 [6.3] Dynamic Semaphores Factory + * + *

Description

+ * This test case verifies the dynamic semaphores factory. + * + *

Conditions

+ * This test is only executed if the following preprocessor condition + * evaluates to true: + * - CH_CFG_FACTORY_SEMAPHORES == TRUE + * . + * + *

Test Steps

+ * - [6.3.1] Retrieving a dynamic semaphore by name, must not exist. + * - [6.3.2] Creating a dynamic semaphore it must not exists, must + * succeed. + * - [6.3.3] Creating a dynamic semaphore with the same name, must + * fail. + * - [6.3.4] Retrieving the dynamic semaphore by name, must exist, then + * increasing the reference counter, finally releasing both + * references. + * - [6.3.5] Releasing the first reference to the dynamic semaphore + * must not trigger an assertion. + * - [6.3.6] Retrieving the dynamic semaphore by name again, must not + * exist. + * . + */ + +static void oslib_test_006_003_teardown(void) { + dyn_semaphore_t *dsp; + + dsp = chFactoryFindSemaphore("mysem"); + if (dsp != NULL) { + while (dsp->element.refs > 0U) { + chFactoryReleaseSemaphore(dsp); + } + } +} + +static void oslib_test_006_003_execute(void) { + dyn_semaphore_t *dsp; + + /* [6.3.1] Retrieving a dynamic semaphore by name, must not exist.*/ + test_set_step(1); + { + dsp = chFactoryFindSemaphore("mysem"); + test_assert(dsp == NULL, "found"); + } + + /* [6.3.2] Creating a dynamic semaphore it must not exists, must + succeed.*/ + test_set_step(2); + { + dsp = chFactoryCreateSemaphore("mysem", 0); + test_assert(dsp != NULL, "cannot create"); + } + + /* [6.3.3] Creating a dynamic semaphore with the same name, must + fail.*/ + test_set_step(3); + { + dyn_semaphore_t *dsp1; + + dsp1 = chFactoryCreateSemaphore("mysem", 0); + test_assert(dsp1 == NULL, "can create"); + } + + /* [6.3.4] Retrieving the dynamic semaphore by name, must exist, then + increasing the reference counter, finally releasing both + references.*/ + test_set_step(4); + { + dyn_semaphore_t *dsp1, *dsp2; + + dsp1 = chFactoryFindSemaphore("mysem"); + test_assert(dsp1 != NULL, "not found"); + test_assert(dsp == dsp1, "object reference mismatch"); + test_assert(dsp1->element.refs == 2, "object reference mismatch"); + + dsp2 = (dyn_semaphore_t *)chFactoryDuplicateReference(&dsp1->element); + test_assert(dsp1 == dsp2, "object reference mismatch"); + test_assert(dsp2->element.refs == 3, "object reference mismatch"); + + chFactoryReleaseSemaphore(dsp2); + test_assert(dsp1->element.refs == 2, "references mismatch"); + + chFactoryReleaseSemaphore(dsp1); + test_assert(dsp->element.refs == 1, "references mismatch"); + } + + /* [6.3.5] Releasing the first reference to the dynamic semaphore + must not trigger an assertion.*/ + test_set_step(5); + { + chFactoryReleaseSemaphore(dsp); + } + + /* [6.3.6] Retrieving the dynamic semaphore by name again, must not + exist.*/ + test_set_step(6); + { + dsp = chFactoryFindSemaphore("mysem"); + test_assert(dsp == NULL, "found"); + } +} + +static const testcase_t oslib_test_006_003 = { + "Dynamic Semaphores Factory", + NULL, + oslib_test_006_003_teardown, + oslib_test_006_003_execute +}; +#endif /* CH_CFG_FACTORY_SEMAPHORES == TRUE */ + +#if (CH_CFG_FACTORY_MAILBOXES == TRUE) || defined(__DOXYGEN__) +/** + * @page oslib_test_006_004 [6.4] Dynamic Mailboxes Factory + * + *

Description

+ * This test case verifies the dynamic mailboxes factory. + * + *

Conditions

+ * This test is only executed if the following preprocessor condition + * evaluates to true: + * - CH_CFG_FACTORY_MAILBOXES == TRUE + * . + * + *

Test Steps

+ * - [6.4.1] Retrieving a dynamic mailbox by name, must not exist. + * - [6.4.2] Creating a dynamic mailbox it must not exists, must + * succeed. + * - [6.4.3] Creating a dynamic mailbox with the same name, must fail. + * - [6.4.4] Retrieving the dynamic mailbox by name, must exist, then + * increasing the reference counter, finally releasing both + * references. + * - [6.4.5] Releasing the first reference to the dynamic mailbox must + * not trigger an assertion. + * - [6.4.6] Retrieving the dynamic mailbox by name again, must not + * exist. + * . + */ + +static void oslib_test_006_004_teardown(void) { + dyn_mailbox_t *dmp; + + dmp = chFactoryFindMailbox("mymbx"); + if (dmp != NULL) { + while (dmp->element.refs > 0U) { + chFactoryReleaseMailbox(dmp); + } + } +} + +static void oslib_test_006_004_execute(void) { + dyn_mailbox_t *dmp; + + /* [6.4.1] Retrieving a dynamic mailbox by name, must not exist.*/ + test_set_step(1); + { + dmp = chFactoryFindMailbox("mymbx"); + test_assert(dmp == NULL, "found"); + } + + /* [6.4.2] Creating a dynamic mailbox it must not exists, must + succeed.*/ + test_set_step(2); + { + dmp = chFactoryCreateMailbox("mymbx", 16U); + test_assert(dmp != NULL, "cannot create"); + } + + /* [6.4.3] Creating a dynamic mailbox with the same name, must + fail.*/ + test_set_step(3); + { + dyn_mailbox_t *dmp1; + + dmp1 = chFactoryCreateMailbox("mymbx", 16U); + test_assert(dmp1 == NULL, "can create"); + } + + /* [6.4.4] Retrieving the dynamic mailbox by name, must exist, then + increasing the reference counter, finally releasing both + references.*/ + test_set_step(4); + { + dyn_mailbox_t *dmp1, *dmp2; + + dmp1 = chFactoryFindMailbox("mymbx"); + test_assert(dmp1 != NULL, "not found"); + test_assert(dmp == dmp1, "object reference mismatch"); + test_assert(dmp1->element.refs == 2, "object reference mismatch"); + + dmp2 = (dyn_mailbox_t *)chFactoryDuplicateReference(&dmp1->element); + test_assert(dmp1 == dmp2, "object reference mismatch"); + test_assert(dmp2->element.refs == 3, "object reference mismatch"); + + chFactoryReleaseMailbox(dmp2); + test_assert(dmp1->element.refs == 2, "references mismatch"); + + chFactoryReleaseMailbox(dmp1); + test_assert(dmp->element.refs == 1, "references mismatch"); + } + + /* [6.4.5] Releasing the first reference to the dynamic mailbox must + not trigger an assertion.*/ + test_set_step(5); + { + chFactoryReleaseMailbox(dmp); + } + + /* [6.4.6] Retrieving the dynamic mailbox by name again, must not + exist.*/ + test_set_step(6); + { + dmp = chFactoryFindMailbox("mymbx"); + test_assert(dmp == NULL, "found"); + } +} + +static const testcase_t oslib_test_006_004 = { + "Dynamic Mailboxes Factory", + NULL, + oslib_test_006_004_teardown, + oslib_test_006_004_execute +}; +#endif /* CH_CFG_FACTORY_MAILBOXES == TRUE */ + +#if (CH_CFG_FACTORY_OBJ_FIFOS == TRUE) || defined(__DOXYGEN__) +/** + * @page oslib_test_006_005 [6.5] Dynamic Objects FIFOs Factory + * + *

Description

+ * This test case verifies the dynamic objects FIFOs factory. + * + *

Conditions

+ * This test is only executed if the following preprocessor condition + * evaluates to true: + * - CH_CFG_FACTORY_OBJ_FIFOS == TRUE + * . + * + *

Test Steps

+ * - [6.5.1] Retrieving a dynamic objects FIFO by name, must not exist. + * - [6.5.2] Creating a dynamic objects FIFO it must not exists, must + * succeed. + * - [6.5.3] Creating a dynamic objects FIFO with the same name, must + * fail. + * - [6.5.4] Retrieving the dynamic objects FIFO by name, must exist, + * then increasing the reference counter, finally releasing both + * references. + * - [6.5.5] Releasing the first reference to the dynamic objects FIFO + * must not trigger an assertion. + * - [6.5.6] Retrieving the dynamic objects FIFO by name again, must + * not exist. + * . + */ + +static void oslib_test_006_005_teardown(void) { + dyn_objects_fifo_t *dofp; + + dofp = chFactoryFindObjectsFIFO("myfifo"); + if (dofp != NULL) { + while (dofp->element.refs > 0U) { + chFactoryReleaseObjectsFIFO(dofp); + } + } +} + +static void oslib_test_006_005_execute(void) { + dyn_objects_fifo_t *dofp; + + /* [6.5.1] Retrieving a dynamic objects FIFO by name, must not + exist.*/ + test_set_step(1); + { + dofp = chFactoryFindObjectsFIFO("myfifo"); + test_assert(dofp == NULL, "found"); + } + + /* [6.5.2] Creating a dynamic objects FIFO it must not exists, must + succeed.*/ + test_set_step(2); + { + dofp = chFactoryCreateObjectsFIFO("myfifo", 16U, 16U, PORT_NATURAL_ALIGN); + test_assert(dofp != NULL, "cannot create"); + } + + /* [6.5.3] Creating a dynamic objects FIFO with the same name, must + fail.*/ + test_set_step(3); + { + dyn_objects_fifo_t *dofp1; + + dofp1 = chFactoryCreateObjectsFIFO("myfifo", 16U, 16U, PORT_NATURAL_ALIGN); + test_assert(dofp1 == NULL, "can create"); + } + + /* [6.5.4] Retrieving the dynamic objects FIFO by name, must exist, + then increasing the reference counter, finally releasing both + references.*/ + test_set_step(4); + { + dyn_objects_fifo_t *dofp1, *dofp2; + + dofp1 = chFactoryFindObjectsFIFO("myfifo"); + test_assert(dofp1 != NULL, "not found"); + test_assert(dofp == dofp1, "object reference mismatch"); + test_assert(dofp1->element.refs == 2, "object reference mismatch"); + + dofp2 = (dyn_objects_fifo_t *)chFactoryDuplicateReference(&dofp1->element); + test_assert(dofp1 == dofp2, "object reference mismatch"); + test_assert(dofp2->element.refs == 3, "object reference mismatch"); + + chFactoryReleaseObjectsFIFO(dofp2); + test_assert(dofp1->element.refs == 2, "references mismatch"); + + chFactoryReleaseObjectsFIFO(dofp1); + test_assert(dofp->element.refs == 1, "references mismatch"); + } + + /* [6.5.5] Releasing the first reference to the dynamic objects FIFO + must not trigger an assertion.*/ + test_set_step(5); + { + chFactoryReleaseObjectsFIFO(dofp); + } + + /* [6.5.6] Retrieving the dynamic objects FIFO by name again, must + not exist.*/ + test_set_step(6); + { + dofp = chFactoryFindObjectsFIFO("myfifo"); + test_assert(dofp == NULL, "found"); + } +} + +static const testcase_t oslib_test_006_005 = { + "Dynamic Objects FIFOs Factory", + NULL, + oslib_test_006_005_teardown, + oslib_test_006_005_execute +}; +#endif /* CH_CFG_FACTORY_OBJ_FIFOS == TRUE */ + +#if (CH_CFG_FACTORY_PIPES == TRUE) || defined(__DOXYGEN__) +/** + * @page oslib_test_006_006 [6.6] Dynamic Pipes Factory + * + *

Description

+ * This test case verifies the dynamic pipes factory. + * + *

Conditions

+ * This test is only executed if the following preprocessor condition + * evaluates to true: + * - CH_CFG_FACTORY_PIPES == TRUE + * . + * + *

Test Steps

+ * - [6.6.1] Retrieving a dynamic pipe by name, must not exist. + * - [6.6.2] Creating a dynamic pipe it must not exists, must succeed. + * - [6.6.3] Creating a dynamic pipe with the same name, must fail. + * - [6.6.4] Retrieving the dynamic pipe by name, must exist, then + * increasing the reference counter, finally releasing both + * references. + * - [6.6.5] Releasing the first reference to the dynamic pipe must not + * trigger an assertion. + * - [6.6.6] Retrieving the dynamic pipe by name again, must not exist. + * . + */ + +static void oslib_test_006_006_teardown(void) { + dyn_pipe_t *dpp; + + dpp = chFactoryFindPipe("mypipe"); + if (dpp != NULL) { + while (dpp->element.refs > 0U) { + chFactoryReleasePipe(dpp); + } + } +} + +static void oslib_test_006_006_execute(void) { + dyn_pipe_t *dpp; + + /* [6.6.1] Retrieving a dynamic pipe by name, must not exist.*/ + test_set_step(1); + { + dpp = chFactoryFindPipe("mypipe"); + test_assert(dpp == NULL, "found"); + } + + /* [6.6.2] Creating a dynamic pipe it must not exists, must + succeed.*/ + test_set_step(2); + { + dpp = chFactoryCreatePipe("mypipe", 16U); + test_assert(dpp != NULL, "cannot create"); + } + + /* [6.6.3] Creating a dynamic pipe with the same name, must fail.*/ + test_set_step(3); + { + dyn_pipe_t *dpp1; + + dpp1 = chFactoryCreatePipe("mypipe", 16U); + test_assert(dpp1 == NULL, "can create"); + } + + /* [6.6.4] Retrieving the dynamic pipe by name, must exist, then + increasing the reference counter, finally releasing both + references.*/ + test_set_step(4); + { + dyn_pipe_t *dpp1, *dpp2; + + dpp1 = chFactoryFindPipe("mypipe"); + test_assert(dpp1 != NULL, "not found"); + test_assert(dpp == dpp1, "object reference mismatch"); + test_assert(dpp1->element.refs == 2, "object reference mismatch"); + + dpp2 = (dyn_pipe_t *)chFactoryDuplicateReference(&dpp1->element); + test_assert(dpp1 == dpp2, "object reference mismatch"); + test_assert(dpp2->element.refs == 3, "object reference mismatch"); + + chFactoryReleasePipe(dpp2); + test_assert(dpp1->element.refs == 2, "references mismatch"); + + chFactoryReleasePipe(dpp1); + test_assert(dpp->element.refs == 1, "references mismatch"); + } + + /* [6.6.5] Releasing the first reference to the dynamic pipe must not + trigger an assertion.*/ + test_set_step(5); + { + chFactoryReleasePipe(dpp); + } + + /* [6.6.6] Retrieving the dynamic pipe by name again, must not + exist.*/ + test_set_step(6); + { + dpp = chFactoryFindPipe("mypipe"); + test_assert(dpp == NULL, "found"); + } +} + +static const testcase_t oslib_test_006_006 = { + "Dynamic Pipes Factory", + NULL, + oslib_test_006_006_teardown, + oslib_test_006_006_execute +}; +#endif /* CH_CFG_FACTORY_PIPES == TRUE */ + +/**************************************************************************** + * Exported data. + ****************************************************************************/ + +/** + * @brief Array of test cases. + */ +const testcase_t * const oslib_test_sequence_006_array[] = { +#if (CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE) || defined(__DOXYGEN__) + &oslib_test_006_001, +#endif +#if (CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE) || defined(__DOXYGEN__) + &oslib_test_006_002, +#endif +#if (CH_CFG_FACTORY_SEMAPHORES == TRUE) || defined(__DOXYGEN__) + &oslib_test_006_003, +#endif +#if (CH_CFG_FACTORY_MAILBOXES == TRUE) || defined(__DOXYGEN__) + &oslib_test_006_004, +#endif +#if (CH_CFG_FACTORY_OBJ_FIFOS == TRUE) || defined(__DOXYGEN__) + &oslib_test_006_005, +#endif +#if (CH_CFG_FACTORY_PIPES == TRUE) || defined(__DOXYGEN__) + &oslib_test_006_006, +#endif + NULL +}; + +/** + * @brief Objects Factory. + */ +const testsequence_t oslib_test_sequence_006 = { + "Objects Factory", + oslib_test_sequence_006_array +}; + +#endif /* (CH_CFG_USE_FACTORY == TRUE) && (CH_CFG_USE_MEMPOOLS == TRUE) && (CH_CFG_USE_HEAP == TRUE) */ diff --git a/test/oslib/source/test/oslib_test_sequence_006.h b/test/oslib/source/test/oslib_test_sequence_006.h new file mode 100644 index 000000000..54c2e28ce --- /dev/null +++ b/test/oslib/source/test/oslib_test_sequence_006.h @@ -0,0 +1,27 @@ +/* + ChibiOS - Copyright (C) 2006..2017 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file oslib_test_sequence_006.h + * @brief Test Sequence 006 header. + */ + +#ifndef OSLIB_TEST_SEQUENCE_006_H +#define OSLIB_TEST_SEQUENCE_006_H + +extern const testsequence_t oslib_test_sequence_006; + +#endif /* OSLIB_TEST_SEQUENCE_006_H */ diff --git a/test/rt/configuration.xml b/test/rt/configuration.xml index a846818ab..e2692edb6 100644 --- a/test/rt/configuration.xml +++ b/test/rt/configuration.xml @@ -358,46 +358,10 @@ test_printn(CH_CFG_USE_MESSAGES); test_println(""); test_print("--- CH_CFG_USE_MESSAGES_PRIORITY: "); test_printn(CH_CFG_USE_MESSAGES_PRIORITY); -test_println(""); -test_print("--- CH_CFG_USE_MAILBOXES: "); -test_printn(CH_CFG_USE_MAILBOXES); -test_println(""); -test_print("--- CH_CFG_USE_MEMCORE: "); -test_printn(CH_CFG_USE_MEMCORE); -test_println(""); -test_print("--- CH_CFG_USE_HEAP: "); -test_printn(CH_CFG_USE_HEAP); -test_println(""); -test_print("--- CH_CFG_USE_MEMPOOLS: "); -test_printn(CH_CFG_USE_MEMPOOLS); -test_println(""); -test_print("--- CH_CFG_USE_OBJ_FIFOS: "); -test_printn(CH_CFG_USE_OBJ_FIFOS); test_println(""); test_print("--- CH_CFG_USE_DYNAMIC: "); test_printn(CH_CFG_USE_DYNAMIC); test_println(""); -test_print("--- CH_CFG_USE_FACTORY: "); -test_printn(CH_CFG_USE_FACTORY); -test_println(""); -test_print("--- CH_CFG_FACTORY_MAX_NAMES_LENGTH: "); -test_printn(CH_CFG_FACTORY_MAX_NAMES_LENGTH); -test_println(""); -test_print("--- CH_CFG_FACTORY_OBJECTS_REGISTRY: "); -test_printn(CH_CFG_FACTORY_OBJECTS_REGISTRY); -test_println(""); -test_print("--- CH_CFG_FACTORY_GENERIC_BUFFERS: "); -test_printn(CH_CFG_FACTORY_GENERIC_BUFFERS); -test_println(""); -test_print("--- CH_CFG_FACTORY_SEMAPHORES: "); -test_printn(CH_CFG_FACTORY_SEMAPHORES); -test_println(""); -test_print("--- CH_CFG_FACTORY_MAILBOXES: "); -test_printn(CH_CFG_FACTORY_MAILBOXES); -test_println(""); -test_print("--- CH_CFG_FACTORY_OBJ_FIFOS: "); -test_printn(CH_CFG_FACTORY_OBJ_FIFOS); -test_println(""); test_print("--- CH_DBG_STATISTICS: "); test_printn(CH_DBG_STATISTICS); test_println(""); diff --git a/test/rt/source/test/rt_test_sequence_001.c b/test/rt/source/test/rt_test_sequence_001.c index 5565cf7ae..518291739 100644 --- a/test/rt/source/test/rt_test_sequence_001.c +++ b/test/rt/source/test/rt_test_sequence_001.c @@ -226,45 +226,9 @@ static void rt_test_001_003_execute(void) { test_print("--- CH_CFG_USE_MESSAGES_PRIORITY: "); test_printn(CH_CFG_USE_MESSAGES_PRIORITY); test_println(""); - test_print("--- CH_CFG_USE_MAILBOXES: "); - test_printn(CH_CFG_USE_MAILBOXES); - test_println(""); - test_print("--- CH_CFG_USE_MEMCORE: "); - test_printn(CH_CFG_USE_MEMCORE); - test_println(""); - test_print("--- CH_CFG_USE_HEAP: "); - test_printn(CH_CFG_USE_HEAP); - test_println(""); - test_print("--- CH_CFG_USE_MEMPOOLS: "); - test_printn(CH_CFG_USE_MEMPOOLS); - test_println(""); - test_print("--- CH_CFG_USE_OBJ_FIFOS: "); - test_printn(CH_CFG_USE_OBJ_FIFOS); - test_println(""); test_print("--- CH_CFG_USE_DYNAMIC: "); test_printn(CH_CFG_USE_DYNAMIC); test_println(""); - test_print("--- CH_CFG_USE_FACTORY: "); - test_printn(CH_CFG_USE_FACTORY); - test_println(""); - test_print("--- CH_CFG_FACTORY_MAX_NAMES_LENGTH: "); - test_printn(CH_CFG_FACTORY_MAX_NAMES_LENGTH); - test_println(""); - test_print("--- CH_CFG_FACTORY_OBJECTS_REGISTRY: "); - test_printn(CH_CFG_FACTORY_OBJECTS_REGISTRY); - test_println(""); - test_print("--- CH_CFG_FACTORY_GENERIC_BUFFERS: "); - test_printn(CH_CFG_FACTORY_GENERIC_BUFFERS); - test_println(""); - test_print("--- CH_CFG_FACTORY_SEMAPHORES: "); - test_printn(CH_CFG_FACTORY_SEMAPHORES); - test_println(""); - test_print("--- CH_CFG_FACTORY_MAILBOXES: "); - test_printn(CH_CFG_FACTORY_MAILBOXES); - test_println(""); - test_print("--- CH_CFG_FACTORY_OBJ_FIFOS: "); - test_printn(CH_CFG_FACTORY_OBJ_FIFOS); - test_println(""); test_print("--- CH_DBG_STATISTICS: "); test_printn(CH_DBG_STATISTICS); test_println("");