Rationale for a new test- >Although most of the test cases for this test have been taken from >clockrealtime, adding it to the current test with CLOCK_MONOTONIC may break the existing cases.
>This test has a new case which tests for no change of delay with monotonic >clock when the realtime clock has been modified, this is easier to add in a new test. --- testsuites/psxtests/Makefile.am | 10 ++ testsuites/psxtests/configure.ac | 1 + .../psxtests/psxclocknanosleep01/init.c | 155 ++++++++++++++++++ .../psxclocknanosleep01.doc | 15 ++ .../psxclocknanosleep01.scn | 14 ++ 5 files changed, 195 insertions(+) create mode 100644 testsuites/psxtests/psxclocknanosleep01/init.c create mode 100644 testsuites/psxtests/psxclocknanosleep01/psxclocknanosleep01.doc create mode 100644 testsuites/psxtests/psxclocknanosleep01/psxclocknanosleep01.scn diff --git a/testsuites/psxtests/Makefile.am b/testsuites/psxtests/Makefile.am index 1f9e4233ec..ba79804be7 100755 --- a/testsuites/psxtests/Makefile.am +++ b/testsuites/psxtests/Makefile.am @@ -312,6 +312,16 @@ psxclock01_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_psxclock01) \ $(support_includes) -I$(top_srcdir)/include endif + +if TEST_psxclocknanosleep01 +psx_tests += psxclocknanosleep01 +psx_screens += psxclocknanosleep01/psxclocknanosleep01.scn +psx_docs += psxclocknanosleep01/psxclocknanosleep01.doc +psxclocknanosleep01_SOURCES = psxclocknanosleep01/init.c +psxclocknanosleep01_CPPFLAGS = $(AM_CPPFLAGS) \ + $(TEST_FLAGS_psxclocknanosleep01) $(support_includes) +endif + if TEST_psxclockrealtime01 psx_tests += psxclockrealtime01 psx_screens += psxclockrealtime01/psxclockrealtime01.scn diff --git a/testsuites/psxtests/configure.ac b/testsuites/psxtests/configure.ac index 139787cccb..9bfe8e2c0b 100644 --- a/testsuites/psxtests/configure.ac +++ b/testsuites/psxtests/configure.ac @@ -75,6 +75,7 @@ RTEMS_TEST_CHECK([psxcleanup01]) RTEMS_TEST_CHECK([psxcleanup02]) RTEMS_TEST_CHECK([psxclock]) RTEMS_TEST_CHECK([psxclock01]) +RTEMS_TEST_CHECK([psxclocknanosleep01]) RTEMS_TEST_CHECK([psxclockrealtime01]) RTEMS_TEST_CHECK([psxconcurrency01]) RTEMS_TEST_CHECK([psxcond01]) diff --git a/testsuites/psxtests/psxclocknanosleep01/init.c b/testsuites/psxtests/psxclocknanosleep01/init.c new file mode 100644 index 0000000000..c1f10b9eb9 --- /dev/null +++ b/testsuites/psxtests/psxclocknanosleep01/init.c @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2020 Utkarsh Rai. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <errno.h> +#include <limits.h> +#include <rtems.h> +#include <time.h> +#include <tmacros.h> + +typedef enum { + MODE_TIMEOUT_FINITE, + MODE_TIMEOUT_NEGATIVE_SEC, + MODE_TIMEOUT_NEGATIVE_NSEC, + MODE_TIMEOUT_NEGATIVE_SEC_NSEC, + MODE_TIMEOUT_HUGE_NSEC, + MODE_TIMEOUT_CLOCK_MODIFY +} test_mode; + +static void assert_eno(const char *hint, int eno, int expected_eno) +{ + const char *warn = ""; + + if ( eno != expected_eno ) { + warn = "WARNING: "; + } + + printf( + "%s%s: actual '%s', expected '%s'\n", + warn, + hint, + strerror(eno), + strerror(expected_eno) + ); + + rtems_test_assert( eno == expected_eno ); +} + + +static void assert_rv(const char *hint, int rv, int expected_eno) +{ + int eno; + + if ( rv != 0 ) { + eno = EINVAL; + } else { + eno = 0; + } + + assert_eno( hint, eno, expected_eno ); +} + +static void run(test_mode mode, const char* test_name) +{ + struct timespec delay_time; + struct timespec configure_time; + int rv; + int expected_eno; + + printf("*******%s*********\n", test_name); + + switch (mode) { + case MODE_TIMEOUT_FINITE: + rv = clock_gettime( CLOCK_MONOTONIC, &delay_time ); + rtems_test_assert( rv == 0 ); + + delay_time.tv_sec += 1; + delay_time.tv_nsec += 1; + expected_eno = ETIMEDOUT; + break; + + case MODE_TIMEOUT_HUGE_NSEC: + delay_time.tv_sec = 1; + delay_time.tv_nsec = LONG_MAX; + expected_eno = EINVAL; + break; + + case MODE_TIMEOUT_NEGATIVE_NSEC: + delay_time.tv_sec = 1; + delay_time.tv_nsec = -1; + expected_eno = EINVAL; + break; + + case MODE_TIMEOUT_NEGATIVE_SEC_NSEC: + delay_time.tv_sec = -1; + delay_time.tv_nsec = -1; + expected_eno = EINVAL; + break; + + case MODE_TIMEOUT_NEGATIVE_SEC: + delay_time.tv_sec = -1; + delay_time.tv_nsec = 1; + expected_eno = ETIMEDOUT; + break; + + case MODE_TIMEOUT_CLOCK_MODIFY: + rv = clock_gettime( CLOCK_REALTIME, &configure_time ); + rtems_test_assert( rv == 0 ); + + configure_time.tv_sec += 3600; + rv = clock_settime( CLOCK_REALTIME, &configure_time ); + rtems_test_assert( rv == 0 ); + + rv = clock_gettime( CLOCK_MONOTONIC, &delay_time ); + rtems_test_assert( rv == 0 ); + + delay_time.tv_sec += 1; + delay_time.tv_nsec += 1; + expected_eno = ETIMEDOUT; + break; + + default: + rtems_test_assert(0); + break; + } + + rv = clock_nanosleep( CLOCK_MONOTONIC, TIMER_ABSTIME, &delay_time, NULL ); + if ( expected_eno == ETIMEDOUT ) { + assert_rv( "clock_nanosleep(clock monotonic)", rv, 0 ); + } else { + assert_rv( "clock_nanosleep(clock monotonic)", rv, expected_eno ); + } +} + +const char rtems_test_name[] = "PSXCLOCKNANOSLEEP01"; + +static rtems_task Init(rtems_task_argument ignored) +{ + TEST_BEGIN(); + + run( MODE_TIMEOUT_FINITE, "timeot finite" ); + run( MODE_TIMEOUT_HUGE_NSEC, "timeout huge nsec" ); + run( MODE_TIMEOUT_NEGATIVE_SEC_NSEC, "timeout negative sec nsec" ); + run( MODE_TIMEOUT_NEGATIVE_NSEC, "timeout negative nsec" ); + run( MODE_TIMEOUT_NEGATIVE_SEC, "timeout negative sec" ); + run( MODE_TIMEOUT_CLOCK_MODIFY, "timeout clock modify" ); + + TEST_END(); + rtems_test_exit(0); +} + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE +#define CONFIGURE_MAXIMUM_TASKS 1 +#define CONFIGURE_INIT +#include <rtems/confdefs.h> \ No newline at end of file diff --git a/testsuites/psxtests/psxclocknanosleep01/psxclocknanosleep01.doc b/testsuites/psxtests/psxclocknanosleep01/psxclocknanosleep01.doc new file mode 100644 index 0000000000..190748ac5a --- /dev/null +++ b/testsuites/psxtests/psxclocknanosleep01/psxclocknanosleep01.doc @@ -0,0 +1,15 @@ +/* +This file describes the directives and concepts tested by this test set. + +test set name: psxclocknanosleep01 + +directives: + + - clock_nanosleep() + +concepts: + + - Test some invalid and extreme timeout values. + - Ensure that the CLOCK_MONOTONIC based delay is not affected by changes to + CLOCK_REALTIME +*/ \ No newline at end of file diff --git a/testsuites/psxtests/psxclocknanosleep01/psxclocknanosleep01.scn b/testsuites/psxtests/psxclocknanosleep01/psxclocknanosleep01.scn new file mode 100644 index 0000000000..567daea80d --- /dev/null +++ b/testsuites/psxtests/psxclocknanosleep01/psxclocknanosleep01.scn @@ -0,0 +1,14 @@ +*** BEGIN OF TEST PSXCLOCKNANOSLEEP01 *** +*******timeout finite********* +clock_nanosleep(clock monotonic): actual 'Success', expected 'Success' +*******timeout huge nsec********* +clock_nanosleep(clock monotonic): actual 'Invalid argument', expected 'Invalid argument' +*******timeout negative sec nsec********* +clock_nanosleep(clock monotonic): actual 'Invalid argument', expected 'Invalid argument' +*******timeout negative nsec********* +clock_nanosleep(clock monotonic): actual 'Invalid argument', expected 'Invalid argument' +*******timeout negative sec********* +clock_nanosleep(clock monotonic): actual 'Success', expected 'Success' +*******timeout clock modify********* +clock_nanosleep(clock monotonic): actual 'Success', expected 'Success' +*** END OF TEST PSXCLOCKNANOSLEEP01 *** -- 2.17.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel