1 # The Evaluator -- Shell Function Library
2 # (c) 2001--2004 Martin Mares <mj@ucw.cz>
8 # File handles used: fd1=log, fd2=progress
33 # Report an internal error
35 [ -n "$HAVE_LOG" ] && echo "Fatal error: $@"
41 # Report a fatal error in the program being tested
43 [ -n "$HAVE_LOG" ] && echo "Fatal error: $@"
51 pstart "Preparing sandbox... "
52 if [ -z "$TEST_USER" -o "$TEST_USER" == $EVAL_USER ] ; then
53 pcont "running locally (INSECURE), "
59 pcont "used account $TEST_USER, "
60 BOXDIR=$MO_ROOT/eval/$TEST_USER
61 BOXCMD=bin/box-$TEST_USER
63 [ -d $BOXDIR -a -f $BOXCMD ] || die "Sandbox set up incorrectly"
64 BOXCMD="$BOXCMD -c$BOXDIR"
65 echo "Sandbox directory: $BOXDIR"
66 echo "Sandbox command: $BOXCMD"
73 [ -n "$BOXCMD" ] || die "box-init not called"
77 # Initialization of testing directories
81 pstart "Initializing... "
83 PDIR=problems/$PROBLEM
84 SDIR=solutions/$CONTESTANT/$PROBLEM
85 TDIR=testing/$CONTESTANT/$PROBLEM
87 [ -d $PDIR ] || die "Problem $PROBLEM not known"
88 [ -d $SDIR ] || fatal "Solution of $PROBLEM not found"
89 mkdir -p $TDIR $TMPDIR
91 mkdir -p $TDIR $TMPDIR
93 Testing solution of $PROBLEM by $CONTESTANT
94 Test started at `date`
95 Contestant's solution directory: $SDIR
96 Problem directory: $PDIR
97 Testing directory: $TDIR
102 # Locating source file in SDIR, pass name in SRCN (without path) and extension in SRCEXT
104 function locate-source
106 pstart "Finding source... "
107 if [ -n "$1" ] ; then
108 SRCBASE=$(echo $1 | sed 's/\.\([^.]\+\)//')
109 SRCEXT=$(echo $1 | sed 's/.*\.\([^.]\+\)/\1/')
110 if [ -n "$SRCEXT" ] ; then
111 # Full name given, so just check the extension and existence
113 if [ ${SRCN:0:1} == / ] ; then
117 [ -f "$SDIR/$SRCN" ] || die "Cannot find source file $SDIR/$SRCN"
119 for a in $EXTENSIONS ; do
120 if [ $a == $SRCEXT ] ; then
122 echo "Explicitly set source file: $SDIR/$SRCN"
126 die "Unknown extension .$SRCEXT"
131 for a in $EXTENSIONS ; do
132 if [ -f $SDIR/$SBASE.$a ] ; then
133 [ -z "$SRCN" ] || die "Multiple source files found: $SDIR/$PROBLEM.$a and $SDIR/$SRCN. Please fix."
138 [ -n "$SRCN" ] || fatal "NOT FOUND"
140 echo "Found source file: $SDIR/$SRCN"
143 # Compilation (compile SDIR/SRCN with PDIR/COMP_EXTRAS to EXE=TDIR/PROBLEM)
147 pstart "Compiling... "
148 # Beware, the original SRCN can be a strange user-supplied name
150 cp -a $SDIR/$SRCN $TDIR/$SRC
151 if [ -n "$COMP_EXTRAS" ] ; then
152 echo "Extras: $COMP_EXTRAS"
153 for a in $COMP_EXTRAS ; do cp $PDIR/$a $TDIR/ ; done
156 for a in $SRC $COMP_EXTRAS ; do cp $TDIR/$a $BOXDIR/ ; done
159 CCMD=`eval echo ${!CCMD}`
160 COMP_SANDBOX_OPTS=`eval echo $COMP_SANDBOX_OPTS`
161 echo "Compiler command: $CCMD"
162 echo "Compiler sandbox options: $COMP_SANDBOX_OPTS"
163 eval $COMP_SANDBOX_INIT
165 echo "Compiler input files:"
167 echo "Compiler output:"
168 if ! $BOXCMD $COMP_SANDBOX_OPTS -- $CCMD 2>$TDIR/compile.out ; then
169 COMPILE_MSG="`cat $TDIR/compile.out`"
170 pend "FAILED: $COMPILE_MSG"
174 cat $TDIR/compile.out
176 echo "Compiler output files:"
178 if [ ! -f $BOXDIR/$PROBLEM ] ; then
179 pend "FAILED: Missing executable file"
180 echo "Missing executable file"
184 cp -a $BOXDIR/$PROBLEM $EXE
185 echo "Compiled OK, result copied to $EXE"
189 # Running of test program according to current task type (returns exit code and TEST_MSG)
200 if [ -s $TDIR/$TEST.pts ] ; then
201 P=`cat $TDIR/$TEST.pts`
213 echo "Executable file: $TDIR/$PROBLEM"
214 if [ ! -x $TDIR/$PROBLEM ] ; then
215 test-result 0 "Compile error."
217 cp $TDIR/$PROBLEM $BOXDIR/
219 IN_TYPE=${IN_TYPE:-$IO_TYPE}
220 OUT_TYPE=${OUT_TYPE:-$IO_TYPE}
222 file) echo "Input file: $PROBLEM.in (from $PDIR/$TEST.in)"
223 ln $PDIR/$TEST.in $TDIR/$TEST.in
224 cp $PDIR/$TEST.in $BOXDIR/$PROBLEM.in
225 BOX_EXTRAS="$BOX_EXTRAS -i/dev/null"
227 stdio) echo "Input file: <stdin> (from $PDIR/$TEST.in)"
228 ln $PDIR/$TEST.in $TDIR/$TEST.in
229 cp $PDIR/$TEST.in $BOXDIR/.stdin
230 BOX_EXTRAS="$BOX_EXTRAS -i.stdin"
232 none) echo "Input file: <none>"
234 *) die "Unknown IN_TYPE $IN_TYPE"
238 file) echo "Output file: $PROBLEM.out"
239 BOX_EXTRAS="$BOX_EXTRAS -o/dev/null"
241 stdio) echo "Output file: <stdout>"
242 BOX_EXTRAS="$BOX_EXTRAS -o.stdout"
244 none) echo "Output file: <none>"
246 *) die "Unknown OUT_TYPE $OUT_TYPE"
249 echo "Timeout: $TIME_LIMIT s"
250 echo "Memory: $MEM_LIMIT KB"
252 echo "Sandbox contents before start:"
258 echo "Sandbox contents after exit:"
260 case ${OUT_TYPE:-$IO_TYPE} in
261 file) [ -f $BOXDIR/$PROBLEM.out ] || test-result 0 "No output file."
262 cp $BOXDIR/$PROBLEM.out $TDIR/$TEST.out
264 stdio) [ -f $BOXDIR/.stdout ] || test-result 0 "No output file."
265 cp $BOXDIR/.stdout $TDIR/$TEST.out
270 # Running of test program with file input/output
272 function test-run-file
276 BOXOPTS="`eval echo $TEST_SANDBOX_OPTS`$BOX_EXTRAS"
277 echo "Sandbox options: $BOXOPTS"
278 if ! $BOXCMD $BOXOPTS -- ./$PROBLEM 2>$TMPDIR/exec.out ; then
280 MSG=`tail -1 $TMPDIR/exec.out`
287 # Running of interactive test programs
289 function test-run-interactive
293 BOXOPTS="`eval echo $TEST_SANDBOX_OPTS`$BOX_EXTRAS"
294 echo "Sandbox options: $BOXOPTS"
295 ICCMD=`eval echo $IA_CHECK`
296 echo "Interactive checker: $ICCMD"
297 if ! $HDIR/bin/iwrapper $BOXCMD $BOXOPTS -- ./$PROBLEM @@ $ICCMD 2>$TMPDIR/exec.out ; then
299 MSG="`tail -1 $TMPDIR/exec.out`"
308 function syntax-check
310 [ -n "$SYNTAX_CHECK" ] || return 0
312 SCHECK=`eval echo $SYNTAX_CHECK`
313 echo "Syntax check command: $SCHECK"
314 if ! eval $SCHECK 2>$TMPDIR/exec.out ; then
316 MSG=`tail -1 $TMPDIR/exec.out`
317 if [ -z "$MSG" ] ; then MSG="Wrong syntax." ; fi
325 function output-check
327 [ -n "$OUTPUT_CHECK" ] || return 0
329 [ -f $PDIR/$TEST.out ] && ln $PDIR/$TEST.out $TDIR/$TEST.ok
330 OCHECK=`eval echo $OUTPUT_CHECK`
331 echo "Output check command: $OCHECK"
332 if ! eval $OCHECK 2>$TMPDIR/exec.out ; then
334 MSG=`tail -1 $TMPDIR/exec.out`
335 if [ -z "$MSG" ] ; then MSG="Wrong answer." ; fi
339 MSG=`tail -1 $TMPDIR/exec.out`
340 if [ -z "$MSG" ] ; then MSG="OK" ; fi
341 test-result $POINTS_PER_TEST "$MSG"
344 # Setup of public commands
346 function public-setup
349 PDIR=$MO_ROOT/problems/$PROBLEM
353 [ -d $PDIR ] || die "Unknown problem $PROBLEM"
355 pstart "Initializing... "
361 BOXCMD="$MO_ROOT/bin/box -c$BOXDIR"
363 pend "OK (see 'log' for details)"
366 # Locate output of open data problem, test case TEST
370 [ -f $PDIR/$TEST.in ] || die "Unknown test $TEST"
371 if [ -n "$1" ] ; then
374 SRCN=$SDIR/$PROBLEM$TEST.out
376 [ -f $SRCN ] || fatal "Output file $SRCN not found"