1 DIRNAME0=`dirname "$0"`
2 #ROOT_OUTDIR="$DIRNAME0/out"
4 #OUTDIR="$DIRNAME0/out"
8 EXE_TO_TEST=$SRC_DIR/lyx
23 kill `$DIRNAME0/list_all_children.sh $1`
25 kill -9 `$DIRNAME0/list_all_children.sh $1`
29 #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
30 if [ -z $BORED_AFTER_SECS ]
32 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
37 #############################
38 # This section of code is LyX Specific
39 #############################
41 if [ ! -e $DIRNAME0/.lyx ]
43 echo WARNING $DIRNAME0/.lyx does not exist
44 echo will need to regenerate .lyx every test
47 #if [ ! -e lib/doc.orig ]
49 # mv lib/doc lib/doc.orig
52 #kill_all_children() {
53 # kill `$DIRNAME0/list_all_children.sh $1`
55 # kill -9 `$DIRNAME0/list_all_children.sh $1`
58 #. $DIRNAME0/shared_functions.sh
61 ensure_cannot_print () {
62 if [ ! -z "$REPLAYFILE" ]
69 echo We can print, this is bad!
70 echo use lpadmin to stop keytest from destroying a forest.
74 echo "Phew, lpq reckons we aren't ready to print. This is a *good* thing!"
82 if [ lib/doc/$f -nt lib/doc.orig/$f -o ! -e lib/doc.orig/$f ]
84 #echo making doc dir $OUTDIR/$SEC.doc
85 mkdirp $OUTDIR/$SEC.doc
86 cp -a lib/doc/$f $OUTDIR/$SEC.doc/
95 cp -p lib/doc.orig/*.lyx lib/doc/
99 name=`(cat $GDB | grep -o ' in lyx::[[:alnum:]:]*' ; cat $GDB | grep -o ' [ai][nt] [[:alnum:]:]*' ) | head -n3 | sed s/in// | sed 's/ //g'`
100 echo $name | sed 's/ /__/g'
103 calc_confirm_file() {
105 echo "$ROOT_OUTDIR/$id.reproduced"
110 echo getting pidof "$1" 1>&2
111 #PID=`ps "-u$USER" "$2" | grep "$1" | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'`
112 PID=`ps x | grep "$1" | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'`
113 echo "$PID" | ( grep " " > /dev/null && ( echo ERROR too many PIDs 1>&2 ; ps x ; full_exit ) )
114 nPIDs=`echo PID "$PID" | wc -l`
115 echo nPIDs $nPIDs 1>&2
117 echo -- if [ "$nPIDs" != "1" ] 1>&2
118 if test "$nPIDs" != "1" #2> /tmp/testerr
120 echo autolyx: Wrong number of PIDs "$nPIDs" "($1)" "($2)" 1>&2
121 echo autolyx: PIDs "$PID" 1>&2
126 echo got pidof "$1" 1>&2
129 KT_PID=`get_pid keytest.py x`
138 echo attempting to exit this entire script... normal exit may just exit one function
142 echo We should not get this far
145 echo We really should not get this far
150 #Spawn a process to kill lyx if it runs too long
153 echo cannot touch $GDB
156 (sleep 300; echo KILLER ACTIVATIED ;killall gdb lyx ; sleep 1 ; killall -9 gdb lyx)&
158 echo KILLING LYX, before starting new lyx
164 #shell svn info $SRC_DIR/
168 #shell kill $CHILD_PID
171 #shell kill -9 $CHILD_PID
172 " ; yes q) | HOME="$NEWHOME" gdb $EXE_TO_TEST 2>&1 | strings| tee $GDB
173 echo "end run_gdb ($KILLER_PID)"
179 #shell wmctrl -r __renamed__ -b add,shaded
180 #shell wmctrl -r term -b add,shaded
181 #shell wmctrl -r term -b add,shaded
182 #shell wmctrl -R lyx'
184 #shell import -window root '$GDB.png'
185 #shell import -window root '$GDB..png'
190 ###########################
197 export CONFIRM_FILE=`calc_confirm_file`
198 if [ ! -e "$CONFIRM_FILE" ]
200 echo $CONFIRM_FILE does not exist
201 echo This bug appears not to have been reproduced before
202 echo Will try to reproduce now
206 echo Finished attempt at replay
208 echo $CONFIRM_FILE exists
209 echo This bugs has already been reproduced
210 echo Will not attempt to reproduce again
215 (REPLAYFILE="$KEYCODEpure" TAIL_LINES=25 MAX_TAIL_LINES=10000 bash "$0")&
217 echo Backgrounded $TEST_PID
218 echo waiting for $TEST_PID to finish
223 test -e "$f.replay/last_crash_sec" -o -e "$f.replay/Irreproducible"
226 move_to_replayed () {
227 mkdirp $REPLAY_DIR/replayed
228 mv $f* $REPLAY_DIR/replayed
236 #./development/keytest/killtest
241 KEYCODEpure="$f" do_replay
249 do_queued_replays() {
250 REPLAY_DIR=$OUTDIR/toreplay
251 echo doing queued_replays
252 echo replays `ls $REPLAY_DIR/*KEYCODEpure`
253 for f in `ls $REPLAY_DIR/*KEYCODEpure`
257 echo done queued_replays
259 REPLAY_DIR=$OUTDIR/toreproduce
260 export BORED_AFTER_SECS=0
261 echo doing queued_reproduce
262 echo reproduce`ls $REPLAY_DIR/*KEYCODEpure`
263 for f in `ls $REPLAY_DIR/*KEYCODEpure`
267 echo done queued_reproduce
272 # ps a | grep $1 | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'
276 (cd $SRC_DIR ; svn info) 2>&1 |tee "$1".svn
277 $EXE_TO_TEST -version 2>&1 "$1".version
282 KEYCODE=$OUTDIR/$SEC.KEYCODE
283 KEYCODEpure=$OUTDIR/$SEC.KEYCODEpure
284 NEWHOME=~/kt.dir/$SEC.dir
286 NEWHOME=`cd $NEWHOME; pwd`
287 echo NEWHOME $NEWHOME
289 cp -rv $DIRNAME0/.lyx "$NEWHOME"/
290 echo killall -9 lyx latex pdflatex
291 killall -9 lyx latex pdflatex
294 echo -- 1 || full_exit
297 echo -- while [ -z "$LYX_PID" -a 200 -gt $i ]
298 while [ -z "$LYX_PID" -a 200 -gt $i ]
300 #export LYX_PID=`ps a | grep /src/lyx | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'`
301 export LYX_PID=`get_pid "$EXE_TO_TEST$" `
302 echo LYXPID "$LYX_PID" || full_exit
306 echo `ps a | grep $EXE_TO_TEST`
308 echo `ps a | grep $EXE_TO_TEST | grep -v grep`
310 echo `ps a | grep $EXE_TO_TEST | grep -v grep | sed 's/ [a-z].*$//'`
312 echo LYX_PID=$LYX_PID
313 echo XA_PRIMARY | xclip -selection XA_PRIMARY
314 echo XA_SECONDARY | xclip -selection XA_SECONDARY
315 echo XA_CLIPBOARD | xclip -selection XA_CLIPBOARD
317 echo -- if [ ! -z "$LYX_PID" ]
318 if [ ! -z "$LYX_PID" ]
320 kill `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
322 kill -9 `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
323 while ! wmctrl -r lyx -b add,maximized_vert,maximized_horz
325 echo trying to maximize lyx
328 echo BEGIN KEYTEST KEYTEST_OUTFILE="$KEYCODEpure" nice -19 python $DIRNAME0/keytest.py
329 KEYTEST_OUTFILE="$KEYCODEpure" nice -19 python $DIRNAME0/keytest.py | tee $KEYCODE
330 #echo "$!" > $NEWHOME/keytest_py.pid
338 killall -9 lyx #sometimes LyX really doesn't want to die causing the script to freeze
339 #killall lyx #sometimes LyX really doesn't want to die causing the script to freeze
341 #kill -9 "$LYX_PID" #sometimes LyX really doesn't want to die causing the script to freeze
347 ls $EXE_TO_TEST ; sleep 1
350 #You may want to use the following to simulate SIGFPE
351 #(sleep 90 && killall -8 lyx) &
358 # (sleep 600 ; kill "$!")
359 # echo WAITING FOR: wait $GDBTASK_PID
361 # echo NOLONGER waiting for: wait $GDBTASK_PID
365 KT_PID=`get_pid keytest.py`
371 # Or use "exited normally":
373 # these tend to take up a huge amount of space:
374 echo will erase "$NEWHOME"
377 if (grep " signal SIG[^TK]" $GDB || grep KILL_FREEZE $KEYCODE)
380 mkdirp $OUTDIR/save && (
381 ln $OUTDIR/$SEC.* $OUTDIR/save ||
382 cp $OUTDIR/$SEC.* $OUTDIR/save)
384 echo $LAST_CRASH_SEC > $OUTDIR/last_crash_sec
385 get_version_info $OUTDIR/last_crash_sec.info
386 if [ ! -z "$TAIL_LINES" ]
389 echo Reproducible > $OUTDIR/Reproducible
392 if [ -z "$REPLAYFILE" ]
394 echo ATTEMPTING TO REPLAY
397 export KEYTEST_INFILE=$KEYCODEpure
398 NUM_KEYCODES=`wc -l < $KEYCODEpure`
399 echo NUM_KEYCODES $NUM_KEYCODES, was $LAST_NUM_KEYCODES
400 if [ "$NUM_KEYCODES" != "$LAST_NUM_KEYCODES" ]
403 LAST_NUM_KEYCODES=$NUM_KEYCODES
404 echo "Hooray! we have eleminated some keycodes"
407 if [ ! -z "$AND_THEN_QUIT" ]
413 if [ ! -z "$LAST_CORE" ]
417 LAST_CORE="$GDB.core"
421 echo will erase '$BAK/*'="'$BAK/*'"
424 mv $OUTDIR/$SEC.* $BAK/
428 if [ ! -z "$TAIL_LINES" ]
430 echo TTL3 $TAIL_LINES
431 echo MAX_TAIL_LINES "$MAX_TAIL_LINES"
432 TAIL_LINES=$(($TAIL_LINES*2))
433 echo TTL4 $TAIL_LINES
434 if [ "$TAIL_LINES" -ge "0$MAX_TAIL_LINES" -a ! -z "$MAX_TAIL_LINES" ]
436 echo Giving up because $TAIL_LINES '>' $MAX_TAIL_LINES
437 echo Irreproducible > $OUTDIR/Irreproducible
441 if [ ! -z "$AND_THEN_QUIT" ]
448 echo TTL2 $TAIL_LINES
455 echo "$1" does not exist!
463 echo "Assertion '$*' Failed!"
470 #####################################################
472 #####################################################
474 #Start basic sanity checks
478 if [ ! -e "$EXE_TO_TEST" ]
480 echo "$EXE_TO_TEST" does not exist
488 if ! wmctrl -l > /dev/null
490 echo autolyx: cannot run wmctrl -l
494 test_exist "$EXE_TO_TEST"
495 test_exist "$DIRNAME0/keytest.py"
497 if ! test -z "`pylint -e $DIRNAME0/keytest.py`"
499 echo "$DIRNAME0/keytest.py" has python errors
505 #End basic sanity checks
512 if [ ! -z "$REPLAYFILE" ]
515 OUTDIR="$REPLAYFILE.replay/"
516 mkdirp $REPLAYFILE.replay/ || full_exit
517 export KEYTEST_INFILE=$REPLAYFILE
518 if [ ! -e "$REPLAYFILE" ]
520 echo "$REPLAYFILE" does not exist
529 get_pid [0-9].x-session-manager"$" x
530 export X_PID=`get_pid [0-9].x-session-manager x`
533 export TAIL_LINES=$TAIL_LINES
543 #rename other windows to avoid confusion.
544 wmctrl -N __renamed__ -r lyx
545 wmctrl -N __renamed__ -r lyx
546 wmctrl -N __renamed__ -r lyx
547 wmctrl -N __renamed__ -r lyx
548 export PATH=`cd $DIRNAME0; pwd`/path:$PATH
554 if [ ".$SCREENSHOT_OUT." = ".auto." ]
556 echo SCREENSHOT_OUT was $SCREENSHOT_OUT.
557 export SCREENSHOT_OUT="$OUTDIR/$SEC.s"
558 echo SCREENSHOT_OUT is $SCREENSHOT_OUT.
562 do_one_test #| tee do_one_test.log
566 kill `list_all_children.sh $$`
568 kill -9 `list_all_children.sh $$`
581 LAST_EVENT=`date +%s` # Last time something interesting happened. If nothing interesting has happened for a while, we should quit.
585 export X_PID=`get_pid [0-9].x-session-manager"$" x`
589 echo Currently running autolyx PID=$$
590 if [ ! -z "$TAIL_LINES" ]
592 echo TAIL_LINES: "$TAIL_LINES"
593 TAIL_FILE=$OUTDIR/tail_"$TAIL_LINES"
594 tail -n "$TAIL_LINES" "$REPLAYFILE" > $TAIL_FILE
595 KEYTEST_INFILE=$TAIL_FILE
602 if [ -z "$TAIL_LINES" -a ! -z "$REPLAYFILE" ]
604 echo Boredom factor: $SEC-$LAST_EVENT'=' $(($SEC-$LAST_EVENT))
605 if [ $(($SEC-$LAST_EVENT)) -gt $BORED_AFTER_SECS ]
608 echo Is is now $SEC seconds
609 echo The last time we managed to eliminate a keycode was at $LAST_EVENT
610 echo We get bored after $BORED_AFTER_SECS seconds
613 echo $LAST_CRASH_SEC > $OUTDIR/Finished
614 SEC=$LAST_CRASH_SEC #I used SEC in place of LAST_CRASH_SEC. Here is a quick fix.
616 if [ `cat $OUTDIR/$SEC.KEYCODEpure | wc -l` -lt 40 ] # If many keycodes, dont bother trying to make screenshots
618 echo "Making screenschot of $OUTDIR/$SEC.KEYCODEpure"
619 test -e $OUTDIR/$SEC.KEYCODEpure || echo "DOES NOT EXIST: $OUTDIR/$SEC.KEYCODEpure"
620 (SCREENSHOT_OUT="auto" ./doNtimes.sh 9 ./reproduce.sh $OUTDIR/$SEC.KEYCODEpure ; echo $f )
623 mkdirp $OUTDIR/final_cp
624 #chmod g+w $OUTDIR/final
625 ln $OUTDIR/$SEC* $OUTDIR/final || cp $OUTDIR/$SEC* $OUTDIR/final
626 cp $OUTDIR/$SEC* $OUTDIR/final_cp/
627 cp -rv $OUTDIR/$SEC.replay $OUTDIR/final_cp/
628 CONFIRM_FILE=`calc_confirm_file`
629 echo Reproducible > "$CONFIRM_FILE"
640 ) 2>&1 |tee $OUTDIR/log