On 22/04/2020 17:53, Utkarsh Rai wrote:

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.
+ */

Please use this template for new files (BSD-2-Clause license):

https://docs.rtems.org/branches/master/eng/coding-file-hdr.html#c-c-assembler-source-file-template

+
+#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 );
+}

I am not in favour of adding new test support code like this. The new test framework has for example:

https://docs.rtems.org/branches/master/eng/test-framework.html#posix-error-numbers

+
+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);
The new test framework prints stuff like this in a format easy to parse.
+
+ 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;

I think this switch case just make the code harder to read. What is the benefit? In the new test framework one of the test cases could look like:

T_TEST_CASE(POSIXClockGettimeTimeoutFinite)
{
    struct timespec delay_time;
    int eno;

    eno = clock_gettime( CLOCK_MONOTONIC, &delay_time );
    T_eno_success( eno );

    delay_time.tv_sec += 1;
    delay_time.tv_nsec += 1; // This can result in an invalid time, e.g. if 1.999999999 before the addition

    eno = clock_nanosleep( CLOCK_MONOTONIC, TIMER_ABSTIME, &delay_time, NULL );
    T_eno( eno, ETIMEDOUT );
}

+
+   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 ***
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to