Message ID | 20210309114709.23403-1-lukma@denx.de |
---|---|
State | New |
Headers | show |
Series | [1/2] tst: Add test for ntp_gettime | expand |
Hi, Le mardi 09 mars 2021 à 12:47 +0100, Lukasz Majewski a écrit : diff --git a/sysdeps/unix/sysv/linux/tst-ntp_gettime.c b/sysdeps/unix/sysv/linux/tst-ntp_gettime.c new file mode 100644 index 0000000000..5a1261fd35 --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-ntp_gettime.c @@ -0,0 +1,49 @@ +/* Test for ntp_gettime + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <time.h> +#include <stdlib.h> +#include <sys/timex.h> +#include <support/check.h> +#include <support/xtime.h> + +#ifndef NTP_GETTIME_SYSCALL +# define NTP_GETTIME_SYSCALL ntp_gettime +#endif + +# define STR(__s) #__s + +static int +do_test (void) +{ + struct timespec tv_now; + struct ntptimeval ntv; + + int ret = NTP_GETTIME_SYSCALL (&ntv); + if (ret == -1) + FAIL_EXIT1 (STR(NTP_GETTIME_SYSCALL)" failed: %m\n"); + + tv_now = xclock_now (CLOCK_REALTIME); + + if (tv_now.tv_sec != ntv.time.tv_sec) + FAIL_EXIT1 ("ntp_gettime provided wrong time!\n"); + This can fail if ntv.time.tv_usec is somewhere around 999999µs and the process is scheduled before completing xclock_now(). It would be better to try again a few times. Regards.
On Tue, 09 Mar 2021 19:09:01 +0100 Yann Droneaud <ydroneaud@opteya.com> wrote: > Hi, > > Le mardi 09 mars 2021 à 12:47 +0100, Lukasz Majewski a écrit : > > diff --git a/sysdeps/unix/sysv/linux/tst-ntp_gettime.c > b/sysdeps/unix/sysv/linux/tst-ntp_gettime.c > new file mode 100644 > index 0000000000..5a1261fd35 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/tst-ntp_gettime.c > @@ -0,0 +1,49 @@ > +/* Test for ntp_gettime > + Copyright (C) 2021 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be > useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <https://www.gnu.org/licenses/>. */ > + > +#include <time.h> > +#include <stdlib.h> > +#include <sys/timex.h> > +#include <support/check.h> > +#include <support/xtime.h> > + > +#ifndef NTP_GETTIME_SYSCALL > +# define NTP_GETTIME_SYSCALL ntp_gettime > +#endif > + > +# define STR(__s) #__s > + > +static int > +do_test (void) > +{ > + struct timespec tv_now; > + struct ntptimeval ntv; > + > + int ret = NTP_GETTIME_SYSCALL (&ntv); > + if (ret == -1) > + FAIL_EXIT1 (STR(NTP_GETTIME_SYSCALL)" failed: %m\n"); > + > + tv_now = xclock_now (CLOCK_REALTIME); > + > + if (tv_now.tv_sec != ntv.time.tv_sec) > + FAIL_EXIT1 ("ntp_gettime provided wrong time!\n"); > + > > This can fail if ntv.time.tv_usec is somewhere around 999999µs and the > process is scheduled before completing xclock_now(). > > It would be better to try again a few times. If we want to avoid such error - maybe it would be better to convert struct ntptimeval's struct timeval time member to struct timespec and then use timespec_sub() to get the time difference. Then this difference could be assessed in support_timespec_check_in_range() with some allowed percentage variation (like 10%). > > Regards. > Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
On Mär 09 2021, Yann Droneaud wrote: > Hi, > > Le mardi 09 mars 2021 à 12:47 +0100, Lukasz Majewski a écrit : > > diff --git a/sysdeps/unix/sysv/linux/tst-ntp_gettime.c > b/sysdeps/unix/sysv/linux/tst-ntp_gettime.c > new file mode 100644 > index 0000000000..5a1261fd35 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/tst-ntp_gettime.c > @@ -0,0 +1,49 @@ > +/* Test for ntp_gettime > + Copyright (C) 2021 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <https://www.gnu.org/licenses/>. */ > + > +#include <time.h> > +#include <stdlib.h> > +#include <sys/timex.h> > +#include <support/check.h> > +#include <support/xtime.h> > + > +#ifndef NTP_GETTIME_SYSCALL > +# define NTP_GETTIME_SYSCALL ntp_gettime > +#endif > + > +# define STR(__s) #__s > + > +static int > +do_test (void) > +{ > + struct timespec tv_now; > + struct ntptimeval ntv; > + > + int ret = NTP_GETTIME_SYSCALL (&ntv); > + if (ret == -1) > + FAIL_EXIT1 (STR(NTP_GETTIME_SYSCALL)" failed: %m\n"); > + > + tv_now = xclock_now (CLOCK_REALTIME); > + > + if (tv_now.tv_sec != ntv.time.tv_sec) > + FAIL_EXIT1 ("ntp_gettime provided wrong time!\n"); > + > > This can fail if ntv.time.tv_usec is somewhere around 999999µs and the > process is scheduled before completing xclock_now(). That can be made race-free by calling xclock_now before and after NTP_GETTIME_SYSCALL, and repeat if the result of the two xclock_now calls do not agree. Andreas.
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index b8c1caa505..8a07870cb4 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -113,7 +113,7 @@ tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \ tst-tgkill tst-sysvsem-linux tst-sysvmsg-linux tst-sysvshm-linux \ tst-timerfd tst-ppoll tst-futimens tst-utime tst-utimes \ tst-clock_adjtime tst-adjtimex tst-ntp_adjtime tst-futimes \ - tst-lutimes + tst-lutimes tst-ntp_gettime tests-internal += tst-ofdlocks-compat tst-sigcontext-get_pc tests-time64 += \ tst-futimes-time64\ diff --git a/sysdeps/unix/sysv/linux/tst-ntp_gettime.c b/sysdeps/unix/sysv/linux/tst-ntp_gettime.c new file mode 100644 index 0000000000..5a1261fd35 --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-ntp_gettime.c @@ -0,0 +1,49 @@ +/* Test for ntp_gettime + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <time.h> +#include <stdlib.h> +#include <sys/timex.h> +#include <support/check.h> +#include <support/xtime.h> + +#ifndef NTP_GETTIME_SYSCALL +# define NTP_GETTIME_SYSCALL ntp_gettime +#endif + +# define STR(__s) #__s + +static int +do_test (void) +{ + struct timespec tv_now; + struct ntptimeval ntv; + + int ret = NTP_GETTIME_SYSCALL (&ntv); + if (ret == -1) + FAIL_EXIT1 (STR(NTP_GETTIME_SYSCALL)" failed: %m\n"); + + tv_now = xclock_now (CLOCK_REALTIME); + + if (tv_now.tv_sec != ntv.time.tv_sec) + FAIL_EXIT1 ("ntp_gettime provided wrong time!\n"); + + return 0; +} + +#include <support/test-driver.c>