X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=development%2Fkeystest%2Fautolyx;h=024499251e2d5d571f813498e792ce3593116ca5;hb=0ea95fb09f524df879745f9c713a68035e146799;hp=bf9f48ad1fbba58b5bc1459d72d1e9af68801ed5;hpb=8a7b05f57cdb42f62062acee3f7b5885494eca0f;p=lyx.git diff --git a/development/keystest/autolyx b/development/keystest/autolyx index bf9f48ad1f..024499251e 100755 --- a/development/keystest/autolyx +++ b/development/keystest/autolyx @@ -1,495 +1,5 @@ #!/bin/bash -# This script starts LyX, and restarts LyX if it is closed -# it logs all output, including backtraces to development/keystest/out/GDB - -#Setting the following may give better screen shots -#gconftool-2 /apps/metacity/general/compositing_manager -s -t bool true - DIRNAME0=`dirname "$0"` -OUTDIR="$DIRNAME0/out" -ROOT_OUTDIR="$DIRNAME0/out" -THIS_PID=$$ - -EXE_TO_TEST=src/lyx - -if [ ! -e "$EXE_TO_TEST" ] -then - echo "$EXE_TO_TEST" does not exist - echo Cannot proceed - exit -fi - -#BORED_AFTER_SECS=7200 #If we have spend more than 3600 secs (an hour) replaying a file, without learning anything new, go and start looking for more bugs instead -BORED_AFTER_SECS=3600 #If we have spend more than 3600 secs (an hour) replaying a file, without learning anything new, go and start looking for more bugs instead - -LAST_CORE="" - -############################# -# This section of code is LyX Specific -############################# - -if [ ! -e $DIRNAME0/.lyx ] -then - echo WARNING $DIRNAME0/.lyx does not exist - echo will need to regenerate .lyx every test -fi - -#if [ ! -e lib/doc.orig ] -#then -# mv lib/doc lib/doc.orig -#fi - -kill_all_children() { - kill `list_all_children.sh $1` - sleep 0.1 - kill -9 `list_all_children.sh $1` -} - - - -ensure_cannot_print () { -if [ ! -z "$REPLAYFILE" ] -then - return -fi -if lpq -then - - echo We can print, this is bad! - echo use lpadmin to stop keytest from destroying a forest. - full_exit - sleep 999999 ; read -else - echo "Phew, lpq reckons we aren't ready to print. This is a *good* thing!" -fi -} - -extras_save () { - return - for f in `ls lib/doc` - do - if [ lib/doc/$f -nt lib/doc.orig/$f -o ! -e lib/doc.orig/$f ] - then - #echo making doc dir $OUTDIR/$SEC.doc - mkdir -p $OUTDIR/$SEC.doc - cp -a lib/doc/$f $OUTDIR/$SEC.doc/ - fi - done -} - -extras_prepare () { - return - mkdir -p lib/doc/ - rm lib/doc/*.lyx - cp -p lib/doc.orig/*.lyx lib/doc/ -} - -get_crash_id () { - name=`(cat $GDB | grep -o ' in lyx::[[:alnum:]:]*' ; cat $GDB | grep -o ' [ai][nt] [[:alnum:]:]*' ) | head -n3 | sed s/in// | sed 's/ //g'` - echo $name | sed 's/ /__/g' -} - -calc_confirm_file() { - id=`get_crash_id` - echo "$ROOT_OUTDIR/$id.reproduced" -} - -get_pid () { - sleep 3 - echo getting pidof "$1" 1>&2 - #PID=`ps "-u$USER" "$2" | grep "$1" | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'` - PID=`ps x | grep "$1" | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'` - echo "$PID" | ( grep " " > /dev/null && ( echo too many PIDs 1>&2 ; full_exit ) ) - nPIDs=`echo PID "$PID" | wc -l` - echo nPIDs $nPIDs 1>&2 - sleep 1 - echo -- if [ "$nPIDs" != "1" ] 1>&2 - if test "$nPIDs" != "1" #2> /tmp/testerr - then - echo autolyx: Wrong number of PIDs "$nPIDs" "($1)" "($2)" 1>&2 - fi - echo "$PID" - echo got pidof "$1" 1>&2 -} -clean_up () { - KT_PID=`get_pid keytest.py x` - kill $KT_PID - sleep 0.1 - kill -9 $KT_PID -} - -full_exit() { - clean_up - - echo attempting to exit this entire script... normal exit may just exit one function - - kill $THIS_PID - sleep 1 - echo We should not get this far - sleep 1 - kill -9 $THIS_PID - echo We really should not get this far - exit -} - -run_gdb () { - echo Starting GDB - (echo " - shell svn info src/ - run - bt - shell kill $CHILD_PID - shell wmctrl -l - shell sleep 1 - shell kill -9 $CHILD_PID -" ; yes q) | HOME="$NEWHOME" gdb src/lyx 2>&1 | strings| tee $GDB - echo "end run_gdb" - #### gcore $GDB.core - #shell wmctrl -r __renamed__ -b add,shaded - #shell wmctrl -r term -b add,shaded - #shell wmctrl -r term -b add,shaded - #shell wmctrl -R lyx' - # - #shell import -window root '$GDB.png' - #shell import -window root '$GDB..png' - #exit -} - - -########################### - - - -try_replay () { - id=`get_crash_id` - echo CRASH_ID - export CONFIRM_FILE=`calc_confirm_file` - if [ ! -e "$CONFIRM_FILE" ] - then - echo $CONFIRM_FILE does not exist - echo This bug appears not to have been reproduced before - echo Will try to reproduce now - echo - do_replay - echo - echo Finished attempt at replay - else - echo $CONFIRM_FILE exists - echo This bugs has already been reproduced - echo Will not attempt to reproduce again - fi -} - -do_replay() { - (REPLAYFILE="$KEYCODEpure" TAIL_LINES=25 MAX_TAIL_LINES=10000 bash "$0")& - TEST_PID="$!" - echo Backgrounded $TEST_PID - echo waiting for $TEST_PID to finish - wait "$TEST_PID" -} - -test_replayed () { - test -e "$f.replay/last_crash_sec" -o -e "$f.replay/Irreproducible" -} - -move_to_replayed () { - mkdir -p $REPLAY_DIR/replayed - mv $f* $REPLAY_DIR/replayed -} - -do_queued_replays() { -REPLAY_DIR=development/keytest/out/toreplay -for f in `ls $REPLAY_DIR/*KEYCODEpure` -do - if test_replayed - then - move_to_replayed - else - #./development/keytest/killtest - killall lyx - sleep 1 - killall -9 lyx - KEYCODEpure="$f" do_replay - #if test_replayed - #then - move_to_replayed - #fi - fi - -done -} - -#get_pid() { -# ps a | grep $1 | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//' -#} - -do_one_test() { - GDB=$OUTDIR/$SEC.GDB - KEYCODE=$OUTDIR/$SEC.KEYCODE - KEYCODEpure=$OUTDIR/$SEC.KEYCODEpure - NEWHOME=~/kt.dir/$SEC.dir - mkdir -p $NEWHOME - NEWHOME=`cd $NEWHOME; pwd` - echo NEWHOME $NEWHOME - mkdir -p "$NEWHOME" - cp -rv $DIRNAME0/.lyx "$NEWHOME"/ - killall -9 lyx latex pdflatex - ( sleep 9 && - ps a | grep lyx - echo -- 1 || full_exit - LYX_PID="" - i=0 - echo -- while [ -z "$LYX_PID" -a 200 -gt $i ] - while [ -z "$LYX_PID" -a 200 -gt $i ] - do - #export LYX_PID=`ps a | grep /src/lyx | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'` - export LYX_PID=`get_pid "/src/lyx$" ` - echo LYXPID "$LYX_PID" || full_exit - sleep 0.1 - i=$(($i+1)) - done - echo `ps a | grep /src/lyx` - echo -- 2 - echo `ps a | grep /src/lyx | grep -v grep` - echo -- 3 - echo `ps a | grep /src/lyx | grep -v grep | sed 's/ [a-z].*$//'` - echo -- 4 - echo LYX_PID=$LYX_PID - echo XA_PRIMARY | xclip -selection XA_PRIMARY - echo XA_SECONDARY | xclip -selection XA_SECONDARY - echo XA_CLIPBOARD | xclip -selection XA_CLIPBOARD - - echo -- if [ ! -z "$LYX_PID" ] - if [ ! -z "$LYX_PID" ] - then - kill `ps a | grep keytest.py | grep -v grep | cut -c 1-5` - sleep 0.2 - kill -9 `ps a | grep keytest.py | grep -v grep | cut -c 1-5` - while ! wmctrl -r lyx -b add,maximized_vert,maximized_horz - do - echo trying to maximize lyx - sleep 1 - done - KEYTEST_OUTFILE="$KEYCODEpure" nice -19 python $DIRNAME0/keytest.py | tee $KEYCODE - #echo "$!" > $NEWHOME/keytest_py.pid - fi - killall lyx) & - CHILD_PID="$!" - ls src/lyx ; sleep 1 - pwd - - #You may want to use the following to simulate SIGFPE - #(sleep 90 && killall -8 lyx) & - echo TTL $TAIL_LINES - extras_prepare - ensure_cannot_print - run_gdb -# (run_gdb) & -# GDBTASK_PID="$!" -# (sleep 600 ; kill "$!") -# echo WAITING FOR: wait $GDBTASK_PID -# wait $GDBTASK_PID -# echo NOLONGER waiting for: wait $GDBTASK_PID - - echo END gdb - kill $CHILD_PID - KT_PID=`get_pid keytest.py` - echo KT_PID=$KT_PID - kill $KT_PID - sleep 0.3 - kill -9 $CHILD_PID - kill -9 $KT_PID - # Or use "exited normally": - echo END gdb2 - # these tend to take up a huge amount of space: - rm -rf $NEWHOME - if (grep " signal SIG[^TK]" $GDB || grep KILL_FREEZE $KEYCODE) - then - extras_save - mkdir -p $OUTDIR/save && ( - ln $OUTDIR/$SEC.* $OUTDIR/save || - cp $OUTDIR/$SEC.* $OUTDIR/save) - LAST_CRASH_SEC=$SEC - echo $LAST_CRASH_SEC > $OUTDIR/last_crash_sec - if [ ! -z "$TAIL_LINES" ] - then - LAST_EVENT="$SEC" - echo Reproducible > $OUTDIR/Reproducible - fi - TAIL_LINES="" - if [ -z "$REPLAYFILE" ] - then - echo ATTEMPTING TO REPLAY - try_replay - else - export KEYTEST_INFILE=$KEYCODEpure - NUM_KEYCODES=`wc -l < $KEYCODEpure` - echo NUM_KEYCODES $NUM_KEYCODES, was $LAST_NUM_KEYCODES - if [ "$NUM_KEYCODES" != "$LAST_NUM_KEYCODES" ] - then - LAST_EVENT="$SEC" - LAST_NUM_KEYCODES=$NUM_KEYCODES - echo "Hooray! we have eleminated some keycodes" - fi - fi - if [ ! -z "$AND_THEN_QUIT" ] - then - RESULT=1 - echo RR 1 - return 1 - fi - if [ ! -z "$LAST_CORE" ] - then - rm "$LAST_CORE" - fi - LAST_CORE="$GDB.core" - else - rm -rf $BAK/* - mv $OUTDIR/$SEC.* $BAK/ - if [ ! -z "$TAIL_LINES" ] - then - echo TTL3 $TAIL_LINES - echo MAX_TAIL_LINES "$MAX_TAIL_LINES" - TAIL_LINES=$(($TAIL_LINES*2)) - echo TTL4 $TAIL_LINES - if [ "$TAIL_LINES" -ge "0$MAX_TAIL_LINES" -a ! -z "$MAX_TAIL_LINES" ] - then - echo Giving up because $TAIL_LINES '>' $MAX_TAIL_LINES - echo Irreproducible > $OUTDIR/Irreproducible - full_exit - fi - fi - if [ ! -z "$AND_THEN_QUIT" ] - then - RESULT=0 - echo RR 0 - return 0 - fi - - echo TTL2 $TAIL_LINES - fi -} - -if [ ! -z "$1" ] -then - REPLAYFILE=$1 -fi - -if [ ! -z "$REPLAYFILE" ] -then - echo REPLAYMODE - OUTDIR="$REPLAYFILE.replay/" - mkdir -p $REPLAYFILE.replay/ || full_exit - export KEYTEST_INFILE=$REPLAYFILE - if [ ! -e "$REPLAYFILE" ] - then - echo "$REPLAYFILE" does not exist - echo exiting - full_exit 1 - fi -else - do_queued_replays - echo RANDOM MODE -fi - -get_pid [0-9].x-session-manager"$" x -export X_PID=`get_pid [0-9].x-session-manager x` -echo X_PID $X_PID - -export TAIL_LINES=$TAIL_LINES -echo TL $TAIL_LINES - - -BAK="$OUTDIR/backup" -mkdir -p $BAK - - - - -#rename other windows to avoid confusion. -wmctrl -N __renamed__ -r lyx -wmctrl -N __renamed__ -r lyx -wmctrl -N __renamed__ -r lyx -wmctrl -N __renamed__ -r lyx -export PATH=`cd $DIRNAME0; pwd`/path:$PATH - -if [ ! -z "$1" ] -then - SEC=`date +%s` - export MAX_DROP=0 - if [ ".$SCREENSHOT_OUT." = ".auto." ] - then - echo SCREENSHOT_OUT was $SCREENSHOT_OUT. - export SCREENSHOT_OUT="$OUTDIR/$SEC.s" - echo SCREENSHOT_OUT is $SCREENSHOT_OUT. - #exit - fi - export RESULT=179 - do_one_test #| tee do_one_test.log - RESULT="$?" - echo Ressult $RESULT - - kill `list_all_children.sh $$` - sleep 0.1 - kill -9 `list_all_children.sh $$` - - exit $RESULT - - #echo done ; sleep 1 - full_exit -fi - - - -( -echo TTL $TAIL_LINES - -LAST_EVENT=`date +%s` # Last time something interesting happened. If nothing interesting has happened for a while, we should quit. - -ensure_cannot_print -echo X_PID $X_PID -export X_PID=`get_pid [0-9].x-session-manager"$" x` -echo PATH $PATH -while true -do - echo Currently running autolyx PID=$$ - if [ ! -z "$TAIL_LINES" ] - then - echo TAIL_LINES: "$TAIL_LINES" - TAIL_FILE=$OUTDIR/tail_"$TAIL_LINES" - tail -n "$TAIL_LINES" "$REPLAYFILE" > $TAIL_FILE - KEYTEST_INFILE=$TAIL_FILE - MAX_DROP=0 - else - MAX_DROP=0.2 - fi - export MAX_DROP - SEC=`date +%s` - if [ ! -z "$REPLAYFILE" ] - then - echo Boredom factor: $SEC-$LAST_EVENT'=' $(($SEC-$LAST_EVENT)) - if [ $(($SEC-$LAST_EVENT)) -gt $BORED_AFTER_SECS ] - then - echo - echo Is is now $SEC seconds - echo The last time we managed to eliminate a keycode was at $LAST_EVENT - echo We get bored after $BORED_AFTER_SECS seconds - echo Giving up now. - echo - echo $LAST_CRASH_SEC > $OUTDIR/Finished - mkdir $OUTDIR/final - ln $OUTDIR/$SEC* $OUTDIR/final || cp $OUTDIR/$SEC* $OUTDIR/final - CONFIRM_FILE=`calc_confirm_file` - echo Reproducible > "$CONFIRM_FILE" - - - full_exit - fi - else - do_queued_replays - fi - do_one_test -done -kill_all_children $$ -) 2>&1 |tee $OUTDIR/log -kill_all_children $$ +. $DIRNAME0/shared_variables.sh +. $DIRNAME0/shared_functions.sh +autolyx_main "$@"