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