[PATCH] Test for clock_nanosleep() with CLOCK_MONOTONIC option.
Utkarsh Rai
utkarsh.rai60 at gmail.com
Tue Apr 21 10:29:22 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 +
testsuites/psxtests/psxclocknanosleep/init.c | 182 ++++++++++++++++++
.../psxclocknanosleep/psxclocknanosleep.doc | 15 ++
.../psxclocknanosleep/psxclocknanosleep.scn | 14 ++
5 files changed, 222 insertions(+)
create mode 100644 testsuites/psxtests/psxclocknanosleep/init.c
create mode 100644 testsuites/psxtests/psxclocknanosleep/psxclocknanosleep.doc
create mode 100644 testsuites/psxtests/psxclocknanosleep/psxclocknanosleep.scn
diff --git a/testsuites/psxtests/Makefile.am b/testsuites/psxtests/Makefile.am
index 1f9e4233ec..ad6e41b400 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_psxclocknanosleep
+psx_tests += psxclocknanosleep
+psx_screens += psxclocknanosleep/psxclocknanosleep.scn
+psx_docs += psxclockrealtime01/psxclocknanosleep.doc
+psxclocknanosleep_SOURCES = psxclocknanosleep/init.c
+psxclocknanosleep_CPPFLAGS = $(AM_CPPFLAGS) \
+ $(TEST_FLAGS_psxclocknanosleep) $(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..52b5e1624b 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([psxclocknanosleep])
RTEMS_TEST_CHECK([psxclockrealtime01])
RTEMS_TEST_CHECK([psxconcurrency01])
RTEMS_TEST_CHECK([psxcond01])
diff --git a/testsuites/psxtests/psxclocknanosleep/init.c b/testsuites/psxtests/psxclocknanosleep/init.c
new file mode 100644
index 0000000000..15e3ff396a
--- /dev/null
+++ b/testsuites/psxtests/psxclocknanosleep/init.c
@@ -0,0 +1,182 @@
+/*
+ * 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>
+
+static void assert_eno(const char *hint, int eno, int expected_eno)
+{
+ const char *warn;
+
+ if (eno != expected_eno) {
+ warn = "WARNING: ";
+ } else {
+ warn = "";
+ }
+
+ 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);
+}
+
+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 run(test_mode mode, const char* test_name)
+{
+ struct timespec delay_time;
+ struct timespec configure_time;
+ int rv;
+ int expected_eno;
+
+ 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 += INT64_MAX;
+
+ 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;
+ }
+
+ printf("*******%s*********\n", test_name);
+
+ 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 );
+ }
+}
+
+static void timeout_finite(void)
+{
+ run ( MODE_TIMEOUT_FINITE, "timeout finite" );
+}
+
+static void timeout_huge_nsec(void)
+{
+ run( MODE_TIMEOUT_HUGE_NSEC, "timeout huge nsec" );
+}
+
+static void timeout_negative_nsec(void)
+{
+ run( MODE_TIMEOUT_NEGATIVE_NSEC, "timeout negative nsec" );
+}
+
+static void timeout_negative_sec_nsec(void)
+{
+ run( MODE_TIMEOUT_NEGATIVE_SEC_NSEC, "timeout negative sec nsec" );
+}
+
+static void timeout_negative_sec(void)
+{
+ run( MODE_TIMEOUT_NEGATIVE_SEC, "timeout negative sec" );
+}
+
+static void timeout_clock_modify(void)
+{
+ run( MODE_TIMEOUT_CLOCK_MODIFY, "timeout clock modify" );
+}
+
+const char rtems_test_name[] = "PSXCLOCKNANOSLEEP";
+
+static rtems_task Init(rtems_task_argument ignored)
+{
+ TEST_BEGIN();
+
+ timeout_finite();
+ timeout_huge_nsec();
+ timeout_negative_sec_nsec();
+ timeout_negative_nsec();
+ timeout_negative_sec();
+ 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/psxclocknanosleep/psxclocknanosleep.doc b/testsuites/psxtests/psxclocknanosleep/psxclocknanosleep.doc
new file mode 100644
index 0000000000..a87874c627
--- /dev/null
+++ b/testsuites/psxtests/psxclocknanosleep/psxclocknanosleep.doc
@@ -0,0 +1,15 @@
+/*
+This file describes the directives and concepts tested by this test set.
+
+test set name: psxclocknanosleep
+
+directives:
+
+ - clock_nanosleep()
+
+concepts:
+
+ - Test some invalid and extreme timeout values.
+ - Ensure that the CLOCK_MONOTONIC based delay is not effected by changes to
+ CLOCK_REALTIME
+*/
\ No newline at end of file
diff --git a/testsuites/psxtests/psxclocknanosleep/psxclocknanosleep.scn b/testsuites/psxtests/psxclocknanosleep/psxclocknanosleep.scn
new file mode 100644
index 0000000000..af803c8b14
--- /dev/null
+++ b/testsuites/psxtests/psxclocknanosleep/psxclocknanosleep.scn
@@ -0,0 +1,14 @@
+*** BEGIN OF TEST PSXCLOCKNANOSLEEP ***
+*******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 PSXCLOCKNANOSLEEP ***
--
2.17.1
More information about the devel
mailing list