Newer
Older
set -e
#This script:
# - compiles the PHYEX package using a specific commit
# - runs the different test progs and checks if results are identical to a given version
#ice_adjust: the ice adjust test case
specialName="ref"
availTests="ice_adjust,rain_ice"
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
defaultTest='ALL'
separator='_' #- seprator must be in sync with prep_code.sh separator
PHYEXTOOLSDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
dirdata=$PHYEXTOOLSDIR/testprogs_data
if [ $(hostname | cut -c 1-7) == 'belenos' -o $(hostname | cut -c 1-7) == 'taranis' ]; then
HPC=1
archfile=MIMPIIFC1805.EPONA
else
HPC=0
archfile=gnu
fi
defaultRef=ref
function usage {
echo "Usage: $0 [-h] [-c] [-r] [-C] [-s] [-f] [--noexpand] [-t test] commit reference"
echo "commit commit hash (or a directory, or among $specialName) to test"
echo "reference commit hash (or a directory, or among $specialName) REF to use as a reference"
echo "-s suppress compilation pack"
echo "-c performs compilation"
echo "-r runs the tests"
echo "-C checks the result against the reference"
echo "-t comma separated list of tests to execute"
echo " or ALL to execute all tests"
echo "--noexpand do not use mnh_expand (code will be in array-syntax)"
echo ""
echo "If nothing is asked (compilation, running, check) everything is done"
echo
echo "With the special reference REF commit, a suitable reference is guessed"
echo
echo "If no test is aked for, the default one ($defaultTest) is executed"
echo
echo "The directory (for commit only, not ref) can take the form server:directory"
echo
echo "If using a directory (for commit or reference) it must contain at least one '/'"
}
compilation=0
run=0
check=0
commit=""
reference=""
tests=""
suppress=0
useexpand=1
while [ -n "$1" ]; do
case "$1" in
'-h') usage;;
'-s') suppress=1;;
'-c') compilation=1;;
'-r') run=$(($run+1));;
'-C') check=1;;
'-t') tests="$2"; shift;;
'--noexpand') useexpand=0;;
#--) shift; break ;;
*) if [ -z "${commit-}" ]; then
commit=$1
else
if [ -z "${reference-}" ]; then
reference=$1
else
echo "Only two commit hash allowed on command line"
exit 1
fi
fi;;
esac
shift
done
TESTDIR=${TESTPROGSDIR:=$HOME/TESTPROGS}
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
function exescript () {
#usage: exescript <output file> <script> [arg [arg ...]]
output=$1
shift
if [ $HPC -eq 1 ]; then
sbatch --wait -o $output $@
cat $output
else
$@ 2>&1 | tee $output
fi
}
if [ -z "${tests-}" ]; then
tests=$defaultTest
fi
if [ $tests == 'ALL' ]; then
tests=$availTests
fi
if [ $compilation -eq 0 -a \
$run -eq 0 -a \
$check -eq 0 ]; then
compilation=1
run=1
check=1
fi
if [ -z "${commit-}" ]; then
echo "At least one commit hash must be provided on command line"
exit 2
fi
if [ $check -eq 1 -a -z "${reference-}" ]; then
echo "To perform a comparison two commit hashes are mandatory on the command line"
exit 3
fi
#Name is choosen such as it can be produced with a main pack: PHYEX/48t1_XXXXXXXXX.01.${gmkpack_l}.${gmkpack_o}
fromdir=''
if echo $commit | grep '/' > /dev/null; then
fromdir=$commit
name=$(echo $commit | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')
[ $suppress -eq 1 -a -d $TESTDIR/$name ] && rm -rf $TESTDIR/$name
elif echo $specialName | grep -w $commit > /dev/null; then
name="$commit"
else
name="COMMIT$commit"
[ $suppress -eq 1 -a -d $TESTDIR/$name ] && rm -rf $TESTDIR/$name
fi
if [ ! -z "${reference-}" ]; then
[ $reference == 'REF' ] && reference=$defaultRef
reffromdir=''
if echo $reference | grep '/' > /dev/null; then
reffromdir=$reference
refname=$(echo $reference | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')
elif echo $specialName | grep -w $reference > /dev/null; then
refname="$reference"
else
refname="COMMIT${reference}"
fi
fi
if [ $compilation -eq 1 ]; then
echo "### Compilation of commit $commit"
if echo $specialName | grep -w $commit > /dev/null; then
echo "Special commit '$commit' cannot be compiled with this script"
exit 4
fi
if [ -d $TESTDIR/$name ]; then
echo "Pack already exists ($TESTDIR/$name), suppress it to be able to compile it again (or use the -s option to automatically suppress it)"
exit 5
fi
mkdir $TESTDIR/$name
cd $TESTDIR/$name/
MNH_EXPAND_DIR=$PHYEXTOOLSDIR/mnh_expand
export PATH=$MNH_EXPAND_DIR/filepp:$MNH_EXPAND_DIR/MNH_Expand_Array:$PATH
if [ $useexpand == 1 ]; then
expand_options="-D MNH_EXPAND -D MNH_EXPAND_LOOP"
else
expand_options=""
fi
subs="$subs -s turb -s micro -s aux -s ice_adjust"
prep_code=$PHYEXTOOLSDIR/prep_code.sh
if [ "$fromdir" == '' ]; then
echo "Clone repository, and checkout commit $commit (using prep_code.sh)"
$prep_code -c $commit $expand_options $subs src
else
echo "Copy $fromdir"
scp -q -r $fromdir src
$prep_code $expand_options $subs src
fi
cd $TESTDIR/$name/src/build/with_fcm/
rm -rf arch_*
./make_fcm.sh --arch $archfile 2>&1 | tee Output_compilation
fi
if [ $run -ge 1 ]; then
echo "### Running of commit $commit"
for t in $(echo $tests | sed 's/,/ /g'); do
if [ ! -f $TESTDIR/$name/src/build/with_fcm/arch_${archfile}/build/bin/main_${t}.exe ]; then
echo "Pack does not exist ($TESTDIR/$name) or compilation has failed, please check"
exit 6
fi
done
#Cleaning to suppress old results that may be confusing in case of a crash during the run
for t in $(echo $tests | sed 's/,/ /g'); do
cd $TESTDIR/$name
if [ -d tests/$t ]; then
rm -rf tests/$t
fi
done
#Run the tests one after the other
for t in $(echo $tests | sed 's/,/ /g'); do
cd $TESTDIR/$name
mkdir -p tests/$t
cd tests/$t
ln -s $dirdata/$t data
$TESTDIR/$name/src/build/with_fcm/arch_${archfile}/build/bin/main_${t}.exe --check 2>&1 > Output_run
done
fi
if [ $check -eq 1 ]; then
echo "### Check commit $commit against commit $reference"
alltests=0
message=""
for t in $(echo $tests | sed 's/,/ /g'); do
file1=$TESTDIR/$name/tests/$t/Output_run
file2=$TESTDIR/$refname/tests/$t/Output_run
mess=""
te=0
if [ ! -f "$file1" ]; then
mess="Result ($file1) for commit $commit does not exist, please run the simulation"
te=1
fi
if [ ! -f "$file2" ]; then
mess2="Result ($file2) for commit $reference does not exist, please run the simulation"
te=1
if [ "$mess" = "" ]; then
mess=$mess2
else
mess="$mess and $mess2"
fi
fi
if [ $te -eq 0 ]; then
set +e
mess=$(cmp $file1 $file2 246 246 2>&1)
te=$?
set -e
fi
[ $te -ne 0 ] && message="$message $mess \n"
alltests=$(($alltests+$te))
done
if [ $alltests -eq 0 ]; then
echo "SUCCESS, files are identical"
else
echo "*************** Files are different *******************"
echo -e "$message"
fi
fi