diff --git a/test/lib/templates/test_sequence_XXX.c b/test/lib/templates/test_sequence_XXX.c index 2d46efac8..6ff377e94 100644 --- a/test/lib/templates/test_sequence_XXX.c +++ b/test/lib/templates/test_sequence_XXX.c @@ -62,7 +62,7 @@ static void test_XXX_000_setup(void) { } -static void test_XXX_000}_teardown(void) { +static void test_XXX_000_teardown(void) { } diff --git a/test/nil/test.mk b/test/nil/test.mk index a69e80e08..1cb5641cf 100644 --- a/test/nil/test.mk +++ b/test/nil/test.mk @@ -1,7 +1,8 @@ # List of all the ChibiOS/RT test files. TESTSRC = ${CHIBIOS}/test/lib/ch_test.c \ ${CHIBIOS}/test/nil/test_root.c \ - ${CHIBIOS}/test/nil/test_sequence_000.c + ${CHIBIOS}/test/nil/test_sequence_000.c \ + ${CHIBIOS}/test/nil/test_sequence_001.c # Required include directories TESTINC = ${CHIBIOS}/test/lib \ diff --git a/test/nil/test_root.c b/test/nil/test_root.c index 47e8c67e4..94f88f2a4 100644 --- a/test/nil/test_root.c +++ b/test/nil/test_root.c @@ -35,6 +35,7 @@ */ const testcase_t * const *test_suite[] = { test_sequence_000, + test_sequence_001, NULL }; diff --git a/test/nil/test_root.h b/test/nil/test_root.h index 42463fc03..58e0790a4 100644 --- a/test/nil/test_root.h +++ b/test/nil/test_root.h @@ -28,6 +28,7 @@ #include "nil.h" #include "test_sequence_000.h" +#include "test_sequence_001.h" /*===========================================================================*/ /* Default definitions. */ @@ -35,7 +36,7 @@ /* Global test suite name, it is printed on top of the test report header.*/ -#define TEST_SUITE_NAME "ChibiOS/RT Test Suite" +#define TEST_SUITE_NAME "ChibiOS/NIL Test Suite" /*===========================================================================*/ /* External declarations. */ diff --git a/test/nil/test_sequence_000.c b/test/nil/test_sequence_000.c index a61ce4108..6d1dede6c 100644 --- a/test/nil/test_sequence_000.c +++ b/test/nil/test_sequence_000.c @@ -24,10 +24,11 @@ * File: @ref test_sequence_000.c * *

Description

- * This sequence tests the ChibiOS/Nil functionalities related to threading. + * This sequence tests the ChibiOS/NIL functionalities related to threading. * *

Test Cases

* - @subpage test_000_000 + * - @subpage test_000_001 * . */ @@ -70,12 +71,12 @@ static void test_000_000_execute(void) { } static const testcase_t test_000_000 = { - "Brief description", + "System Tick Counter functionality", NULL, NULL, test_000_000_execute }; -#endif /* TEST_000_000_CONDITION */ +#endif /* TRUE */ #if TRUE || defined(__DOXYGEN__) /** @@ -109,7 +110,7 @@ static void test_000_001_execute(void) { time = chVTGetSystemTimeX(); chThdSleep(100); test_assert_time_window(time + 100, - time + 101, + time + 100 + 1, "out of time window"); } @@ -145,15 +146,24 @@ static void test_000_001_execute(void) { time + S2ST(1) + 1, "out of time window"); } + + test_set_step(5); + { + time = chVTGetSystemTimeX(); + chThdSleepUntil(time + 100); + test_assert_time_window(time + 100, + time + 100 + 1, + "out of time window"); + } } static const testcase_t test_000_001 = { - "Brief description", + "Thread Sleep functionality", NULL, NULL, test_000_001_execute }; -#endif /* TEST_000_001_CONDITION */ +#endif /* TRUE */ /**************************************************************************** * Exported data. @@ -163,10 +173,10 @@ static const testcase_t test_000_001 = { * @brief Sequence brief description. */ const testcase_t * const test_sequence_000[] = { -#if 1 || defined(__DOXYGEN__) +#if TRUE || defined(__DOXYGEN__) &test_000_000, #endif -#if 1 || defined(__DOXYGEN__) +#if TRUE || defined(__DOXYGEN__) &test_000_001, #endif NULL diff --git a/test/nil/test_sequence_001.c b/test/nil/test_sequence_001.c new file mode 100644 index 000000000..0157541d5 --- /dev/null +++ b/test/nil/test_sequence_001.c @@ -0,0 +1,182 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2013 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 "ch_test.h" +#include "test_root.h" + +/** + * @page test_sequence_001 Semaphores functionality + * + * File: @ref test_sequence_001.c + * + *

Description

+ * This sequence tests the ChibiOS/NIL functionalities related to semaphores. + * + *

Test Cases

+ * - @subpage test_001_000 + * . + */ + +/**************************************************************************** + * Shared code. + ****************************************************************************/ + +static semaphore_t sem1; + +/**************************************************************************** + * Test cases. + ****************************************************************************/ + +#if TRUE || defined(__DOXYGEN__) +/** + * @page test_001_000 Semaphores primitives, no state change + * + *

Description

+ * Wait, Signal and Reset primitives are tested. The testing thread does not + * trigger a state change. + * + *

Conditions

+ * None. + * + *

Test Steps

+ * - The function chSemWait() is invoked, the Semaphore counter is tested + * for correct value after the call. + * - The function chSemSignal() is invoked, the Semaphore counter is tested + * for correct value after the call. + * - The function chSemReset() is invoked, the Semaphore counter is tested + * for correct value after the call. + * . + */ + +static void test_001_000_setup(void) { + + chSemObjectInit(&sem1, 1); +} + +static void test_001_000_teardown(void) { + + chSemReset(&sem1, 0); +} + +static void test_001_000_execute(void) { + + /* The function chSemWait() is invoked, the Semaphore counter is tested + for correct value after the call.*/ + test_set_step(1); + { + chSemWait(&sem1); + test_assert_lock(chSemGetCounterI(&sem1) == 0, + "wrong counter value"); + } + + /* The function chSemSignal() is invoked, the Semaphore counter is tested + for correct value after the call.*/ + test_set_step(2); + { + chSemSignal(&sem1); + test_assert_lock(chSemGetCounterI(&sem1) == 1, + "wrong counter value"); + } + + /* The function chSemReset() is invoked, the Semaphore counter is tested + for correct value after the call.*/ + test_set_step(3); + { + chSemReset(&sem1, 2); + test_assert_lock(chSemGetCounterI(&sem1) == 2, + "wrong counter value"); + } +} + +static const testcase_t test_001_000 = { + "Brief description", + test_001_000_setup, + test_001_000_teardown, + test_001_000_execute +}; +#endif /* TRUE */ + +#if TRUE || defined(__DOXYGEN__) +/** + * @page test_001_000 Semaphores timeout + * + *

Description

+ * Timeouts on semaphores are tested. + * + *

Conditions

+ * None. + * + *

Test Steps

+ * - The function chSemWaitTimeout() is invoked, after return the system + * time, the counter and the returned message are tested. + * . + */ + +static void test_001_001_setup(void) { + + chSemObjectInit(&sem1, 0); +} + +static void test_001_001_teardown(void) { + + chSemReset(&sem1, 0); +} + +static void test_001_001_execute(void) { + systime_t time; + msg_t msg; + + /* The function chSemWaitTimeout() is invoked, after return the system + time, the counter and the returned message are tested.*/ + test_set_step(1); + { + time = chVTGetSystemTimeX(); + msg = chSemWaitTimeout(&sem1, 100); + test_assert_time_window(time + 100, + time + 100 + 1, + "out of time window"); + test_assert_lock(chSemGetCounterI(&sem1) == 0, + "wrong counter value"); + test_assert(MSG_TIMEOUT == msg, + "wrong timeout message"); + } +} + +static const testcase_t test_001_001 = { + "Brief description", + test_001_001_setup, + test_001_001_teardown, + test_001_001_execute +}; +#endif /* TRUE */ + + /**************************************************************************** + * Exported data. + ****************************************************************************/ + +/** + * @brief Sequence brief description. + */ +const testcase_t * const test_sequence_001[] = { +#if TRUE || defined(__DOXYGEN__) + &test_001_000, +#endif +#if TRUE || defined(__DOXYGEN__) + &test_001_001, +#endif + NULL +}; diff --git a/test/nil/test_sequence_001.h b/test/nil/test_sequence_001.h new file mode 100644 index 000000000..47ae8315b --- /dev/null +++ b/test/nil/test_sequence_001.h @@ -0,0 +1,22 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2013 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. +*/ + +#ifndef _TEST_SEQUENCE_001_H_ +#define _TEST_SEQUENCE_001_H_ + +extern const testcase_t * const test_sequence_001[]; + +#endif /* _TEST_SEQUENCE_001_H_ */