1 #!/bin/env/bash
  2 
  3 # Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
  4 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  5 #
  6 # This code is free software; you can redistribute it and/or modify it
  7 # under the terms of the GNU General Public License version 2 only, as
  8 # published by the Free Software Foundation.  Oracle designates this
  9 # particular file as subject to the "Classpath" exception as provided
 10 # by Oracle in the LICENSE file that accompanied this code.
 11 #
 12 # This code is distributed in the hope that it will be useful, but WITHOUT
 13 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 14 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 15 # version 2 for more details (a copy is included in the LICENSE file that
 16 # accompanied this code).
 17 #
 18 # You should have received a copy of the GNU General Public License version
 19 # 2 along with this work; if not, write to the Free Software Foundation,
 20 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 21 #
 22 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 23 # or visit www.oracle.com if you need additional information or have any
 24 # questions.
 25 
 26 ##############################################
 27 # How to use it?
 28 # 1. Run this script with --generate-config-file  
 29 # 2. Fill the template file: remoteTesting.conf
 30 # 3. Run again this script without any parameters
 31 # ############################################
 32 
 33 display_help() {
 34   echo "Usage: $(basename "$0") [options]"
 35   echo
 36   echo "When running without any options, it reads the \"remoteTesting.conf\" and runs the testing framework on the remote machines."
 37   echo
 38   echo "Options:"
 39   echo "  --help                  Display this help message and exit."
 40   echo "  --generate-config-file  Generate a default configuration file and exit."
 41   echo "  --build-babylon         Build Babylon and HAT for all remote servers"
 42   echo
 43   echo "How to use it?"
 44   echo "   1. Run this script with --generate-config-file "
 45   echo "   2. Fill the template file: remoteTesting.conf"
 46   echo "   3. Run again this script without any parameters "
 47   exit 0
 48 }
 49 
 50 GREEN="\033[0;32m"
 51 NC="\033[0m" # No Color (reset)
 52 
 53 generate_config_file() {
 54     cat << EOF > remoteTesting.conf 
 55 # HAT Remote Testing Settings
 56 SERVERS=server1 server2 ...
 57 REMOTE_USERS=user1 user2 ...
 58 
 59 ## List of Backends to test
 60 # To test one backend
 61 #BACKENDS=ffi-opencl
 62 # We can also test multiple backends
 63 BACKENDS=ffi-cuda ffi-opencl
 64 # Specify the Babylon fork to test
 65 FORK=https://github.com/openjdk/babylon
 66 
 67 ## Remote path. It assumes all servers use the same path
 68 REMOTE_PATH=repos/babylon/hat
 69 ## Branch to test
 70 BRANCH=code-reflection
 71 EOF
 72   echo "✅ Default configuration file 'remoteTesting.conf' has been generated."
 73   exit 0
 74 }
 75 
 76 read_config_file() {
 77   CONFIG_FILE="remoteTesting.conf"
 78 
 79   # Check if the config file exists
 80   if [ ! -f "$CONFIG_FILE" ]; then
 81     echo "Error: $CONFIG_FILE not found."
 82     echo "Run this script with --generate-config-file to generate a template."
 83     exit 1
 84   fi
 85 
 86   ## Process the config file
 87   while IFS='=' read -r key value
 88   do
 89     if [[ -z "$key" || "$key" =~ ^# ]]; then
 90       continue
 91     fi
 92 
 93     case "$key" in
 94       "SERVERS") SERVERS="$value" ;;
 95       "REMOTE_USERS") REMOTE_USERS="$value" ;;
 96       "BACKENDS") BACKENDS=($value) ;;
 97       "REMOTE_PATH") REMOTE_PATH="$value" ;;
 98       "BRANCH") BRANCH="$value" ;;
 99       "FORK") FORK="$value" ;;
100     esac
101   done < "$CONFIG_FILE"
102 
103   isSet=1
104   if [[ -z $SERVERS ]]; then
105     echo "❌ SERVERS is not set."
106     isSet=0
107   fi
108   if [[ -z $REMOTE_USERS ]]; then
109     echo "❌ REMOTE_USERS is not set."
110     isSet=0
111   fi
112   if [[ -z $BACKENDS ]]; then
113     echo "❌ BACKENDS is not set."
114     isSet=0
115   fi
116   if [[ -z $REMOTE_PATH ]]; then
117     echo "❌ REMOTE_PATH is not set."
118     isSet=0
119   fi
120   if [[ -z $BRANCH ]]; then
121     echo "❌ BRANCH is not set."
122     isSet=0
123   fi
124   if [[ -z $FORK ]]; then
125     echo "❌ FORK is not set."
126     isSet=0
127   fi
128 
129   if [[ "$isSet" -eq 0 ]]; then
130 	  exit
131   fi
132 
133   echo
134   echo "Servers    : $SERVERS"
135   echo "Users      : $REMOTE_USERS"
136   echo "Backends   : ${BACKENDS[@]}"
137   echo "Remote Path: $REMOTE_PATH"
138   echo "Fork       : $FORK"
139   echo "Branch     : $BRANCH"
140   echo
141 
142   read -ra listOfServers <<< $SERVERS
143   read -ra listOfUsers <<< $REMOTE_USERS
144 }
145 
146 build_babylon() {
147 
148   echo "Build Babylon and HAT"
149   
150   read_config_file
151 
152   for index in "${!listOfServers[@]}"
153   do
154     server=${listOfServers[$index]}
155     user=${listOfUsers[$index]}
156 
157     echo -e "${GREEN}[info] ssh $user@$server${NC}"
158     ssh -T $user@$server << EOF
159 if [ ! -d $REMOTE_PATH ]; 
160 then 
161   mkdir -p \$(dirname $REMOTE_PATH)
162   cd \$(dirname $REMOTE_PATH)
163   git clone $FORK \$(basename $REMOTE_PATH)
164 fi
165 
166 #Assuming the remote path ends with babylon
167 cd $REMOTE_PATH
168 git fetch --all
169 git checkout $BRANCH
170 git pull
171 
172 echo "bash configure --with-boot-jdk=\$HOME/.sdkman/candidates/java/current"
173 bash configure --with-boot-jdk="\$HOME/.sdkman/candidates/java/current" > jvmconfig.log
174 make clean
175 make images > jvmbuild.log
176 
177 ## Build HAT 
178 cd hat 
179 if [ ! -d jextract-22 ];
180 then
181   echo "ARCHITECTIRE \$(uname -m)"
182   if [[ "\$(uname -m)" == "x86_64" ]]; then
183       wget https://download.java.net/java/early_access/jextract/22/6/openjdk-22-jextract+6-47_linux-x64_bin.tar.gz
184       tar xvzf openjdk-22-jextract+6-47_linux-x64_bin.tar.gz > /dev/null
185   elif [[ "\$(uname -m)" == "arm64" ]]; then
186       wget https://download.java.net/java/early_access/jextract/22/6/openjdk-22-jextract+6-47_macos-aarch64_bin.tar.gz
187       tar xvzf openjdk-22-jextract+6-47_macos-aarch64_bin.tar.gz > /dev/null
188   fi
189   echo "export PATH=\$(pwd)/jextract-22/bin:\$PATH" >> setup.sh
190   echo "source env.bash" >> setup.sh
191 fi
192 
193 source setup.sh > /dev/null 2> /dev/null
194 java @hat/clean > hatCompilation.log 2> hatCompilationErrors.log
195 java @hat/bld >> hatCompilation.log 2>> hatCompilationErrors.log
196 EOF
197 done
198 
199 }
200 
201 run_tests_hat() {
202 
203 read_config_file
204 
205 for index in "${!listOfServers[@]}"
206 do
207 
208 server=${listOfServers[$index]}
209 user=${listOfUsers[$index]}
210 
211 echo -e "\n${GREEN}[info] ssh $user@$server${NC}"
212 backend_definition=$(typeset -p BACKENDS)
213 ssh $user@$server bash << EOF
214 $backend_definition
215 cd "$REMOTE_PATH"
216 cd hat/
217 git fetch --all
218 git checkout $BRANCH
219 git pull
220 
221 # compile
222 source setup.sh > /dev/null 2> /dev/null
223 java @hat/clean > hatCompilation.log 2> hatCompilationErrors.log
224 java @hat/bld >> hatCompilation.log 2>> hatCompilationErrors.log
225 
226 # run the test suite per backend
227 for backend in "\${BACKENDS[@]}"
228 do
229 echo -e "${GREEN}[running] java -cp hat/job.jar hat.java test "\$backend" ${NC}"
230 java -cp hat/job.jar hat.java test "\$backend" > "\$backend".txt 2> "\$backend"Errors.txt
231 done
232 
233 # Print logs
234 for backend in "\${BACKENDS[@]}"
235 do
236 cat "\$backend".txt
237 done
238 
239 ## Run violajones
240 for backend in "\${BACKENDS[@]}"
241 do
242 echo -e "${GREEN}[running] java -cp hat/job.jar hat.java run "\$backend" -Dheadless=true violajones${NC}"
243 java -cp hat/job.jar hat.java run "\$backend" -Dheadless=true violajones > "\$backend"Violajones.log
244 done
245 
246 for backend in "\${BACKENDS[@]}"
247 do
248 cat "\$backend"Violajones.log | grep "336faces found"
249 done
250 EOF
251 done
252 }
253 
254 while [[ $# -gt 0 ]]; do
255   key="$1"
256   case $key in
257     --help)
258       display_help
259       exit
260       ;;
261     --generate-config-file)
262       generate_config_file
263       exit 
264       ;;
265     --build-babylon)
266       build_babylon
267       exit 0
268       ;;
269     *)
270       # Unknown option
271       echo "Error: Unknown option '$key'"
272       echo "Use --help for a list of available options."
273       exit 1
274       ;;
275   esac
276 done
277 
278 run_tests_hat
279