]> git.lyx.org Git - features.git/commitdiff
keytests: Polishing the shutdown of lyx at test-end
authorKornel Benko <kornel@lyx.org>
Fri, 12 May 2017 19:28:57 +0000 (21:28 +0200)
committerKornel Benko <kornel@lyx.org>
Fri, 12 May 2017 20:32:49 +0000 (22:32 +0200)
development/autotests/keytest.py

index c30e510e83657442fffb3f05b21a794fda6f9b03..f9cd929b4e84b335b63061f49da4e6925b5ec258 100755 (executable)
@@ -23,6 +23,9 @@ FNULL = open('/dev/null', 'w')
 
 key_delay = ''
 
+# Ignore status == "dead" if this is set. Used at the last commands after "\Cq"
+dead_expected = False
+
 class CommandSource:
 
     def __init__(self):
@@ -235,33 +238,38 @@ def lyx_status(pid):
             print('Retrying check for status')
         count += 1
         time.sleep(0.01)
-    if count > 0:
+    if count > 1:
         print('Retried to read status ' + str(count) + ' times')
+    #print('lys_status() returning ' + status)
     return status
 
 # Return true if LyX (identified via lyx_pid) is sleeping
-def lyx_sleeping():
-    return lyx_status(lyx_pid) == "sleeping"
+def lyx_sleeping(LYX_PID):
+    return lyx_status(LYX_PID) == "sleeping"
 
 # Return true if LyX (identified via lyx_pid) is zombie
-def lyx_zombie():
-    return lyx_status(lyx_pid) == "zombie"
+def lyx_zombie(LYX_PID):
+    return lyx_status(LYX_PID) == "zombie"
 
-def lyx_dead():
-    status = lyx_status(lyx_pid)
+def lyx_dead(LYX_PID):
+    status = lyx_status(LYX_PID)
     return (status == "dead") or (status == "zombie")
 
-def wait_until_lyx_sleeping():
+def wait_until_lyx_sleeping(LYX_PID):
     before_secs = time.time()
     while True:
-        status = lyx_status(lyx_pid)
+        status = lyx_status(LYX_PID)
         if status == "sleeping":
-            return
+            return True
         if (status == "dead") or (status == "zombie"):
-            print('Lyx is dead, exiting')
             printresstatus()
             sys.stdout.flush()
-            os._exit(1)
+            if dead_expected:
+                print('Lyx died while waiting for status == sleeping')
+                return False
+            else:
+                print('Lyx is dead, exiting')
+                os._exit(1)
         if time.time() - before_secs > 180:
             print('Killing due to freeze (KILL_FREEZE)')
 
@@ -271,9 +279,15 @@ def wait_until_lyx_sleeping():
             sys.stdout.flush()
             os._exit(1)
         time.sleep(0.02)
+    # Should be never reached
+    print('Wait for sleeping ends unexpectedly')
+    return False
 
 def sendKeystringLocal(keystr, LYX_PID):
-    wait_until_lyx_sleeping()
+    is_sleeping = wait_until_lyx_sleeping(LYX_PID)
+    if not is_sleeping:
+        print("Not sending \"" + keystr + "\"")
+        return
     if not screenshot_out is None:
         print('Making Screenshot: ' + screenshot_out + ' OF ' + infilename)
         time.sleep(0.2)
@@ -530,6 +544,7 @@ while not failed:
         else:
             print('lyx_pid: ' + lyx_pid)
             print('lyx_win: ' + lyx_window_name)
+            dead_expected = False
             sendKeystringLocal("\C\[Home]", lyx_pid)
             time.sleep(controlkey_delay)
     elif c[0:5] == 'Sleep':
@@ -568,14 +583,15 @@ while not failed:
         print("result=" + str(result) + ", failed=" + str(failed))
     elif c[0:15] == 'TestEndWithKill':
         cmd = c[16:].rstrip()
-        if lyx_dead():
+        if lyx_dead(lyx_pid):
             print("LyX instance not found because of crash or assert !\n")
             failed = True
         else:
             print("    ------------    Forcing kill of lyx instance: " + str(lyx_pid) + "    ------------")
             # This line below is there only to allow lyx to update its log-file
             sendKeystringLocal("\[Escape]", lyx_pid)
-            while not lyx_dead():
+            dead_expected = True
+            while not lyx_dead(lyx_pid):
                 intr_system("kill -9 " + str(lyx_pid), True);
                 time.sleep(0.5)
             if cmd != "":
@@ -587,7 +603,7 @@ while not failed:
                 print("failed=" + str(failed))
     elif c[0:7] == 'TestEnd':
         #lyx_other_window_name = None
-        if lyx_dead():
+        if lyx_dead(lyx_pid):
             print("LyX instance not found because of crash or assert !\n")
             failed = True
         else:
@@ -600,13 +616,20 @@ while not failed:
             # and so the function lyx-quit should work
             sendKeystringLocal("\Cq", lyx_pid)
             time.sleep(0.5)
-            if lyx_sleeping():
+            dead_expected = True
+            is_sleeping = wait_until_lyx_sleeping(lyx_pid)
+            if is_sleeping:
+                print('wait_until_lyx_sleeping() indicated "sleeping"')
+                # For a short time lyx-status is 'sleeping', even if it is nearly dead.
+                # Without the wait below, the \[Tab]-char is sent to nirvana
+                # causing a 'beep'
+                time.sleep(0.5)
                 # probably waiting for Save/Discard/Abort, we select 'Discard'
                 sendKeystringRT("\[Tab]\[Return]", lyx_pid)
                 lcount = 0
             else:
                 lcount = 1
-            while not lyx_dead():
+            while not lyx_dead(lyx_pid):
                 lcount = lcount + 1
                 if lcount > 20:
                     print("LyX still up, killing process and waiting for it to die...\n")