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