function box-init
{
pstart "Preparing sandbox... "
- if [ -z "$TEST_USER" -o "$TEST_USER" == $EVAL_USER ] ; then
+
+ # Default values for user/group
+ EVAL_USER=${EVAL_USER:-$USER}
+ EVAL_GROUP=${EVAL_GROUP:-$GROUP}
+ TEST_USER=${TEST_USER:-$EVAL_USER}
+
+ if [ -z "$TEST_USER" -o "$TEST_USER" == "$EVAL_USER" ] ; then
pcont "running locally (INSECURE), "
- TEST_USER=$EVAL_USER
- BOXDIR=`pwd`/box
- BOXCMD=bin/box
- mkdir -p box
+ TEST_USER="$EVAL_USER"
+ BOXDIR=$HDIR/box
+ BOXCMD=$HDIR/bin/box
+ mkdir -p $BOXDIR
else
pcont "used account $TEST_USER, "
- BOXDIR=$MO_ROOT/eval/$TEST_USER
- BOXCMD=bin/box-$TEST_USER
+ BOXDIR=$HDIR/box
+ BOXCMD=$HDIR/bin/box-$TEST_USER
fi
[ -d $BOXDIR -a -f $BOXCMD ] || die "Sandbox set up incorrectly"
BOXCMD="$BOXCMD -c$BOXDIR"
function dir-init
{
pstart "Initializing... "
- HDIR=.
- PDIR=problems/$PROBLEM
- SDIR=solutions/$CONTESTANT/$PROBLEM
- TDIR=testing/$CONTESTANT/$PROBLEM
- TMPDIR=tmp
+ [ -z "$HDIR" ] && HDIR=.
+ PDIR=$HDIR/problems/$PROBLEM
+ SDIR=$HDIR/solutions/$CONTESTANT/$PROBLEM
+ TDIR=$HDIR/testing/$CONTESTANT/$PROBLEM
+ TMPDIR=$HDIR/tmp/
+
[ -d $PDIR ] || die "Problem $PROBLEM not known"
[ -d $SDIR ] || fatal "Solution of $PROBLEM not found"
mkdir -p $TDIR $TMPDIR
cat >$TDIR/log <<EOF
Testing solution of $PROBLEM by $CONTESTANT
Test started at `date`
+Eval base directory: $HDIR
Contestant's solution directory: $SDIR
Problem directory: $PDIR
Testing directory: $TDIR
SG=${M#Caught fatal signal }
SG=${SG#Committed suicide by signal }
if [ "$SG" != "$M" ] ; then
- SG=`perl -MConfig -e '@s=split / /,$Config{sig_name}; print $s[$ARGV[0]]' $SG`
+ SG=`kill -l $SG 2>/dev/null` || SG=
[ -z "$SG" ] || M="$M (SIG$SG)"
fi
# Translate runtime errors to readable strings
RE=${M#Exited with error status }
if [ -n "$EXIT_CODE_HOOK" -a "$RE" != "$M" ] ; then
- NEWMSG=`$EXIT_CODE_HOOK $RE`
+ NEWMSG=`$EXIT_CODE_HOOK $RE` || NEWMSG=
if [ -n "$NEWMSG" ] ; then
M="Runtime error $RE: $NEWMSG"
fi
;;
none) echo "Input file: <none>"
;;
+ dir) echo "Input file: files in directory $PDIR/$TEST.in/"
+ [ -d $PDIR/$TEST.in ] || die "Not a directory: $PDIR/$TEST.in"
+ # TODO: recursive ln to $TDIR
+ cp -r $PDIR/$TEST.in $TDIR/$TEST.in
+ cp -r $PDIR/$TEST.in/* $BOXDIR/
+ # Can have .stdin, but empty by default
+ touch $BOXDIR/.stdin
+ BOX_EXTRAS="$BOX_EXTRAS -i.stdin"
+ ;;
*) die "Unknown IN_TYPE $IN_TYPE"
;;
esac
pcont "<run> "
BOXOPTS=$(expand-var TEST_SANDBOX_OPTS)
echo "Sandbox options: $BOXOPTS"
- if ! $BOXCMD $BOXOPTS -- ./$PROBLEM 2>$TMPDIR/exec.out ; then
+ EXECMD=$(expand-var TEST_EXEC_CMD)
+ [ -z "$EXECMD" ] || echo "Exec command: $EXECMD"
+ [ -z "$EXECMD" ] && EXECMD="./$PROBLEM"
+ if ! $BOXCMD $BOXOPTS -- $EXECMD 2>$TMPDIR/exec.out ; then
cat $TMPDIR/exec.out
MSG=`tail -1 $TMPDIR/exec.out`
test-result 0 "$MSG"
echo "Sandbox options: $BOXOPTS"
ICCMD=$(expand-var IA_CHECK)
echo "Interactive checker: $ICCMD"
- if ! $HDIR/bin/iwrapper $BOXCMD $BOXOPTS -- ./$PROBLEM @@ $ICCMD 2>$TMPDIR/exec.out ; then
+ EXECMD=$(expand-var TEST_EXEC_CMD)
+ [ -z "$EXECMD" ] || echo "Exec command: $EXECMD"
+ [ -z "$EXECMD" ] && EXECMD="./$PROBLEM"
+ if ! $HDIR/bin/iwrapper $BOXCMD $BOXOPTS -- $EXECMD @@ $ICCMD 2>$TMPDIR/exec.out ; then
cat $TMPDIR/exec.out
MSG="`head -1 $TMPDIR/exec.out`"
test-result 0 "$MSG"
function test-run-open-data
{
[ -f $SDIR/$TEST.out ] || test-result 0 "No solution"
- ln $SDIR/$TEST.out $TDIR/$TEST.out
+ try-ln $SDIR/$TEST.out $TDIR/$TEST.out
}
# Syntax checks
MSG=
if [ -n "$OUTPUT_CHECK" -a "$OUT_TYPE" != none -a -z "$EV_NOCHECK" ] ; then
pcont "<check> "
- [ -f $PDIR/$TEST.out ] && ln $PDIR/$TEST.out $TDIR/$TEST.ok
+ [ -f $PDIR/$TEST.out ] && try-ln $PDIR/$TEST.out $TDIR/$TEST.ok
OCHECK=$(expand-var OUTPUT_CHECK)
echo "Output check command: $OCHECK"
if ! eval $OCHECK 2>$TMPDIR/exec.out ; then