[v2] tst: Add test for clock_adjtime

Message ID 20210217232435.24045-1-lukma@denx.de
State Superseded
Headers
Series [v2] tst: Add test for clock_adjtime |

Commit Message

Lukasz Majewski Feb. 17, 2021, 11:24 p.m. UTC
  This code brings test to check if time on target machine is properly
adjusted.
The time is altered only when cross-test-ssh.sh is executed with
--allow-time-setting flag
As the delta added to CLOCK_REALTIME is only 1ms the original time is
not restored and further tests are executed with this bias.

---
Changes for v2:
- Use timespec_sub and support_timespec_check_in_range to check if
  time has been adjusted properly
---
 time/Makefile            |  2 +-
 time/tst-clock_adjtime.c | 59 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+), 1 deletion(-)
 create mode 100644 time/tst-clock_adjtime.c
  

Comments

Lukasz Majewski Feb. 24, 2021, 9:24 a.m. UTC | #1
Dear Community,

> This code brings test to check if time on target machine is properly
> adjusted.
> The time is altered only when cross-test-ssh.sh is executed with
> --allow-time-setting flag
> As the delta added to CLOCK_REALTIME is only 1ms the original time is
> not restored and further tests are executed with this bias.
> 


Gentle ping on this patchset.

> ---
> Changes for v2:
> - Use timespec_sub and support_timespec_check_in_range to check if
>   time has been adjusted properly
> ---
>  time/Makefile            |  2 +-
>  time/tst-clock_adjtime.c | 59
> ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60
> insertions(+), 1 deletion(-) create mode 100644
> time/tst-clock_adjtime.c
> 
> diff --git a/time/Makefile b/time/Makefile
> index b6f0969f3d..fc6415bf8a 100644
> --- a/time/Makefile
> +++ b/time/Makefile
> @@ -51,7 +51,7 @@ tests	:= test_time clocktest tst-posixtz
> tst-strptime tst_wcsftime \ tst-clock tst-clock2 tst-clock_nanosleep
> tst-cpuclock1 \ tst-adjtime tst-ctime tst-difftime tst-mktime4
> tst-clock-y2038 \ tst-clock2-y2038 tst-cpuclock1-y2038
> tst-clock_nanosleep-y2038 \
> -	   tst-clock_settime
> +	   tst-clock_settime tst-clock_adjtime
>  
>  include ../Rules
>  
> diff --git a/time/tst-clock_adjtime.c b/time/tst-clock_adjtime.c
> new file mode 100644
> index 0000000000..f31a4058ec
> --- /dev/null
> +++ b/time/tst-clock_adjtime.c
> @@ -0,0 +1,59 @@
> +/* Test for clock_adjtime
> +   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/time.h>
> +#include <sys/timex.h>
> +#include <support/check.h>
> +#include <support/timespec.h>
> +
> +static int
> +do_test (void)
> +{
> +  struct timespec tv_then, tv_now;
> +  struct timex delta;
> +
> +  /* Check if altering target time is allowed.  */
> +  if (getenv (SETTIME_ENV_NAME) == NULL)
> +    FAIL_UNSUPPORTED ("clock_adjtime is executed only when "\
> +                      SETTIME_ENV_NAME" is set\n");
> +
> +  tv_then = xclock_now (CLOCK_REALTIME);
> +
> +  /* Setup time value to adjust - 1 ms. */
> +  delta.time.tv_sec = 0;
> +  delta.time.tv_usec = 1000;
> +  delta.modes = ADJ_SETOFFSET;
> +
> +  int ret = clock_adjtime (CLOCK_REALTIME, &delta);
> +  if (ret == -1)
> +    FAIL_EXIT1 ("clock_adjtime failed: %m\n");
> +
> +  tv_now = xclock_now (CLOCK_REALTIME);
> +
> +  /* Check if clock_adjtime adjusted the system time.  */
> +  struct timespec r = timespec_sub (tv_now, tv_then);
> +  TEST_COMPARE (support_timespec_check_in_range
> +                ((struct timespec) { 0, 1000000 }, r, 0.0009,
> 0.0011), 0); +
> +
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>




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
  
Adhemerval Zanella Feb. 24, 2021, 1:05 p.m. UTC | #2
On 17/02/2021 20:24, Lukasz Majewski wrote:
> This code brings test to check if time on target machine is properly
> adjusted.
> The time is altered only when cross-test-ssh.sh is executed with
> --allow-time-setting flag
> As the delta added to CLOCK_REALTIME is only 1ms the original time is
> not restored and further tests are executed with this bias.
> 
> ---
> Changes for v2:
> - Use timespec_sub and support_timespec_check_in_range to check if
>   time has been adjusted properly
> ---
>  time/Makefile            |  2 +-
>  time/tst-clock_adjtime.c | 59 ++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 60 insertions(+), 1 deletion(-)
>  create mode 100644 time/tst-clock_adjtime.c
> 
> diff --git a/time/Makefile b/time/Makefile
> index b6f0969f3d..fc6415bf8a 100644
> --- a/time/Makefile
> +++ b/time/Makefile
> @@ -51,7 +51,7 @@ tests	:= test_time clocktest tst-posixtz tst-strptime tst_wcsftime \
>  	   tst-clock tst-clock2 tst-clock_nanosleep tst-cpuclock1 \
>  	   tst-adjtime tst-ctime tst-difftime tst-mktime4 tst-clock-y2038 \
>  	   tst-clock2-y2038 tst-cpuclock1-y2038 tst-clock_nanosleep-y2038 \
> -	   tst-clock_settime
> +	   tst-clock_settime tst-clock_adjtime
>  
>  include ../Rules
>  

Ok.

> diff --git a/time/tst-clock_adjtime.c b/time/tst-clock_adjtime.c
> new file mode 100644
> index 0000000000..f31a4058ec
> --- /dev/null
> +++ b/time/tst-clock_adjtime.c
> @@ -0,0 +1,59 @@
> +/* Test for clock_adjtime
> +   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/time.h>
> +#include <sys/timex.h>
> +#include <support/check.h>
> +#include <support/timespec.h>
> +
> +static int
> +do_test (void)
> +{
> +  struct timespec tv_then, tv_now;
> +  struct timex delta;
> +
> +  /* Check if altering target time is allowed.  */
> +  if (getenv (SETTIME_ENV_NAME) == NULL)
> +    FAIL_UNSUPPORTED ("clock_adjtime is executed only when "\
> +                      SETTIME_ENV_NAME" is set\n");

Ok.

> +
> +  tv_then = xclock_now (CLOCK_REALTIME);
> +
> +  /* Setup time value to adjust - 1 ms. */
> +  delta.time.tv_sec = 0;
> +  delta.time.tv_usec = 1000;
> +  delta.modes = ADJ_SETOFFSET;

Maybe 1 ms is too low?  I take that usually the system load on the
testing scenario would be low, that's why you haven't see a potential
issue. 

> +
> +  int ret = clock_adjtime (CLOCK_REALTIME, &delta);
> +  if (ret == -1)
> +    FAIL_EXIT1 ("clock_adjtime failed: %m\n");
> +
> +  tv_now = xclock_now (CLOCK_REALTIME);
> +
> +  /* Check if clock_adjtime adjusted the system time.  */
> +  struct timespec r = timespec_sub (tv_now, tv_then);
> +  TEST_COMPARE (support_timespec_check_in_range
> +                ((struct timespec) { 0, 1000000 }, r, 0.0009, 0.0011), 0);
> +
> +
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>
>
  
Lukasz Majewski Feb. 24, 2021, 1:18 p.m. UTC | #3
Hi Adhemerval,

> On 17/02/2021 20:24, Lukasz Majewski wrote:
> > This code brings test to check if time on target machine is properly
> > adjusted.
> > The time is altered only when cross-test-ssh.sh is executed with
> > --allow-time-setting flag
> > As the delta added to CLOCK_REALTIME is only 1ms the original time
> > is not restored and further tests are executed with this bias.
> > 
> > ---
> > Changes for v2:
> > - Use timespec_sub and support_timespec_check_in_range to check if
> >   time has been adjusted properly
> > ---
> >  time/Makefile            |  2 +-
> >  time/tst-clock_adjtime.c | 59
> > ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60
> > insertions(+), 1 deletion(-) create mode 100644
> > time/tst-clock_adjtime.c
> > 
> > diff --git a/time/Makefile b/time/Makefile
> > index b6f0969f3d..fc6415bf8a 100644
> > --- a/time/Makefile
> > +++ b/time/Makefile
> > @@ -51,7 +51,7 @@ tests	:= test_time clocktest tst-posixtz
> > tst-strptime tst_wcsftime \ tst-clock tst-clock2
> > tst-clock_nanosleep tst-cpuclock1 \ tst-adjtime tst-ctime
> > tst-difftime tst-mktime4 tst-clock-y2038 \ tst-clock2-y2038
> > tst-cpuclock1-y2038 tst-clock_nanosleep-y2038 \
> > -	   tst-clock_settime
> > +	   tst-clock_settime tst-clock_adjtime
> >  
> >  include ../Rules
> >    
> 
> Ok.
> 
> > diff --git a/time/tst-clock_adjtime.c b/time/tst-clock_adjtime.c
> > new file mode 100644
> > index 0000000000..f31a4058ec
> > --- /dev/null
> > +++ b/time/tst-clock_adjtime.c
> > @@ -0,0 +1,59 @@
> > +/* Test for clock_adjtime
> > +   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/time.h>
> > +#include <sys/timex.h>
> > +#include <support/check.h>
> > +#include <support/timespec.h>
> > +
> > +static int
> > +do_test (void)
> > +{
> > +  struct timespec tv_then, tv_now;
> > +  struct timex delta;
> > +
> > +  /* Check if altering target time is allowed.  */
> > +  if (getenv (SETTIME_ENV_NAME) == NULL)
> > +    FAIL_UNSUPPORTED ("clock_adjtime is executed only when "\
> > +                      SETTIME_ENV_NAME" is set\n");  
> 
> Ok.
> 
> > +
> > +  tv_then = xclock_now (CLOCK_REALTIME);
> > +
> > +  /* Setup time value to adjust - 1 ms. */
> > +  delta.time.tv_sec = 0;
> > +  delta.time.tv_usec = 1000;
> > +  delta.modes = ADJ_SETOFFSET;  
> 
> Maybe 1 ms is too low?  I take that usually the system load on the
> testing scenario would be low, that's why you haven't see a potential
> issue. 

What time value would be more appropriate? 1second?

> 
> > +
> > +  int ret = clock_adjtime (CLOCK_REALTIME, &delta);
> > +  if (ret == -1)
> > +    FAIL_EXIT1 ("clock_adjtime failed: %m\n");
> > +
> > +  tv_now = xclock_now (CLOCK_REALTIME);
> > +
> > +  /* Check if clock_adjtime adjusted the system time.  */
> > +  struct timespec r = timespec_sub (tv_now, tv_then);
> > +  TEST_COMPARE (support_timespec_check_in_range
> > +                ((struct timespec) { 0, 1000000 }, r, 0.0009,
> > 0.0011), 0); +
> > +
> > +  return 0;
> > +}
> > +
> > +#include <support/test-driver.c>
> >   




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
  
Adhemerval Zanella Feb. 24, 2021, 1:31 p.m. UTC | #4
On 24/02/2021 10:18, Lukasz Majewski wrote:
> Hi Adhemerval,
> 
>> On 17/02/2021 20:24, Lukasz Majewski wrote:
>>> This code brings test to check if time on target machine is properly
>>> adjusted.
>>> The time is altered only when cross-test-ssh.sh is executed with
>>> --allow-time-setting flag
>>> As the delta added to CLOCK_REALTIME is only 1ms the original time
>>> is not restored and further tests are executed with this bias.
>>>
>>> ---
>>> Changes for v2:
>>> - Use timespec_sub and support_timespec_check_in_range to check if
>>>   time has been adjusted properly
>>> ---
>>>  time/Makefile            |  2 +-
>>>  time/tst-clock_adjtime.c | 59
>>> ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60
>>> insertions(+), 1 deletion(-) create mode 100644
>>> time/tst-clock_adjtime.c
>>>
>>> diff --git a/time/Makefile b/time/Makefile
>>> index b6f0969f3d..fc6415bf8a 100644
>>> --- a/time/Makefile
>>> +++ b/time/Makefile
>>> @@ -51,7 +51,7 @@ tests	:= test_time clocktest tst-posixtz
>>> tst-strptime tst_wcsftime \ tst-clock tst-clock2
>>> tst-clock_nanosleep tst-cpuclock1 \ tst-adjtime tst-ctime
>>> tst-difftime tst-mktime4 tst-clock-y2038 \ tst-clock2-y2038
>>> tst-cpuclock1-y2038 tst-clock_nanosleep-y2038 \
>>> -	   tst-clock_settime
>>> +	   tst-clock_settime tst-clock_adjtime
>>>  
>>>  include ../Rules
>>>    
>>
>> Ok.
>>
>>> diff --git a/time/tst-clock_adjtime.c b/time/tst-clock_adjtime.c
>>> new file mode 100644
>>> index 0000000000..f31a4058ec
>>> --- /dev/null
>>> +++ b/time/tst-clock_adjtime.c
>>> @@ -0,0 +1,59 @@
>>> +/* Test for clock_adjtime
>>> +   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/time.h>
>>> +#include <sys/timex.h>
>>> +#include <support/check.h>
>>> +#include <support/timespec.h>
>>> +
>>> +static int
>>> +do_test (void)
>>> +{
>>> +  struct timespec tv_then, tv_now;
>>> +  struct timex delta;
>>> +
>>> +  /* Check if altering target time is allowed.  */
>>> +  if (getenv (SETTIME_ENV_NAME) == NULL)
>>> +    FAIL_UNSUPPORTED ("clock_adjtime is executed only when "\
>>> +                      SETTIME_ENV_NAME" is set\n");  
>>
>> Ok.
>>
>>> +
>>> +  tv_then = xclock_now (CLOCK_REALTIME);
>>> +
>>> +  /* Setup time value to adjust - 1 ms. */
>>> +  delta.time.tv_sec = 0;
>>> +  delta.time.tv_usec = 1000;
>>> +  delta.modes = ADJ_SETOFFSET;  
>>
>> Maybe 1 ms is too low?  I take that usually the system load on the
>> testing scenario would be low, that's why you haven't see a potential
>> issue. 
> 
> What time value would be more appropriate? 1second?

I would go with 1s and check with a range between 10%.  It should give
some slack if the system time triggers some background daemons, but
at same time is large enough that the check would trigger if the 
time is not changed.
  
Lukasz Majewski Feb. 24, 2021, 3:36 p.m. UTC | #5
Hi Adhemerval

> On 24/02/2021 10:18, Lukasz Majewski wrote:
> > Hi Adhemerval,
> >   
> >> On 17/02/2021 20:24, Lukasz Majewski wrote:  
> >>> This code brings test to check if time on target machine is
> >>> properly adjusted.
> >>> The time is altered only when cross-test-ssh.sh is executed with
> >>> --allow-time-setting flag
> >>> As the delta added to CLOCK_REALTIME is only 1ms the original time
> >>> is not restored and further tests are executed with this bias.
> >>>
> >>> ---
> >>> Changes for v2:
> >>> - Use timespec_sub and support_timespec_check_in_range to check if
> >>>   time has been adjusted properly
> >>> ---
> >>>  time/Makefile            |  2 +-
> >>>  time/tst-clock_adjtime.c | 59
> >>> ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60
> >>> insertions(+), 1 deletion(-) create mode 100644
> >>> time/tst-clock_adjtime.c
> >>>
> >>> diff --git a/time/Makefile b/time/Makefile
> >>> index b6f0969f3d..fc6415bf8a 100644
> >>> --- a/time/Makefile
> >>> +++ b/time/Makefile
> >>> @@ -51,7 +51,7 @@ tests	:= test_time clocktest tst-posixtz
> >>> tst-strptime tst_wcsftime \ tst-clock tst-clock2
> >>> tst-clock_nanosleep tst-cpuclock1 \ tst-adjtime tst-ctime
> >>> tst-difftime tst-mktime4 tst-clock-y2038 \ tst-clock2-y2038
> >>> tst-cpuclock1-y2038 tst-clock_nanosleep-y2038 \
> >>> -	   tst-clock_settime
> >>> +	   tst-clock_settime tst-clock_adjtime
> >>>  
> >>>  include ../Rules
> >>>      
> >>
> >> Ok.
> >>  
> >>> diff --git a/time/tst-clock_adjtime.c b/time/tst-clock_adjtime.c
> >>> new file mode 100644
> >>> index 0000000000..f31a4058ec
> >>> --- /dev/null
> >>> +++ b/time/tst-clock_adjtime.c
> >>> @@ -0,0 +1,59 @@
> >>> +/* Test for clock_adjtime
> >>> +   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/time.h>
> >>> +#include <sys/timex.h>
> >>> +#include <support/check.h>
> >>> +#include <support/timespec.h>
> >>> +
> >>> +static int
> >>> +do_test (void)
> >>> +{
> >>> +  struct timespec tv_then, tv_now;
> >>> +  struct timex delta;
> >>> +
> >>> +  /* Check if altering target time is allowed.  */
> >>> +  if (getenv (SETTIME_ENV_NAME) == NULL)
> >>> +    FAIL_UNSUPPORTED ("clock_adjtime is executed only when "\
> >>> +                      SETTIME_ENV_NAME" is set\n");    
> >>
> >> Ok.
> >>  
> >>> +
> >>> +  tv_then = xclock_now (CLOCK_REALTIME);
> >>> +
> >>> +  /* Setup time value to adjust - 1 ms. */
> >>> +  delta.time.tv_sec = 0;
> >>> +  delta.time.tv_usec = 1000;
> >>> +  delta.modes = ADJ_SETOFFSET;    
> >>
> >> Maybe 1 ms is too low?  I take that usually the system load on the
> >> testing scenario would be low, that's why you haven't see a
> >> potential issue.   
> > 
> > What time value would be more appropriate? 1second?  
> 
> I would go with 1s and check with a range between 10%.  It should give
> some slack if the system time triggers some background daemons, but
> at same time is large enough that the check would trigger if the 
> time is not changed.

Ok, I will set it as 1sec.


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
  

Patch

diff --git a/time/Makefile b/time/Makefile
index b6f0969f3d..fc6415bf8a 100644
--- a/time/Makefile
+++ b/time/Makefile
@@ -51,7 +51,7 @@  tests	:= test_time clocktest tst-posixtz tst-strptime tst_wcsftime \
 	   tst-clock tst-clock2 tst-clock_nanosleep tst-cpuclock1 \
 	   tst-adjtime tst-ctime tst-difftime tst-mktime4 tst-clock-y2038 \
 	   tst-clock2-y2038 tst-cpuclock1-y2038 tst-clock_nanosleep-y2038 \
-	   tst-clock_settime
+	   tst-clock_settime tst-clock_adjtime
 
 include ../Rules
 
diff --git a/time/tst-clock_adjtime.c b/time/tst-clock_adjtime.c
new file mode 100644
index 0000000000..f31a4058ec
--- /dev/null
+++ b/time/tst-clock_adjtime.c
@@ -0,0 +1,59 @@ 
+/* Test for clock_adjtime
+   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/time.h>
+#include <sys/timex.h>
+#include <support/check.h>
+#include <support/timespec.h>
+
+static int
+do_test (void)
+{
+  struct timespec tv_then, tv_now;
+  struct timex delta;
+
+  /* Check if altering target time is allowed.  */
+  if (getenv (SETTIME_ENV_NAME) == NULL)
+    FAIL_UNSUPPORTED ("clock_adjtime is executed only when "\
+                      SETTIME_ENV_NAME" is set\n");
+
+  tv_then = xclock_now (CLOCK_REALTIME);
+
+  /* Setup time value to adjust - 1 ms. */
+  delta.time.tv_sec = 0;
+  delta.time.tv_usec = 1000;
+  delta.modes = ADJ_SETOFFSET;
+
+  int ret = clock_adjtime (CLOCK_REALTIME, &delta);
+  if (ret == -1)
+    FAIL_EXIT1 ("clock_adjtime failed: %m\n");
+
+  tv_now = xclock_now (CLOCK_REALTIME);
+
+  /* Check if clock_adjtime adjusted the system time.  */
+  struct timespec r = timespec_sub (tv_now, tv_then);
+  TEST_COMPARE (support_timespec_check_in_range
+                ((struct timespec) { 0, 1000000 }, r, 0.0009, 0.0011), 0);
+
+
+  return 0;
+}
+
+#include <support/test-driver.c>