keytests: Polishing the shutdown of lyx at test-end

This commit is contained in:
Kornel Benko 2017-05-12 21:28:57 +02:00
parent 430869a1bd
commit d06191c990

View File

@ -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")