[PATCH v3] Test for clock_nanosleep() with CLOCK_MONOTONIC option
Utkarsh Rai
utkarsh.rai60 at gmail.com
Wed Apr 29 15:39:51 UTC 2020
>This test is based on the new test framework and has been tested for the sparc/erc32 bsp.
---
testsuites/psxtests/Makefile.am | 10 ++
testsuites/psxtests/configure.ac | 1 +
.../psxtests/psxclocknanosleep01/init.c | 102 +++++++++++++++
.../psxclocknanosleep01.doc | 13 ++
.../psxclocknanosleep01.scn | 39 ++++++
.../test-clock-nanosleep.c | 119 ++++++++++++++++++
6 files changed, 284 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
create mode 100644 testsuites/psxtests/psxclocknanosleep01/test-clock-nanosleep.c
diff --git a/testsuites/psxtests/Makefile.am b/testsuites/psxtests/Makefile.am
index 1f9e4233ec..89bf493c47 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_SOURCES += psxclocknanosleep01/test-clock-nanosleep.c
+psxclocknanosleep01_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_psxclocknanosleep01) \
+ $(support_includes) -I$(top_srcdir)/include
+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..420c33b648
--- /dev/null
+++ b/testsuites/psxtests/psxclocknanosleep01/init.c
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2020 Utkarsh Rai
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/bspIo.h>
+#include <rtems/linkersets.h>
+#include <t.h>
+#include <tmacros.h>
+
+const char rtems_test_name[] = "PSXCLOCKNANOSLEEP01";
+
+static char buffer[512];
+
+RTEMS_LINKER_ROSET_DECLARE(t_clock_nanosleep, const char *);
+RTEMS_LINKER_ROSET(t_clock_nanosleep, const char *);
+
+static const T_action actions[] = {
+ T_report_hash_sha256,
+ T_check_task_context,
+ T_check_file_descriptors,
+ T_check_rtems_barriers,
+ T_check_rtems_extensions,
+ T_check_rtems_message_queues,
+ T_check_rtems_partitions,
+ T_check_rtems_periods,
+ T_check_rtems_regions,
+ T_check_rtems_semaphores,
+ T_check_rtems_tasks,
+ T_check_rtems_timers,
+ T_check_posix_keys
+};
+
+static const T_config config = {
+ .name = "POSIXCLOCKNANOSLEEPTEST01",
+ .buf = buffer,
+ .buf_size = sizeof(buffer),
+ .putchar = rtems_put_char,
+ .verbosity = T_VERBOSE,
+ .now = T_now_clock,
+ .action_count = T_ARRAY_SIZE(actions),
+ .actions = actions
+};
+
+static void
+Init(rtems_task_argument arg)
+{
+ int exit_code;
+
+ (void)arg;
+ TEST_BEGIN();
+
+ T_register();
+ exit_code = T_main(&config);
+ if (exit_code == 0) {
+ TEST_END();
+ }
+
+ rtems_test_exit(exit_code);
+}
+
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 32
+
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 8
+
+#define CONFIGURE_UNIFIED_WORK_AREAS
+
+#define CONFIGURE_UNLIMITED_OBJECTS
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#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..803c2cff15
--- /dev/null
+++ b/testsuites/psxtests/psxclocknanosleep01/psxclocknanosleep01.doc
@@ -0,0 +1,13 @@
+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..c2c9da9a99
--- /dev/null
+++ b/testsuites/psxtests/psxclocknanosleep01/psxclocknanosleep01.scn
@@ -0,0 +1,39 @@
+*** BEGIN OF TEST PSXCLOCKNANOSLEEP01 ***
+
+A:POSIXCLOCKNANOSLEEPTEST01
+S:Platform:RTEMS
+S:Compiler:7.5.0 20191114 (RTEMS 5, RSB 5 (78c6e159d467), Newlib 7947581)
+S:Version:5.0.0.222d687969e008cdd464b1f92c79e83671094231-modified
+S:BSP:erc32
+S:RTEMS_DEBUG:0
+S:RTEMS_MULTIPROCESSING:0
+S:RTEMS_POSIX_API:1
+S:RTEMS_PROFILING:0
+S:RTEMS_SMP:0
+B:POSIXClock_Timeout_negative_sec_nsec
+P:0:0:UI1:test-clock-nanosleep.c:68
+E:POSIXClock_Timeout_negative_sec_nsec:N:1:F:0:D:0.001646
+B:POSIXClock_Timeout_negative_sec
+P:0:0:UI1:test-clock-nanosleep.c:43
+E:POSIXClock_Timeout_negative_sec:N:1:F:0:D:0.001641
+B:POSIXClock_Timeout_negative_nsec
+P:0:0:UI1:test-clock-nanosleep.c:56
+E:POSIXClock_Timeout_negative_nsec:N:1:F:0:D:0.001641
+B:POSIXClock_Timeout_huge_nsec
+P:0:0:UI1:test-clock-nanosleep.c:30
+E:POSIXClock_Timeout_huge_nsec:N:1:F:0:D:0.001641
+B:POSIXClock_Timeout_finite
+P:0:0:UI1:test-clock-nanosleep.c:12
+P:1:0:UI1:test-clock-nanosleep.c:17
+E:POSIXClock_Timeout_finite:N:2:F:0:D:1.001857
+B:POSIXClock_Timeout_clock_modify
+P:0:0:UI1:test-clock-nanosleep.c:78
+P:1:0:UI1:test-clock-nanosleep.c:82
+P:2:0:UI1:test-clock-nanosleep.c:85
+P:3:0:UI1:test-clock-nanosleep.c:90
+E:POSIXClock_Timeout_clock_modify:N:4:F:0:D:1.007999
+Z:POSIXCLOCKNANOSLEEPTEST01:C:6:N:10:F:0:D:2.031272
+Y:ReportHash:SHA256:735ff533b3a637ec735ac67b48a6a16092132e73b81bdc405790ab8175612dd7
+
+*** END OF TEST PSXCLOCKNANOSLEEP01 ***
+
diff --git a/testsuites/psxtests/psxclocknanosleep01/test-clock-nanosleep.c b/testsuites/psxtests/psxclocknanosleep01/test-clock-nanosleep.c
new file mode 100644
index 0000000000..eeff3dd481
--- /dev/null
+++ b/testsuites/psxtests/psxclocknanosleep01/test-clock-nanosleep.c
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2020 Utkarsh Rai
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include<errno.h>
+#include<limits.h>
+#include<time.h>
+#include<t.h>
+
+T_TEST_CASE(POSIXClock_Timeout_finite)
+{
+ struct timespec delay_time;
+ int eno;
+
+ eno = clock_gettime( CLOCK_MONOTONIC, &delay_time );
+ T_eno_success( eno );
+
+ delay_time.tv_sec += 1;
+
+ eno = clock_nanosleep( CLOCK_MONOTONIC, TIMER_ABSTIME, &delay_time, NULL );
+ T_eno_success( eno );
+}
+
+T_TEST_CASE(POSIXClock_Timeout_huge_nsec)
+{
+ struct timespec delay_time;
+ int eno;
+
+ delay_time.tv_sec = 1;
+ delay_time.tv_nsec = LONG_MAX;
+
+ eno = clock_nanosleep( CLOCK_MONOTONIC, TIMER_ABSTIME, &delay_time, NULL );
+ T_eno( EINVAL, eno );
+}
+
+T_TEST_CASE(POSIXClock_Timeout_negative_sec)
+{
+ struct timespec delay_time;
+ int eno;
+
+ delay_time.tv_sec = -1;
+ delay_time.tv_nsec = 1;
+
+ eno = clock_nanosleep( CLOCK_MONOTONIC, TIMER_ABSTIME, &delay_time, NULL );
+ T_eno_success( eno );
+
+}
+
+T_TEST_CASE(POSIXClock_Timeout_negative_nsec)
+{
+ struct timespec delay_time;
+ int eno;
+
+ delay_time.tv_sec = 1;
+ delay_time.tv_nsec = -1;
+
+ eno = clock_nanosleep( CLOCK_MONOTONIC, TIMER_ABSTIME, &delay_time, NULL );
+ T_eno( EINVAL, eno );
+}
+
+T_TEST_CASE(POSIXClock_Timeout_negative_sec_nsec)
+{
+ struct timespec delay_time;
+ int eno;
+
+ delay_time.tv_sec = -1;
+ delay_time.tv_nsec = -1;
+
+ eno = clock_nanosleep( CLOCK_MONOTONIC, TIMER_ABSTIME, &delay_time, NULL );
+ T_eno( EINVAL, eno);
+}
+
+T_TEST_CASE(POSIXClock_Timeout_clock_modify)
+{
+ struct timespec configure_time;
+ struct timespec delay_time;
+ int eno;
+
+ eno = clock_gettime( CLOCK_REALTIME, &configure_time );
+ T_eno_success( eno );
+
+ configure_time.tv_sec += 3600;
+ eno = clock_settime( CLOCK_REALTIME, &configure_time );
+ T_eno_success( eno );
+
+ eno = clock_gettime( CLOCK_MONOTONIC, &delay_time );
+ T_eno_success( eno );
+
+ delay_time.tv_sec += 1;
+
+ eno = clock_nanosleep( CLOCK_MONOTONIC, TIMER_ABSTIME, &delay_time, NULL );
+ T_eno_success( eno );
+}
--
2.17.1
More information about the devel
mailing list