[v3,1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered

Message ID 20210210103710.1325-1-lukma@denx.de
State Superseded
Series [v3,1/3] tst: Extend cross-test-ssh.sh to specify if target date can be altered |

Commit Message

Lukasz Majewski Feb. 10, 2021, 10:37 a.m. UTC
  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
- Add entry to manual/install.texi about --allow-time-setting flag

Changes for v3:
- The install.texi manual has been augmented to explain two distinct
  use cases for setting the time on target system.
 manual/install.texi       | 17 +++++++++++++++++
 scripts/cross-test-ssh.sh | 22 +++++++++++++++++++++-
 2 files changed, 38 insertions(+), 1 deletion(-)


Lukasz Majewski Feb. 16, 2021, 8:23 p.m. UTC | #1
Hi DJ,

> Lukasz Majewski <lukma@denx.de> writes:
> > +The @code{GLIBC_TEST_ALLOW_TIME_SETTING} is set in the environment
> > in  
> "The FOO is set" reads clumsy.  How about just "FOO is set" ?  It's OK
> to start a sentence with a @code{}.
> (In general, you should say "The FOO environment variable" or just
> "FOO" but not "The FOO")
> > In this case there is no prevention from running those tests in
> > parallel,  
> "In this case nothing prevents those tests from running in parallel,"
> > so the caller shall assure that those tests
> > +are serialized or provide proper wrapper script for it.  
> "provide a proper" (add "a")
> > +The @code{cross-test-ssh.sh} script is used and one passes
> > +@option{--allow-time-setting} flag.  
> "One passes the @option{}" (add "the")
> > In this case both - setting the  
> The "-" is not needed here.  Drop the "the"
> > +usage="usage: ${progname} [--ssh SSH][--allow-time-setting] HOST
> > COMMAND ..."  
> Space between "]["
> > +If the '--allow-time-setting' flag is present, set
> > +GLIBC_TEST_ALLOW_TIME_SETTING on the remote machine to inform that
> >  
> s/inform/indicate/ perhaps ?

Thanks for above hints. I will fix them in next version of this patch.

> > +FLOCK_PATH="/var/lock/clock_settime"  
> Should we forcibly set this, or allow the user to override it in case
> /var/lock is the wrong directory to use?  I.e.
> FLOCK_PATH="${FLOCK_PATH:-/var/lock/clock_settime}"

During tests it turned out that locking the script on host (according
to flock manual [1]) shall be done on the very beginning of the script.

In our case we need first to parse arguments and if setting time is
allowed, we serialize the execution of the rest of this script.

Considering the above, IMHO it would be better to use flock on target,
as the first command executed by ssh -c "...". 

It looks like a more robust way to ensure serialization when
--allow-time-setting is set.

> > +if [ "$settimeallowed" ]; then  
> For paranoia, this should be something like
> 	if [ x"$settimeallowed" != x"" ]; then

I've followed the idiom used earlier in this script file - for example
if [ "$timeoutfactor" ]

> > +  exec 99<>${FLOCK_PATH}  
> Check for error
> > +  command="export GLIBC_TEST_ALLOW_TIME_SETTING=1 ${command}"  
> This needs the space before ${command} to be a newline, see the
> addition of TIMEOUTFACTOR for an example.  This causes the exports
> and the ${command} to be separate command lines on the target.

Thanks for this hint - it was not obvious from the outset.



[1] - https://man7.org/linux/man-pages/man1/flock.1.html

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


diff --git a/manual/install.texi b/manual/install.texi
index 419576f49c..13a8058616 100644
--- a/manual/install.texi
+++ b/manual/install.texi
@@ -380,6 +380,23 @@  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, which require setting date on
+the target machine. Following use cases are supported:
+@itemize @bullet
+The @code{GLIBC_TEST_ALLOW_TIME_SETTING} is set in the environment in
+which eligible tests are executed and have priviledges to run
+@code{clock_settime}. In this case there is no prevention from running
+those tests in parallel, so the caller shall assure that those tests
+are serialized or provide proper wrapper script for it.
+The @code{cross-test-ssh.sh} script is used and one passes
+@option{--allow-time-setting} flag. In this case both - setting the
+@code{GLIBC_TEST_ALLOW_TIME_SETTING} and serialization of tests execution
+are assured automatically.
+@end itemize
 In general, when testing @theglibc{}, @samp{test-wrapper} may be set
 to the name and arguments of any program to run newly built binaries.
 This program must preserve the arguments to the binary being run, its
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
 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
+    "--allow-time-setting")
+      settimeallowed="1"
+      ;;
       echo "$usage"
       echo "$help"
@@ -127,6 +136,17 @@  if [ "$timeoutfactor" ]; then
+# 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.
+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}"
 # 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