<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
With all the recent discussion regarding how to support the use of
Windows Subsystem for Linux (WSL)<br>
as an alternate to Cygwin, it seems worth writing up some
recommendations on writing jtreg shell tests.<br>
The intent of these notes is that they will evolve into a page in
the jtreg section on the OpenJDK website.<br>
<br>
The focus is specifically about different approaches to providing
the ability to run a shell test on all <br>
supported platforms, by means of abstracting the significant
differences into a series of environment<br>
variables that are set according to the environment in which the
test is running.<br>
<br>
Option 1. <br>
<br>
Convert the test to Java. In general, this continues to be the
recommended alternative.<br>
<br>
<br>
Option 2.<br>
<br>
Use a shell `case` statement, like the following, or a variant
thereof:<br>
<blockquote><tt>OS=`uname -s`;
</tt><tt><br>
</tt><tt>case "$OS" in
</tt><tt><br>
</tt><tt>Â Â Â Windows* | CYGWIN* )
</tt><tt><br>
</tt><tt>Â Â Â Â Â Â Â FS="\\"
</tt><tt><br>
</tt><tt>Â Â Â Â Â Â Â PS=";"
</tt><tt><br>
       NULL=NUL<br>
</tt><tt>Â Â Â Â Â Â Â ;;
</tt><tt><br>
</tt>
<tt><br>
</tt><tt>Â Â Â Linux )
</tt><tt><br>
</tt><tt>Â Â Â Â Â Â Â if [ -r $TESTJAVA/bin/java.exe ]; then
</tt><tt><br>
</tt><tt>Â Â Â Â Â Â Â Â Â Â FS="\\"
</tt><tt><br>
</tt><tt>Â Â Â Â Â Â Â Â Â Â Â PS=";"
</tt><tt><br>
</tt><tt>Â Â Â Â Â Â Â Â Â Â EXE_SUFFIX=".exe"
</tt><tt><br>
</tt><tt>Â Â Â Â Â Â Â else
</tt><tt><br>
</tt><tt>Â Â Â Â Â Â Â Â Â Â Â FS="/"
</tt><tt><br>
</tt><tt>Â Â Â Â Â Â Â Â Â Â Â PS=":"
</tt><tt><br>
</tt><tt>Â Â Â Â Â Â Â fi
</tt><tt><br>
       NULL=/dev/null<br>
</tt><tt>Â Â Â Â Â Â Â ;;
</tt><tt><br>
</tt>
<tt><br>
</tt><tt>Â Â Â * )
</tt><tt><br>
</tt><tt>Â Â Â Â Â Â Â FS="/"
</tt><tt><br>
</tt><tt>Â Â Â Â Â Â Â PS=":"
</tt><tt><br>
       NULL=/dev/null<br>
</tt><tt>esac<br>
</tt><br>
</blockquote>
Option 3.<br>
<br>
Use a shared library script to embody the behavior in the previous
example. jtreg now provides a new `TESTROOT` environment variable,
which makes it easy to reference a shared script in a constant
manner from any shell test, wherever the test is within the test
suite. Since the library script is used to set environment variables
like `FS`, `PS`, and `NULL`, it should be executed with `source` and
not `bash` or `sh`.<br>
<br>
<br>
Option 4.<br>
<br>
jtreg now sets the following environment variables when running a
shell script: `FS`, `PS`, `NULL` and `EXE_SUFFIX`. This may be
enough to completely avoid the need for a `case` statement in each
shell script or the use of a shared library script to set these
variables.<br>
<br>
<br>
Running scripts standalone.<br>
<br>
One concern when working with shell tests has been the ability to
run the test "stand-alone", without the use of jtreg. In the past,
this was seen as justification for the explicit use of the `case`
statement in each shell test. However, the need to run shell tests
standalone no longer seems to be a significant concern. For those
that do want to run shell tests by themselves, it is worth noting
that once a test has been run by jtreg, the ".jtr" file contains
"rerun" sections with details on how to run each action of the test.
You can either copy/paste/edit from the ".jtr" file directly, or use
the jtreg `-show:rerun` option to output the information to the
standard output stream.<br>
<blockquote><tt><br>
<br>
</tt></blockquote>
</body>
</html>