public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2 1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered
@ 2021-02-06 17:57 Lukasz Majewski
  2021-02-06 17:57 ` [PATCH v2 2/3] support: Provide xclock_settime test helper function Lukasz Majewski
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Lukasz Majewski @ 2021-02-06 17:57 UTC (permalink / raw)
  To: Joseph Myers, Adhemerval Zanella, Florian Weimer
  Cc: Paul Eggert, Alistair Francis, Arnd Bergmann, Alistair Francis,
	GNU C Library, Carlos O'Donell, Florian Weimer,
	Zack Weinberg, Lukasz Majewski

This code adds new flag - '--allow-time-setting' to cross-test-ssh.sh
script to indicate if it is allowed to alter the date on the system
on which tests are executed. This change is supposed to be used with
test systems, which use virtual machines for testing.

The GLIBC_TEST_ALLOW_TIME_SETTING env variable is exported to the
remote environment on which the eligible test is run and brings no
functional change when it is not.

Changes for v2:
- Utilize flock to provide serialization of cross-test-ssh.sh script
  execution.
- Add entry to manual/install.texi about --allow-time-setting flag
  usage.
---
 manual/install.texi       |  2 ++
 scripts/cross-test-ssh.sh | 22 +++++++++++++++++++++-
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/manual/install.texi b/manual/install.texi
index 419576f49c..2c8e49d31e 100644
--- a/manual/install.texi
+++ b/manual/install.texi
@@ -379,6 +379,8 @@ directory and @var{hostname} is the host name of a system that can run
 the newly built binaries of @theglibc{}.  The source and build
 directories must be visible at the same locations on both the build
 system and @var{hostname}.
+It is also possible to execute tests on the target machine, when passing
+@option{--allow-time-setting} flag, which would require setting date.
 
 In general, when testing @theglibc{}, @samp{test-wrapper} may be set
 to the name and arguments of any program to run newly built binaries.
diff --git a/scripts/cross-test-ssh.sh b/scripts/cross-test-ssh.sh
index 6d8fbcdfd2..c4b112aa1d 100755
--- a/scripts/cross-test-ssh.sh
+++ b/scripts/cross-test-ssh.sh
@@ -22,7 +22,7 @@
 
 progname="$(basename $0)"
 
-usage="usage: ${progname} [--ssh SSH] HOST COMMAND ..."
+usage="usage: ${progname} [--ssh SSH][--allow-time-setting] HOST COMMAND ..."
 help="Run a glibc test COMMAND on the remote machine HOST, via ssh,
 preserving the current working directory, and respecting quoting.
 
@@ -32,6 +32,11 @@ instead of ordinary 'ssh'.
 If the '--timeoutfactor FACTOR' flag is present, set TIMEOUTFACTOR on
 the remote machine to the specified FACTOR.
 
+If the '--allow-time-setting' flag is present, set
+GLIBC_TEST_ALLOW_TIME_SETTING on the remote machine to inform that
+time can be safely adjusted when e.g. tests are run in a virtual
+machine.
+
 To use this to run glibc tests, invoke the tests as follows:
 
   $ make test-wrapper='ABSPATH/cross-test-ssh.sh HOST' tests
@@ -81,6 +86,10 @@ while [ $# -gt 0 ]; do
       timeoutfactor="$1"
       ;;
 
+    "--allow-time-setting")
+      settimeallowed="1"
+      ;;
+
     "--help")
       echo "$usage"
       echo "$help"
@@ -127,6 +136,17 @@ if [ "$timeoutfactor" ]; then
 ${command}"
 fi
 
+# Add command to set the info that time on target can be adjusted,
+# if required.
+# Serialize execution of this script on host to prevent from unintended
+# change of target time.
+FLOCK_PATH="/var/lock/clock_settime"
+if [ "$settimeallowed" ]; then
+  exec 99<>${FLOCK_PATH}
+  flock 99 || { echo "Cannot lock ${FLOCK_PATH}"; exit 1; }
+  command="export GLIBC_TEST_ALLOW_TIME_SETTING=1 ${command}"
+fi
+
 # HOST's sshd simply concatenates its arguments with spaces and
 # passes them to some shell.  We want to force the use of /bin/sh,
 # so we need to re-quote the whole command to ensure it appears as
-- 
2.20.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 2/3] support: Provide xclock_settime test helper function
  2021-02-06 17:57 [PATCH v2 1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered Lukasz Majewski
@ 2021-02-06 17:57 ` Lukasz Majewski
  2021-02-06 17:57 ` [PATCH v2 3/3] tst: Add test for clock_settime Lukasz Majewski
  2021-02-08 22:09 ` [PATCH v2 1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered Joseph Myers
  2 siblings, 0 replies; 5+ messages in thread
From: Lukasz Majewski @ 2021-02-06 17:57 UTC (permalink / raw)
  To: Joseph Myers, Adhemerval Zanella, Florian Weimer
  Cc: Paul Eggert, Alistair Francis, Arnd Bergmann, Alistair Francis,
	GNU C Library, Carlos O'Donell, Florian Weimer,
	Zack Weinberg, Lukasz Majewski

The xclock_settime is a wrapper function on the clock_settime syscall
to be used in the test code.

It checks if the GLIBC_TEST_ALLOW_TIME_SETTING env variable is defined
in the environment in which test is executed. If it is not - the test
ends as unsupported. Otherwise, the clock-settime is executed and return
value is assessed.
---
 support/Makefile         |  1 +
 support/xclock_settime.c | 35 +++++++++++++++++++++++++++++++++++
 support/xtime.h          |  5 +++++
 3 files changed, 41 insertions(+)
 create mode 100644 support/xclock_settime.c

diff --git a/support/Makefile b/support/Makefile
index bb9889efb4..8d63fbd5da 100644
--- a/support/Makefile
+++ b/support/Makefile
@@ -90,6 +90,7 @@ libsupport-routines = \
   xchdir \
   xchroot \
   xclock_gettime \
+  xclock_settime \
   xclose \
   xchmod \
   xconnect \
diff --git a/support/xclock_settime.c b/support/xclock_settime.c
new file mode 100644
index 0000000000..12a83b9d79
--- /dev/null
+++ b/support/xclock_settime.c
@@ -0,0 +1,35 @@
+/* clock_settime with error checking.
+   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 <stdlib.h>
+#include <support/check.h>
+#include <support/xtime.h>
+#include <support/xthread.h>
+
+void
+xclock_settime (clockid_t clockid,
+                const struct timespec *ts)
+{
+  if (getenv (SETTIME_ENV_NAME) == NULL)
+    FAIL_UNSUPPORTED ("clock_settime is executed only when "\
+                      SETTIME_ENV_NAME" is set\n");
+
+  const int ret = clock_settime (clockid, ts);
+  if (ret < 0)
+    FAIL_EXIT1 ("clock_settime (%d): %m", clockid);
+}
diff --git a/support/xtime.h b/support/xtime.h
index 2482837dee..b4ac3b59e2 100644
--- a/support/xtime.h
+++ b/support/xtime.h
@@ -23,10 +23,15 @@
 
 __BEGIN_DECLS
 
+/* Name of the env variable, which indicates if it is possible to
+   adjust time on target machine.  */
+#define SETTIME_ENV_NAME "GLIBC_TEST_ALLOW_TIME_SETTING"
+
 /* The following functions call the corresponding libc functions and
    terminate the process on error.  */
 
 void xclock_gettime (clockid_t clock, struct timespec *ts);
+void xclock_settime (clockid_t clock, const struct timespec *ts);
 
 /* This helper can often simplify tests by avoiding an explicit
    variable declaration or allowing that declaration to be const. */
-- 
2.20.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 3/3] tst: Add test for clock_settime
  2021-02-06 17:57 [PATCH v2 1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered Lukasz Majewski
  2021-02-06 17:57 ` [PATCH v2 2/3] support: Provide xclock_settime test helper function Lukasz Majewski
@ 2021-02-06 17:57 ` Lukasz Majewski
  2021-02-08 22:09 ` [PATCH v2 1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered Joseph Myers
  2 siblings, 0 replies; 5+ messages in thread
From: Lukasz Majewski @ 2021-02-06 17:57 UTC (permalink / raw)
  To: Joseph Myers, Adhemerval Zanella, Florian Weimer
  Cc: Paul Eggert, Alistair Francis, Arnd Bergmann, Alistair Francis,
	GNU C Library, Carlos O'Donell, Florian Weimer,
	Zack Weinberg, Lukasz Majewski

This code brings test to check if time on target machine is properly set.
To avoid any issues with altering the time:

- The time, which was set before the test was executed is restored.

- The time is altered only when cross-test-ssh.sh is executed with
  --allow-time-setting flag
---
 time/Makefile            |  2 +-
 time/tst-clock_settime.c | 45 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 time/tst-clock_settime.c

diff --git a/time/Makefile b/time/Makefile
index e6f448d938..e469cacb4a 100644
--- a/time/Makefile
+++ b/time/Makefile
@@ -50,7 +50,7 @@ tests	:= test_time clocktest tst-posixtz tst-strptime tst_wcsftime \
 	   tst-tzname tst-y2039 bug-mktime4 tst-strftime2 tst-strftime3 \
 	   tst-clock tst-clock2 tst-clock_nanosleep tst-cpuclock1 \
 	   tst-adjtime tst-clock-y2038 tst-clock2-y2038 \
-	   tst-cpuclock1-y2038 tst-clock_nanosleep-y2038
+	   tst-cpuclock1-y2038 tst-clock_nanosleep-y2038 tst-clock_settime
 
 include ../Rules
 
diff --git a/time/tst-clock_settime.c b/time/tst-clock_settime.c
new file mode 100644
index 0000000000..2abf6b8eb8
--- /dev/null
+++ b/time/tst-clock_settime.c
@@ -0,0 +1,45 @@
+/* Test for clock_settime (in VM)
+   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 <support/check.h>
+#include <support/xtime.h>
+
+#define TIMESPEC_SEC_Y2038_OV 0x7FFFFFFF
+#define FUTURE_TIME (TIMESPEC_SEC_Y2038_OV - 10)
+
+static int
+do_test (void)
+{
+  const struct timespec tv = { FUTURE_TIME, 0};
+  struct timespec tv_future, tv_now;
+
+  tv_now = xclock_now(CLOCK_REALTIME);
+  xclock_settime(CLOCK_REALTIME, &tv);
+  tv_future = xclock_now(CLOCK_REALTIME);
+
+  /* Restore old time value on target machine.  */
+  xclock_settime(CLOCK_REALTIME, (const struct timespec*) &tv_now);
+
+  if (tv_future.tv_sec < tv.tv_sec)
+    FAIL_EXIT1 ("clock_settime set wrong time!\n");
+
+  return 0;
+}
+
+#include <support/test-driver.c>
-- 
2.20.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered
  2021-02-06 17:57 [PATCH v2 1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered Lukasz Majewski
  2021-02-06 17:57 ` [PATCH v2 2/3] support: Provide xclock_settime test helper function Lukasz Majewski
  2021-02-06 17:57 ` [PATCH v2 3/3] tst: Add test for clock_settime Lukasz Majewski
@ 2021-02-08 22:09 ` Joseph Myers
  2021-02-10  9:09   ` Lukasz Majewski
  2 siblings, 1 reply; 5+ messages in thread
From: Joseph Myers @ 2021-02-08 22:09 UTC (permalink / raw)
  To: Lukasz Majewski
  Cc: Adhemerval Zanella, Florian Weimer, GNU C Library,
	Florian Weimer, Alistair Francis

On Sat, 6 Feb 2021, Lukasz Majewski wrote:

> This code adds new flag - '--allow-time-setting' to cross-test-ssh.sh
> script to indicate if it is allowed to alter the date on the system
> on which tests are executed. This change is supposed to be used with
> test systems, which use virtual machines for testing.
> 
> The GLIBC_TEST_ALLOW_TIME_SETTING env variable is exported to the
> remote environment on which the eligible test is run and brings no
> functional change when it is not.

I think there are two separate features here, both of which should be 
documented.  The ability to run tests that set the time should not be 
limited to when cross-test-ssh.sh is used; someone might want to write 
their own test wrapper supporting that feature (there's no requirement to 
use the provided test wrapper, writing your own is fully supported), or 
might want to run tests with setting time enabled for native testing (for 
example, if they have a build and test environment that creates a virtual 
machine to run "make check" natively on it and then destroys that virtual 
machine afterwards).

So at least two things should be documented:

* If you set GLIBC_TEST_ALLOW_TIME_SETTING in the environment in which 
tests are run *and* run the tests with appropriate privileges to be able 
to use clock_settime, then such tests will be run, but this will not by 
itself provide any locking against conflicting tests running in parallel 
so you should also either test in series or use a test wrapper that 
provides such locking.

* In the case of using cross-test-ssh.sh, you can pass the 
--allow-time-setting option to automate both setting 
GLIBC_TEST_ALLOW_TIME_SETTING and doing the locking.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered
  2021-02-08 22:09 ` [PATCH v2 1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered Joseph Myers
@ 2021-02-10  9:09   ` Lukasz Majewski
  0 siblings, 0 replies; 5+ messages in thread
From: Lukasz Majewski @ 2021-02-10  9:09 UTC (permalink / raw)
  To: Joseph Myers
  Cc: Adhemerval Zanella, Florian Weimer, GNU C Library,
	Florian Weimer, Alistair Francis

[-- Attachment #1: Type: text/plain, Size: 2173 bytes --]

Hi Joseph,

> On Sat, 6 Feb 2021, Lukasz Majewski wrote:
> 
> > This code adds new flag - '--allow-time-setting' to
> > cross-test-ssh.sh script to indicate if it is allowed to alter the
> > date on the system on which tests are executed. This change is
> > supposed to be used with test systems, which use virtual machines
> > for testing.
> > 
> > The GLIBC_TEST_ALLOW_TIME_SETTING env variable is exported to the
> > remote environment on which the eligible test is run and brings no
> > functional change when it is not.  
> 
> I think there are two separate features here, both of which should be 
> documented.  The ability to run tests that set the time should not be 
> limited to when cross-test-ssh.sh is used; someone might want to
> write their own test wrapper supporting that feature (there's no
> requirement to use the provided test wrapper, writing your own is
> fully supported), or might want to run tests with setting time
> enabled for native testing (for example, if they have a build and
> test environment that creates a virtual machine to run "make check"
> natively on it and then destroys that virtual machine afterwards).
> 

Thanks for the description.

> So at least two things should be documented:
> 
> * If you set GLIBC_TEST_ALLOW_TIME_SETTING in the environment in
> which tests are run *and* run the tests with appropriate privileges
> to be able to use clock_settime, then such tests will be run, but
> this will not by itself provide any locking against conflicting tests
> running in parallel so you should also either test in series or use a
> test wrapper that provides such locking.
> 
> * In the case of using cross-test-ssh.sh, you can pass the 
> --allow-time-setting option to automate both setting 
> GLIBC_TEST_ALLOW_TIME_SETTING and doing the locking.
> 

I will include information from above text to the install.texi.


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

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-02-10  9:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-06 17:57 [PATCH v2 1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered Lukasz Majewski
2021-02-06 17:57 ` [PATCH v2 2/3] support: Provide xclock_settime test helper function Lukasz Majewski
2021-02-06 17:57 ` [PATCH v2 3/3] tst: Add test for clock_settime Lukasz Majewski
2021-02-08 22:09 ` [PATCH v2 1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered Joseph Myers
2021-02-10  9:09   ` Lukasz Majewski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).