1 DIRNAME0=`dirname "$0"`
2 #ROOT_OUTDIR="$DIRNAME0/out"
4 #OUTDIR="$DIRNAME0/out"
20 kill `$DIRNAME0/list_all_children.sh $1`
22 kill -9 `$DIRNAME0/list_all_children.sh $1`
26 #BORED_AFTER_SECS=7200 #If we have spent more than 3600 secs (an hour) replaying a file, without learning anything new, go and start looking for more bugs instead
27 if [ -z $BORED_AFTER_SECS ]
29 BORED_AFTER_SECS=3600 #If we have spent more than 3600 secs (an hour) replaying a file, without learning anything new, go and start looking for more bugs instead
34 #############################
35 # This section of code is LyX Specific
36 #############################
38 if [ ! -e $DIRNAME0/.lyx ]
40 echo WARNING $DIRNAME0/.lyx does not exist
41 echo will need to regenerate .lyx every test
44 #if [ ! -e lib/doc.orig ]
46 # mv lib/doc lib/doc.orig
49 #kill_all_children() {
50 # kill `$DIRNAME0/list_all_children.sh $1`
52 # kill -9 `$DIRNAME0/list_all_children.sh $1`
55 #. $DIRNAME0/shared_functions.sh
58 ensure_cannot_print () {
59 if [ ! -z "$REPLAYFILE" ]
66 echo We can print, this is bad!
67 echo use lpadmin to stop keytest from destroying a forest.
71 echo "Phew, lpq reckons we aren't ready to print. This is a *good* thing!"
79 if [ lib/doc/$f -nt lib/doc.orig/$f -o ! -e lib/doc.orig/$f ]
81 #echo making doc dir $OUTDIR/$SEC.doc
82 mkdirp $OUTDIR/$SEC.doc
83 cp -a lib/doc/$f $OUTDIR/$SEC.doc/
92 cp -p lib/doc.orig/*.lyx lib/doc/
96 name=`(cat $GDB | grep -o ' in lyx::[[:alnum:]:]*' ; cat $GDB | grep -o ' [ai][nt] [[:alnum:]:]*' ) | head -n3 | sed s/in// | sed 's/ //g'`
97 echo $name | sed 's/ /__/g'
100 calc_confirm_file() {
102 echo "$ROOT_OUTDIR/$id.reproduced"
107 echo getting pidof "$1" 1>&2
108 #PID=`ps "-u$USER" "$2" | grep "$1" | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'`
109 PID=`ps x | grep "$1" | grep -v grep | grep -v "gdb " | sed 's/^ *//g'| sed 's/ .*$//'`
110 echo "$PID" | ( grep " " > /dev/null && ( echo ERROR too many PIDs 1>&2 ; ps x ; full_exit ) )
111 nPIDs=`echo PID "$PID" | wc -l`
112 echo nPIDs $nPIDs 1>&2
114 echo -- if [ "$nPIDs" != "1" ] 1>&2
115 if test "$nPIDs" != "1" #2> /tmp/testerr
117 echo autolyx: Wrong number of PIDs "$nPIDs" "($1)" "($2)" 1>&2
118 echo autolyx: PIDs "$PID" 1>&2
123 echo got pidof "$1" 1>&2
126 KT_PID=`get_pid keytest.py x`
135 echo attempting to exit this entire script... normal exit may just exit one function
139 echo We should not get this far
142 echo We really should not get this far
147 #Spawn a process to kill lyx if it runs too long
150 echo cannot touch $GDB
153 (sleep 300; echo KILLER ACTIVATIED ;killall gdb lyx ; sleep 1 ; killall -9 gdb lyx)&
155 echo KILLING LYX, before starting new lyx
161 #shell svn info $SRC_DIR/
165 #shell kill $CHILD_PID
168 #shell kill -9 $CHILD_PID
169 " ; yes q) | HOME="$NEWHOME" gdb $EXE_TO_TEST 2>&1 | strings| tee $GDB
170 echo "end run_gdb ($KILLER_PID)"
176 #shell wmctrl -r __renamed__ -b add,shaded
177 #shell wmctrl -r term -b add,shaded
178 #shell wmctrl -r term -b add,shaded
179 #shell wmctrl -R lyx'
181 #shell import -window root '$GDB.png'
182 #shell import -window root '$GDB..png'
187 ###########################
194 export CONFIRM_FILE=`calc_confirm_file`
195 if [ ! -e "$CONFIRM_FILE" ]
197 echo $CONFIRM_FILE does not exist
198 echo This bug appears not to have been reproduced before
199 echo Will try to reproduce now
201 echo WANT_CRASH_ID=$WANT_CRASH_ID
202 WANT_CRASH_ID="$id" do_replay
203 echo _WANT_CRASH_ID=$WANT_CRASH_ID
205 echo Finished attempt at replay
207 echo $CONFIRM_FILE exists
208 echo This bugs has already been reproduced
209 echo Will not attempt to reproduce again
214 (REPLAYFILE="$KEYCODEpure" TAIL_LINES=25 MAX_TAIL_LINES=10000 bash "$0")&
216 echo Backgrounded $TEST_PID
217 echo waiting for $TEST_PID to finish
222 test -e "$f.replay/last_crash_sec" -o -e "$f.replay/Irreproducible"
225 move_to_replayed () {
226 mkdirp $REPLAY_DIR/replayed
227 mv $f* $REPLAY_DIR/replayed
235 #./development/keytest/killtest
240 KEYCODEpure="$f" do_replay
248 do_queued_replays() {
249 REPLAY_DIR=$OUTDIR/toreplay
250 echo doing queued_replays
251 echo replays `ls $REPLAY_DIR/*KEYCODEpure`
252 for f in `ls $REPLAY_DIR/*KEYCODEpure`
256 echo done queued_replays
258 REPLAY_DIR=$OUTDIR/toreproduce
259 export BORED_AFTER_SECS=0
260 echo doing queued_reproduce
261 echo reproduce`ls $REPLAY_DIR/*KEYCODEpure`
262 for f in `ls $REPLAY_DIR/*KEYCODEpure`
266 echo done queued_reproduce
270 interesting_crash () {
271 (grep " signal SIG[^TK]" $GDB || grep KILL_FREEZE $KEYCODE) &&
272 ( test -z "$WANT_CRASH_ID" || test "$WANT_CRASH_ID" = `get_crash_id` )
276 # ps a | grep $1 | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'
280 (cd $SRC_DIR ; svn info) 2>&1 |tee "$1".svn
281 $EXE_TO_TEST -version 2>&1 "$1".version
286 KEYCODE=$OUTDIR/$SEC.KEYCODE
287 KEYCODEpure=$OUTDIR/$SEC.KEYCODEpure
288 NEWHOME=~/kt.dir/$SEC.dir
290 NEWHOME=`cd $NEWHOME; pwd`
291 echo NEWHOME $NEWHOME
293 cp -rv $DIRNAME0/.lyx "$NEWHOME"/
294 echo killall -9 lyx latex pdflatex
295 killall -9 lyx latex pdflatex
298 echo -- 1 || full_exit
301 echo -- while [ -z "$LYX_PID" -a 200 -gt $i ]
302 while [ -z "$LYX_PID" -a 200 -gt $i ]
304 #export LYX_PID=`ps a | grep /src/lyx | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'`
305 export LYX_PID=`get_pid "$EXE_TO_TEST$" `
306 echo LYXPID "$LYX_PID" || full_exit
310 echo `ps a | grep $EXE_TO_TEST`
312 echo `ps a | grep $EXE_TO_TEST | grep -v grep`
314 echo `ps a | grep $EXE_TO_TEST | grep -v grep | sed 's/ [a-z].*$//'`
316 echo LYX_PID=$LYX_PID
317 echo XA_PRIMARY | xclip -selection XA_PRIMARY
318 echo XA_SECONDARY | xclip -selection XA_SECONDARY
319 echo XA_CLIPBOARD | xclip -selection XA_CLIPBOARD
321 echo -- if [ ! -z "$LYX_PID" ]
322 if [ ! -z "$LYX_PID" ]
324 kill `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
326 kill -9 `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
327 while ! wmctrl -r lyx -b add,maximized_vert,maximized_horz
329 echo trying to maximize lyx
332 echo BEGIN KEYTEST KEYTEST_OUTFILE="$KEYCODEpure" nice -19 python $DIRNAME0/keytest.py
333 KEYTEST_OUTFILE="$KEYCODEpure" nice -19 python $DIRNAME0/keytest.py | tee $KEYCODE
334 #echo "$!" > $NEWHOME/keytest_py.pid
342 killall -9 lyx #sometimes LyX really doesn't want to die causing the script to freeze
343 #killall lyx #sometimes LyX really doesn't want to die causing the script to freeze
345 #kill -9 "$LYX_PID" #sometimes LyX really doesn't want to die causing the script to freeze
351 ls $EXE_TO_TEST ; sleep 1
354 #You may want to use the following to simulate SIGFPE
355 #(sleep 90 && killall -8 lyx) &
362 # (sleep 600 ; kill "$!")
363 # echo WAITING FOR: wait $GDBTASK_PID
365 # echo NOLONGER waiting for: wait $GDBTASK_PID
369 KT_PID=`get_pid keytest.py`
375 # Or use "exited normally":
377 # these tend to take up a huge amount of space:
378 echo will erase "$NEWHOME"
381 #if (grep " signal SIG[^TK]" $GDB || grep KILL_FREEZE $KEYCODE)
385 mkdirp $OUTDIR/save && (
386 ln $OUTDIR/$SEC.* $OUTDIR/save ||
387 cp $OUTDIR/$SEC.* $OUTDIR/save)
389 echo $LAST_CRASH_SEC > $OUTDIR/last_crash_sec
390 get_version_info $OUTDIR/last_crash_sec.info
391 if [ ! -z "$TAIL_LINES" ]
394 echo Reproducible > $OUTDIR/Reproducible
397 if [ -z "$REPLAYFILE" ]
399 echo ATTEMPTING TO REPLAY
402 export KEYTEST_INFILE=$KEYCODEpure
403 NUM_KEYCODES=`wc -l < $KEYCODEpure`
404 echo NUM_KEYCODES $NUM_KEYCODES, was $LAST_NUM_KEYCODES
405 if [ "$NUM_KEYCODES" != "$LAST_NUM_KEYCODES" ]
408 LAST_NUM_KEYCODES=$NUM_KEYCODES
409 echo "Hooray! we have eleminated some keycodes"
412 if [ ! -z "$AND_THEN_QUIT" ]
418 if [ ! -z "$LAST_CORE" ]
422 LAST_CORE="$GDB.core"
426 echo will erase '$BAK/*'="'$BAK/*'"
429 mv $OUTDIR/$SEC.* $BAK/
433 if [ ! -z "$TAIL_LINES" ]
435 echo TTL3 $TAIL_LINES
436 echo MAX_TAIL_LINES "$MAX_TAIL_LINES"
437 TAIL_LINES=$(($TAIL_LINES*2))
438 echo TTL4 $TAIL_LINES
439 if [ "$TAIL_LINES" -ge "0$MAX_TAIL_LINES" -a ! -z "$MAX_TAIL_LINES" ]
441 echo Giving up because $TAIL_LINES '>' $MAX_TAIL_LINES
442 echo Irreproducible > $OUTDIR/Irreproducible
446 if [ ! -z "$AND_THEN_QUIT" ]
453 echo TTL2 $TAIL_LINES
460 echo "$1" does not exist!
468 echo "Assertion '$*' Failed!"
475 #####################################################
477 #####################################################
479 #Start basic sanity checks
483 if [ ! -e "$EXE_TO_TEST" ]
485 echo "$EXE_TO_TEST" does not exist
493 if ! wmctrl -l > /dev/null
495 echo autolyx: cannot run wmctrl -l
499 test_exist "$EXE_TO_TEST"
500 test_exist "$DIRNAME0/keytest.py"
502 if ! test -z "`pylint -e $DIRNAME0/keytest.py`"
504 echo "$DIRNAME0/keytest.py" has python errors
510 #End basic sanity checks
517 if [ ! -z "$REPLAYFILE" ]
520 OUTDIR="$REPLAYFILE.replay/"
521 mkdirp $REPLAYFILE.replay/ || full_exit
522 export KEYTEST_INFILE=$REPLAYFILE
523 if [ ! -e "$REPLAYFILE" ]
525 echo "$REPLAYFILE" does not exist
534 get_pid [0-9].x-session-manager"$" x
535 export X_PID=`get_pid [0-9].x-session-manager x`
538 export TAIL_LINES=$TAIL_LINES
548 #rename other windows to avoid confusion.
549 wmctrl -N __renamed__ -r lyx
550 wmctrl -N __renamed__ -r lyx
551 wmctrl -N __renamed__ -r lyx
552 wmctrl -N __renamed__ -r lyx
553 export PATH=`cd $DIRNAME0; pwd`/path:$PATH
559 if [ ".$SCREENSHOT_OUT." = ".auto." ]
561 echo SCREENSHOT_OUT was $SCREENSHOT_OUT.
562 export SCREENSHOT_OUT="$OUTDIR/$SEC.s"
563 echo SCREENSHOT_OUT is $SCREENSHOT_OUT.
567 do_one_test #| tee do_one_test.log
571 kill `list_all_children.sh $$`
573 kill -9 `list_all_children.sh $$`
586 LAST_EVENT=`date +%s` # Last time something interesting happened. If nothing interesting has happened for a while, we should quit.
590 export X_PID=`get_pid [0-9].x-session-manager"$" x`
594 echo Currently running autolyx PID=$$
595 if [ ! -z "$TAIL_LINES" ]
597 echo TAIL_LINES: "$TAIL_LINES"
598 TAIL_FILE=$OUTDIR/tail_"$TAIL_LINES"
599 tail -n "$TAIL_LINES" "$REPLAYFILE" > $TAIL_FILE
600 KEYTEST_INFILE=$TAIL_FILE
607 if [ -z "$TAIL_LINES" -a ! -z "$REPLAYFILE" ]
609 echo Boredom factor: $SEC-$LAST_EVENT'=' $(($SEC-$LAST_EVENT))
610 if [ $(($SEC-$LAST_EVENT)) -gt $BORED_AFTER_SECS ]
613 echo Is is now $SEC seconds
614 echo The last time we managed to eliminate a keycode was at $LAST_EVENT
615 echo We get bored after $BORED_AFTER_SECS seconds
618 echo $LAST_CRASH_SEC > $OUTDIR/Finished
619 SEC=$LAST_CRASH_SEC #I used SEC in place of LAST_CRASH_SEC. Here is a quick fix.
621 if [ `cat $OUTDIR/$SEC.KEYCODEpure | wc -l` -lt 40 ] # If many keycodes, dont bother trying to make screenshots
623 echo "Making screenschot of $OUTDIR/$SEC.KEYCODEpure"
624 test -e $OUTDIR/$SEC.KEYCODEpure || echo "DOES NOT EXIST: $OUTDIR/$SEC.KEYCODEpure"
625 (SCREENSHOT_OUT="auto" ./doNtimes.sh 9 ./reproduce.sh $OUTDIR/$SEC.KEYCODEpure ; echo $f )
628 mkdirp $OUTDIR/final_cp
629 #chmod g+w $OUTDIR/final
630 ln $OUTDIR/$SEC* $OUTDIR/final || cp $OUTDIR/$SEC* $OUTDIR/final
631 cp $OUTDIR/$SEC* $OUTDIR/final_cp/
632 cp -rv $OUTDIR/$SEC.replay $OUTDIR/final_cp/
633 CONFIRM_FILE=`calc_confirm_file`
634 echo Reproducible > "$CONFIRM_FILE"
645 ) 2>&1 |tee $OUTDIR/log