jtreg shell tests

Jonathan Gibbons jonathan.gibbons at oracle.com
Sat Jan 26 00:43:30 UTC 2019


With all the recent discussion regarding how to support the use of 
Windows Subsystem for Linux (WSL)
as an alternate to Cygwin, it seems worth writing up some 
recommendations on writing jtreg shell tests.
The intent of these notes is that they will evolve into a page in the 
jtreg section on the OpenJDK website.

The focus is specifically about different approaches to providing the 
ability to run a shell test on all
supported platforms, by means of abstracting the significant differences 
into a series of environment
variables that are set according to the environment in which the test is 
running.

Option 1.

Convert the test to Java. In general, this continues to be the 
recommended alternative.


Option 2.

Use a shell `case` statement, like the following, or a variant thereof:

    OS=`uname -s`;
    case "$OS" in
         Windows* | CYGWIN* )
             FS="\\"
             PS=";"
             NULL=NUL
             ;;

         Linux )
             if [ -r $TESTJAVA/bin/java.exe ]; then
                 FS="\\"
                 PS=";"
                 EXE_SUFFIX=".exe"
             else
                 FS="/"
                 PS=":"
             fi
             NULL=/dev/null
             ;;

         * )
             FS="/"
             PS=":"
             NULL=/dev/null
    esac

Option 3.

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`.


Option 4.

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.


Running scripts standalone.

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.



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/quality-discuss/attachments/20190125/30b07869/attachment.html>


More information about the quality-discuss mailing list