1 #!/bin/bash
   2 
   3 #
   4 # Script to run jpackage tests.
   5 #
   6 
   7 
   8 # Fail fast
   9 set -e; set -o pipefail;
  10 
  11 
  12 # Link obtained from https://openjdk.java.net/jtreg/ page
  13 jtreg_bundle=https://ci.adoptopenjdk.net/view/Dependencies/job/jtreg/lastSuccessfulBuild/artifact/jtreg-4.2.0-tip.tar.gz
  14 workdir=/tmp/jpackage_jtreg_testing
  15 jtreg_jar=$workdir/jtreg/lib/jtreg.jar
  16 jpackage_test_selector=test/jdk/tools/jpackage
  17 
  18 
  19 find_packaging_tests ()
  20 {
  21   (cd "$open_jdk_with_jpackage_jtreg_tests" && \
  22     find "$jpackage_test_selector/$1" -type f -name '*.java' \
  23     | xargs grep -E -l '@key[[:space:]]+jpackagePlatformPackage')
  24 }
  25 
  26 
  27 find_all_packaging_tests ()
  28 {
  29   find_packaging_tests share
  30   case "$(uname -s)" in
  31     Darwin)
  32       find_packaging_tests macosx;;
  33     Linux)
  34       find_packaging_tests linux;;
  35     CYGWIN*|MINGW32*|MSYS*)
  36       find_packaging_tests windows;;
  37     *)
  38       fatal Failed to detect OS type;;
  39   esac
  40 }
  41 
  42 
  43 help_usage ()
  44 {
  45   echo "Usage: `basename $0` [options] [test_names]"
  46   echo "Options:"
  47   echo "  -h              - print this message"
  48   echo "  -v              - verbose output"
  49   echo "  -c              - keep jtreg cache"
  50   echo "  -a              - run all, not only SQE tests"
  51   echo "  -d              - dry run. Print jtreg command line, but don't execute it"
  52   echo "  -t <jdk>        - path to JDK to be tested [ mandatory ]"
  53   echo "  -j <openjdk>    - path to local copy of openjdk repo with jpackage jtreg tests"
  54   echo "                    Optional, default is openjdk repo where this script resides"
  55   echo "  -o <outputdir>  - path to folder where to copy artifacts for testing."
  56   echo "                    Optional, default is the current directory."
  57   echo '  -r <runtimedir> - value for `jpackage.test.runtime-image` property.'
  58   echo "                    Optional, for jtreg tests debug purposes only."
  59   echo '  -l <logfile>    - value for `jpackage.test.logfile` property.'
  60   echo "                    Optional, for jtreg tests debug purposes only."
  61   echo "  -m <mode>       - mode to run jtreg tests."
  62   echo '                    Should be one of `create`, `update`, `verify-install` or `verify-uninstall`.'
  63   echo '                    Optional, default mode is `update`.'
  64   echo '                    - `create`'
  65   echo '                      Remove all package bundles from the output directory before running jtreg tests.'
  66   echo '                    - `update`'
  67   echo '                      Run jtreg tests and overrite existing package bundles in the output directory.'
  68   echo '                    - `verify-install`'
  69   echo '                      Verify installed packages created with the previous run of the script.'
  70   echo '                    - `verify-uninstall`'
  71   echo '                      Verify packages created with the previous run of the script were uninstalled cleanly.'
  72   echo '                    - `print-default-tests`'
  73   echo '                      Print default list of packaging tests and exit.'
  74 }
  75 
  76 error ()
  77 {
  78   echo "$@" > /dev/stderr
  79 }
  80 
  81 fatal ()
  82 {
  83   error "$@"
  84   exit 1
  85 }
  86 
  87 fatal_with_help_usage ()
  88 {
  89   error "$@"
  90   help_usage
  91   exit 1
  92 }
  93 
  94 if command -v cygpath &> /dev/null; then
  95 to_native_path ()
  96 {
  97   cygpath -m "$@"
  98 }
  99 else
 100 to_native_path ()
 101 {
 102   echo "$@"
 103 }
 104 fi
 105 
 106 exec_command ()
 107 {
 108   if [ -n "$dry_run" ]; then
 109     echo "$@"
 110   else
 111     eval "$@"
 112   fi
 113 }
 114 
 115 
 116 # Path to JDK to be tested.
 117 test_jdk=
 118 
 119 # Path to local copy of open jdk repo with jpackage jtreg tests
 120 # hg clone http://hg.openjdk.java.net/jdk/sandbox
 121 # cd sandbox; hg update -r JDK-8200758-branch
 122 open_jdk_with_jpackage_jtreg_tests=$(dirname $0)/../../../../
 123 
 124 # Directory where to save artifacts for testing.
 125 output_dir=$PWD
 126 
 127 # Script and jtreg debug.
 128 verbose=
 129 jtreg_verbose="-verbose:fail,error,summary"
 130 
 131 keep_jtreg_cache=
 132 
 133 # Mode in which to run jtreg tests
 134 mode=update
 135 
 136 # jtreg extra arguments
 137 declare -a jtreg_args
 138 
 139 # Run all tests
 140 run_all_tests=
 141 
 142 mapfile -t tests < <(find_all_packaging_tests)
 143 
 144 while getopts "vahdct:j:o:r:m:l:" argname; do
 145   case "$argname" in
 146     v) verbose=yes;;
 147     a) run_all_tests=yes;;
 148     d) dry_run=yes;;
 149     c) keep_jtreg_cache=yes;;
 150     t) test_jdk="$OPTARG";;
 151     j) open_jdk_with_jpackage_jtreg_tests="$OPTARG";;
 152     o) output_dir="$OPTARG";;
 153     r) runtime_dir="$OPTARG";;
 154     l) logfile="$OPTARG";;
 155     m) mode="$OPTARG";;
 156     h) help_usage; exit 0;;
 157     ?) help_usage; exit 1;;
 158   esac
 159 done
 160 shift $(( OPTIND - 1 ))
 161 
 162 [ -z "$verbose" ] || { set -x; jtreg_verbose=-va; }
 163 
 164 if [ -z "$open_jdk_with_jpackage_jtreg_tests" ]; then
 165   fatal_with_help_usage "Path to openjdk repo with jpackage jtreg tests not specified"
 166 fi
 167 
 168 if [ "$mode" = "print-default-tests" ]; then
 169   exec_command for t in ${tests[@]}";" do echo '$t;' done
 170   exit
 171 fi
 172 
 173 if [ -z "$test_jdk" ]; then
 174   fatal_with_help_usage Path to test JDK not specified
 175 fi
 176 
 177 if [ -z "$JAVA_HOME" ]; then
 178   echo JAVA_HOME environment variable not set, will use java from test JDK [$test_jdk] to run jtreg
 179   JAVA_HOME="$test_jdk"
 180 fi
 181 if [ ! -e "$JAVA_HOME/bin/java" ]; then
 182   fatal JAVA_HOME variable is set to [$JAVA_HOME] value, but $JAVA_HOME/bin/java not found.
 183 fi
 184 
 185 if [ -n "$runtime_dir" ]; then
 186   if [ ! -d "$runtime_dir" ]; then
 187     fatal 'Value of `-r` option is set to non-existing directory'.
 188   fi
 189   jtreg_args+=("-Djpackage.test.runtime-image=$(to_native_path "$(cd "$runtime_dir" && pwd)")")
 190 fi
 191 
 192 if [ -n "$logfile" ]; then
 193   if [ ! -d "$(dirname "$logfile")" ]; then
 194     fatal 'Value of `-l` option specified a file in non-existing directory'.
 195   fi
 196   logfile="$(cd "$(dirname "$logfile")" && pwd)/$(basename "$logfile")"
 197   jtreg_args+=("-Djpackage.test.logfile=$(to_native_path "$logfile")")
 198 fi
 199 
 200 if [ "$mode" = create ]; then
 201   true
 202 elif [ "$mode" = update ]; then
 203   true
 204 elif [ "$mode" = verify-install ]; then
 205   jtreg_args+=("-Djpackage.test.action=$mode")
 206 elif [ "$mode" = verify-uninstall ]; then
 207   jtreg_args+=("-Djpackage.test.action=$mode")
 208 else
 209   fatal_with_help_usage 'Invalid value of -m option:' [$mode]
 210 fi
 211 
 212 if [ -z "$run_all_tests" ]; then
 213   jtreg_args+=(-Djpackage.test.SQETest=yes)
 214 fi
 215 
 216 # All remaining command line arguments are tests to run that should override the defaults
 217 [ $# -eq 0 ] || tests=($@)
 218 
 219 
 220 installJtreg ()
 221 {
 222   # Install jtreg if missing
 223   if [ ! -f "$jtreg_jar" ]; then
 224     exec_command mkdir -p "$workdir"
 225     exec_command "(" cd "$workdir" "&&" wget "$jtreg_bundle" "&&" tar -xzf "$(basename $jtreg_bundle)" ";" rm -f "$(basename $jtreg_bundle)" ")"
 226   fi
 227 }
 228 
 229 
 230 preRun ()
 231 {
 232   local xargs_args=(-t --no-run-if-empty rm)
 233   if [ -n "$dry_run" ]; then
 234     xargs_args=(--no-run-if-empty echo rm)
 235   fi
 236 
 237   if [ ! -d "$output_dir" ]; then
 238     exec_command mkdir -p "$output_dir"
 239   fi
 240   [ ! -d "$output_dir" ] || output_dir=$(cd "$output_dir" && pwd)
 241 
 242   # Clean output directory
 243   [ "$mode" != "create" ] || find $output_dir -maxdepth 1 -type f -name '*.exe' -or -name '*.msi' -or -name '*.rpm' -or -name '*.deb' | xargs "${xargs_args[@]}"
 244 }
 245 
 246 
 247 run ()
 248 {
 249   local jtreg_cmdline=(\
 250     $JAVA_HOME/bin/java -jar $(to_native_path "$jtreg_jar") \
 251     "-Djpackage.test.output=$(to_native_path "$output_dir")" \
 252     "${jtreg_args[@]}" \
 253     -nr \
 254     "$jtreg_verbose" \
 255     -retain:all \
 256     -automatic \
 257     -ignore:run \
 258     -testjdk:"$(to_native_path $test_jdk)" \
 259     -dir:"$(to_native_path $open_jdk_with_jpackage_jtreg_tests)" \
 260     -reportDir:"$(to_native_path $workdir/run/results)" \
 261     -workDir:"$(to_native_path $workdir/run/support)" \
 262     "${tests[@]}" \
 263   )
 264 
 265   # Clear previous results
 266   [ -n "$keep_jtreg_cache" ] || exec_command rm -rf "$workdir"/run
 267 
 268   # Run jpackage jtreg tests to create artifacts for testing
 269   exec_command ${jtreg_cmdline[@]}
 270 }
 271 
 272 
 273 installJtreg
 274 preRun
 275 run