diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2009-05-16 07:52:12 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2009-05-16 07:52:12 +0000 |
commit | ff73cf2783b99f190d72010d04114a77f5a8d90a (patch) | |
tree | f35ae07c30955e8b9d5a69c7bd7fd557ce9fb2c6 | |
parent | ee8d2845c643af5f1e8baa2104e6b1b4a4ddd25f (diff) | |
download | ChibiOS-ff73cf2783b99f190d72010d04114a77f5a8d90a.tar.gz ChibiOS-ff73cf2783b99f190d72010d04114a77f5a8d90a.tar.bz2 ChibiOS-ff73cf2783b99f190d72010d04114a77f5a8d90a.zip |
100% code coverage for the serial driver and channels.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@973 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r-- | test/testdyn.c | 2 | ||||
-rw-r--r-- | test/testmtx.c | 6 | ||||
-rw-r--r-- | test/testserial.c | 102 |
3 files changed, 94 insertions, 16 deletions
diff --git a/test/testdyn.c b/test/testdyn.c index e881781f9..a7c685623 100644 --- a/test/testdyn.c +++ b/test/testdyn.c @@ -22,7 +22,7 @@ #include "test.h"
/**
- * @page test_dynamic Dynamic Thread APIs test
+ * @page test_dynamic Dynamic APIs test
*
* <h2>Description</h2>
* This module implements the test sequence for the dynamic thread creation
diff --git a/test/testmtx.c b/test/testmtx.c index 9ecf62f30..030b8ab87 100644 --- a/test/testmtx.c +++ b/test/testmtx.c @@ -139,7 +139,7 @@ const struct testcase testmtx1 = { * 0..2 - Priority levels
* +++ - Running
* --- - Ready
- * ... - Waiting
+ * ... - Waiting or Terminated
* xL - Lock operation on mutex 'x'
* xUn - Unlock operation on mutex 'x' with priority returning to level 'n'
* G - Goal
@@ -229,10 +229,10 @@ const struct testcase testmtx2 = { * 4 ....................................AL................++++++AUG...............
* ^ ^ ^ ^ ^ ^
* Legend:
- * 0..2 - Priority levels
+ * 0..4 - Priority levels
* +++ - Running
* --- - Ready
- * ... - Waiting
+ * ... - Waiting or Terminated
* xL - Lock operation on mutex 'x'
* xUn - Unlock operation on mutex 'x' with priority returning to level 'n'
* ^ - Priority transition (boost or return).
diff --git a/test/testserial.c b/test/testserial.c index 11fd7f634..fe92ebe2b 100644 --- a/test/testserial.c +++ b/test/testserial.c @@ -28,7 +28,8 @@ * This module implements the test sequence for the @ref Serial subsystem. * The tests are performed on a loopback software serial driver where a * dedicated thread echoes back in the input queue the data read from the - * output queue at a fixed rate. + * output queue at a fixed rate. The test module also tests implicitly the + * channels code. * * <h2>Objective</h2> * Objective of the test module is to cover 100% of the @ref Serial code @@ -46,6 +47,7 @@ * * <h2>Test Cases</h2> * - @subpage test_serial_001 + * - @subpage test_serial_002 * . * @file testserial.c * @brief Serial Driver test source file @@ -91,7 +93,7 @@ static void onfy(void) { } /** - * @page test_serial_001 Loopback test + * @page test_serial_001 Synchronous loopback test * * <h2>Description</h2> * A sequence of characters are sent to the loopback driver and read back. The @@ -103,12 +105,22 @@ static void onfy(void) { static char *serial1_gettest(void) { - return "Serial driver, loopback"; + return "Serial driver, synchronous"; } static void serial1_setup(void) { + /* Initializes the loopback driver.*/ chFDDInit(&fdd, wa[3], 8, infy, wa[4], 8, onfy); + /* Starts the loopback thread.*/ + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() + 1, + thread1, 0); +} + +static void serial1_teardown(void) { + + /* Terminates the loopback thread.*/ + chFDDPut(&fdd, 0); } static void serial1_execute(void) { @@ -116,8 +128,6 @@ static void serial1_execute(void) { msg_t b; /* Loopback test using the direct APIs.*/ - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() + 1, - thread1, 0); for (i = 0; i < 4; i++) { chFDDPut(&fdd, 'A' + i); b = chFDDGetTimeout(&fdd, S2ST(1)); @@ -125,15 +135,11 @@ static void serial1_execute(void) { break; test_emit_token(b); } - chFDDPut(&fdd, 0); test_assert_sequence(1, "ABCD"); test_assert(2, chFDDPutWouldBlock(&fdd) == FALSE, "output would block"); test_assert(3, chFDDGetWouldBlock(&fdd) == TRUE, "input would not block"); - test_wait_threads(); /* Loopback test using the channel APIs.*/ - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() + 1, - thread1, 0); for (i = 0; i < 4; i++) { chIOPut(&fdd, 'A' + i); b = chIOGetTimeout(&fdd, S2ST(1)); @@ -141,19 +147,90 @@ static void serial1_execute(void) { break; test_emit_token(b); } - chIOPut(&fdd, 0); test_assert_sequence(4, "ABCD"); test_assert(5, chIOPutWouldBlock(&fdd) == FALSE, "output would block"); test_assert(6, chIOGetWouldBlock(&fdd) == TRUE, "input would not block"); - test_wait_threads(); } const struct testcase testserial1 = { serial1_gettest, serial1_setup, - NULL, + serial1_teardown, serial1_execute }; + +/** + * @page test_serial_002 Asynchronous loopback test + * + * <h2>Description</h2> + * A sequence of characters are sent to the loopback driver using the + * asynchronous APIs and then read back. The test is performed twice using + * both the direct APIs and the channels API. An input queue overflow test + * is performed too.<br> + * The test expects that the queues are filled and emptied as expected and that + * the overflow error condition is reported when expected. + */ + +static char *serial2_gettest(void) { + + return "Serial driver, asynchronous"; +} + +static void serial2_setup(void) { + + /* Initializes the loopback driver.*/ + chFDDInit(&fdd, wa[3], 8, infy, wa[4], 8, onfy); + /* Starts the loopback thread.*/ + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() + 1, + thread1, 0); +} + +static void serial2_teardown(void) { + + /* Terminates the loopback thread.*/ + chFDDPut(&fdd, 0); +} + +static void serial2_execute(void) { + size_t n; + dflags_t flags; + + /* Asynchronous test using the direct APIs.*/ + n = chFDDWrite(&fdd, "ABCDEFGH", TEST_QUEUES_SIZE); + test_assert(1, n == TEST_QUEUES_SIZE, "unexpected write condition"); + n = chFDDRead(&fdd, wa[1], TEST_QUEUES_SIZE); + test_assert(2, n == TEST_QUEUES_SIZE, "unexpected read condition"); + test_assert(2, chFDDPutWouldBlock(&fdd) == FALSE, "output would block"); + test_assert(3, chFDDGetWouldBlock(&fdd) == TRUE, "input would not block"); + flags = chFDDGetAndClearFlags(&fdd); + test_assert(4, flags == 0, "unexpected error condition"); + + /* Input overflow testing.*/ + n = chFDDWrite(&fdd, "ABCDEFGH", TEST_QUEUES_SIZE); + test_assert(5, n == TEST_QUEUES_SIZE, "unexpected write condition"); + /* The following operation will fail to loopback because the input queue + * is full.*/ + chFDDPut(&fdd, 'Z'); + flags = chFDDGetAndClearFlags(&fdd); + test_assert(6, flags == SD_OVERRUN_ERROR, "unexpected error condition"); + n = chFDDRead(&fdd, wa[1], TEST_QUEUES_SIZE); + test_assert(7, n == TEST_QUEUES_SIZE, "unexpected read condition"); + + /* Asynchronous test using the channel APIs.*/ + n = chIOWrite(&fdd, "ABCDEFGH", TEST_QUEUES_SIZE); + test_assert(8, n == TEST_QUEUES_SIZE, "unexpected write condition"); + n = chIORead(&fdd, wa[1], TEST_QUEUES_SIZE); + test_assert(9, n == TEST_QUEUES_SIZE, "unexpected read condition"); + test_assert(10, chIOPutWouldBlock(&fdd) == FALSE, "output would block"); + test_assert(11, chIOGetWouldBlock(&fdd) == TRUE, "input would not block"); +} + +const struct testcase testserial2 = { + serial2_gettest, + serial2_setup, + serial2_teardown, + serial2_execute +}; #endif /* CH_USE_SERIAL_FULLDUPLEX */ /* @@ -162,6 +239,7 @@ const struct testcase testserial1 = { const struct testcase * const patternserial[] = { #if CH_USE_SERIAL_FULLDUPLEX &testserial1, + &testserial2, #endif NULL }; |