[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