From: chensong <[email protected]>

Add test case for clock_nanosleep64 in smokey testsuite

Signed-off-by: chensong <[email protected]>
[Florian: Reword commit msg, syscall()->XENOMAI_SYSCALLx()]
Signed-off-by: Florian Bezdeka <[email protected]>
---
 testsuite/smokey/y2038/syscall-tests.c | 67 ++++++++++++++++++++++++++
 1 file changed, 67 insertions(+)

diff --git a/testsuite/smokey/y2038/syscall-tests.c 
b/testsuite/smokey/y2038/syscall-tests.c
index 840be89a5..54d529b6b 100644
--- a/testsuite/smokey/y2038/syscall-tests.c
+++ b/testsuite/smokey/y2038/syscall-tests.c
@@ -242,6 +242,69 @@ static int test_sc_cobalt_clock_settime64(void)
        return 0;
 }
 
+static int test_sc_cobalt_clock_nanosleep64(void)
+{
+       int ret;
+       int sc_nr = sc_cobalt_clock_nanosleep64;
+       struct xn_timespec64 next, rmt;
+       struct timespec ts1, ts2, delta;
+       long interval = 1;
+
+       /* Make sure we don't crash because of NULL pointers */
+       ret = XENOMAI_SYSCALL4(sc_nr, NULL, NULL, NULL, NULL);
+       if (ret == -ENOSYS) {
+               smokey_note("clock_nanosleep64: skipped. (no kernel support)");
+               return 0; // Not implemented, nothing to test, success
+       }
+       if (!smokey_assert(ret == -EFAULT))
+               return ret ? ret : -EINVAL;
+
+       /* Providing an invalid address has to deliver EFAULT */
+       ret = XENOMAI_SYSCALL4(sc_nr, CLOCK_MONOTONIC, TIMER_ABSTIME,
+                              (void *)0xdeadbeefUL, &rmt);
+       if (!smokey_assert(ret == -EFAULT))
+               return ret ? ret : -EINVAL;
+
+       /* Provide a valid 64bit timespec, round 1 */
+       ret = clock_gettime(CLOCK_MONOTONIC, &ts1);
+       if (ret)
+               return -errno;
+
+       next.tv_sec  = ts1.tv_sec + interval;
+       next.tv_nsec = ts1.tv_nsec;
+
+       ret = XENOMAI_SYSCALL4(sc_nr, CLOCK_MONOTONIC, TIMER_ABSTIME,
+                              &next, (void *)0xdeadbeefUL);
+       if (!smokey_assert(!ret))
+               return ret ? ret : -EINVAL;
+
+       ret = clock_gettime(CLOCK_MONOTONIC, &ts2);
+       if (ret)
+               return -errno;
+
+       timespec_sub(&delta, &ts2, &ts1);
+       if (delta.tv_sec < interval)
+               smokey_warning("nanosleep didn't sleep long enough.");
+
+       /* Provide a valid 64bit timespec, round 2*/
+       next.tv_sec  = ts2.tv_sec + interval;
+       next.tv_nsec = ts2.tv_nsec;
+
+       ret = XENOMAI_SYSCALL4(sc_nr, CLOCK_MONOTONIC, TIMER_ABSTIME, &next, 
&rmt);
+       if (!smokey_assert(!ret))
+               return ret ? ret : -EINVAL;
+
+       ret = clock_gettime(CLOCK_MONOTONIC, &ts1);
+       if (ret)
+               return -errno;
+
+       timespec_sub(&delta, &ts1, &ts2);
+       if (delta.tv_sec < interval)
+               smokey_warning("nanosleep didn't sleep long enough.");
+
+       return 0;
+}
+
 static int run_y2038(struct smokey_test *t, int argc, char *const argv[])
 {
        int ret;
@@ -258,5 +321,9 @@ static int run_y2038(struct smokey_test *t, int argc, char 
*const argv[])
        if (ret)
                return ret;
 
+       ret = test_sc_cobalt_clock_nanosleep64();
+       if (ret)
+               return ret;
+
        return 0;
 }
-- 
2.31.1


Reply via email to