[PATCH v2] Test for clock_nanosleep() with CLOCK_MONOTONIC option.
Utkarsh Rai
utkarsh.rai60 at gmail.com
Wed Apr 22 15:53:33 UTC 2020
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
More information about the devel
mailing list