Squish: Remove hooking into subprocesses

It worked well but the maintenance burden turned out to be too much.

Task-number: QTCREATORBUG-20055
Change-Id: Ic8663f808c50ca9fb17d52b6bc6c72baf7503358
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Robert Loehning
2018-04-10 22:10:33 +02:00
parent 065e644d92
commit c5511de338
12 changed files with 84 additions and 684 deletions
+5 -112
View File
@@ -483,20 +483,11 @@ def waitForProcessRunning(running=True):
return waitFor("(reRunButton.enabled != running) and (stopButton.enabled == running)", 10000)
# run and close an application
# withHookInto - if set to True the function tries to attach to the sub-process instead of simply pressing Stop inside Creator
# executable - must be defined when using hook-into
# port - must be defined when using hook-into
# function - can be a string holding a function name or a reference to the function itself - this function will be called on
# the sub-process when hooking-into has been successful - if its missing simply closing the Qt Quick app will be done
# sType the SubprocessType - is nearly mandatory - except when using the function parameter
# userDefinedType - if you set sType to SubprocessType.USER_DEFINED you must(!) specify the WindowType for hooking into
# by yourself (or use the function parameter)
# ATTENTION! Make sure this function won't fail and the sub-process will end when the function returns
# returns None if the build failed, False if the subprocess did not start, and True otherwise
def runAndCloseApp(withHookInto=False, executable=None, port=None, function=None, sType=None, userDefinedType=None, quickVersion="1.1"):
def runAndCloseApp(isQtQuickUI=False):
runButton = waitForObject(":*Qt Creator.Run_Core::Internal::FancyToolButton")
clickButton(runButton)
if sType != SubprocessType.QT_QUICK_UI:
if not isQtQuickUI:
waitForCompile(300000)
buildSucceeded = checkLastBuild()
ensureChecked(waitForObject(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton"))
@@ -506,31 +497,10 @@ def runAndCloseApp(withHookInto=False, executable=None, port=None, function=None
if not waitForProcessRunning():
test.fatal("Couldn't start application - leaving test")
return False
if sType == SubprocessType.QT_QUICK_UI and os.getenv("SYSTEST_QMLVIEWER_NO_HOOK_INTO", "0") == "1":
withHookInto = False
if withHookInto and not validType(sType, userDefinedType, quickVersion):
if function != None:
test.warning("You did not provide a valid value for the SubprocessType value - sType, but you have "
"provided a function to execute on the subprocess. Please ensure that your function "
"closes the subprocess before exiting, or this test will not complete.")
else:
test.warning("You did not provide a valid value for the SubprocessType value - sType, nor a "
"function to execute on the subprocess. Falling back to pushing the STOP button "
"inside creator to terminate execution of the subprocess.")
withHookInto = False
if withHookInto and not executable in ("", None):
__closeSubprocessByHookingInto__(executable, port, function, sType, userDefinedType, quickVersion)
else:
__closeSubprocessByPushingStop__(sType)
__closeSubprocessByPushingStop__(isQtQuickUI)
return True
def validType(sType, userDef, quickVersion):
if sType == None:
return False
ty = SubprocessType.getWindowType(sType, quickVersion)
return ty != None and not (ty == "user-defined" and (userDef == None or userDef.strip() == ""))
def __closeSubprocessByPushingStop__(sType):
def __closeSubprocessByPushingStop__(isQtQuickUI):
ensureChecked(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton")
try:
waitForObject(":Qt Creator.Stop_QToolButton", 5000)
@@ -542,90 +512,13 @@ def __closeSubprocessByPushingStop__(sType):
clickButton(stopButton)
test.verify(waitFor("playButton.enabled", 5000), "Play button should be enabled")
test.compare(stopButton.enabled, False, "Stop button should be disabled")
if sType == SubprocessType.QT_QUICK_UI and platform.system() == "Darwin":
if isQtQuickUI and platform.system() == "Darwin":
waitFor("stopButton.enabled==False")
snooze(2)
nativeType("<Escape>")
else:
test.fatal("Subprocess does not seem to have been started.")
def __closeSubprocessByHookingInto__(executable, port, function, sType, userDefType, quickVersion):
ensureChecked(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton")
output = waitForObject("{type='Core::OutputWindow' visible='1' windowTitle='Application Output Window'}")
if port == None:
test.warning("I need a port number or attaching might fail.")
else:
waitFor("'Listening on port %d for incoming connectionsdone' in str(output.plainText)" % port, 5000)
try:
attachToApplication(executable)
except:
resetApplicationContextToCreator()
if ("Loading Qt Wrapper failed" in str(output.plainText)
or "Failed to assign process to job object" in str(output.plainText)):
test.warning("Loading of Qt Wrapper failed - probably different Qt versions.",
"Resetting hook-into settings to continue.")
# assuming we're still on the build settings of the current project (TODO)
switchViewTo(ViewConstants.PROJECTS)
if sType == SubprocessType.QT_QUICK_UI:
if "qmlscene" in executable:
selectConfig = "QML Scene"
else:
selectConfig = "QML Viewer"
else:
selectConfig = executable
selectFromCombo(waitForObject("{buddy={text='Run configuration:' type='QLabel' "
"unnamed='1' visible='1'} type='QComboBox' unnamed='1' "
"visible='1'}"), selectConfig)
switchViewTo(ViewConstants.EDIT)
runButton = waitForObject(":*Qt Creator.Run_Core::Internal::FancyToolButton")
clickButton(runButton)
if not waitForProcessRunning():
test.fatal("Something seems to be really wrong.", "Application output:"
% str(output.plainText))
return False
else:
test.log("Application seems to be started without hooking-into.")
else:
test.warning("Could not attach to '%s' - using fallback of pushing STOP inside Creator." % executable)
__closeSubprocessByPushingStop__(sType)
return False
if function == None:
if sType==SubprocessType.USER_DEFINED:
sendEvent("QCloseEvent", "{type='%s' unnamed='1' visible='1'}" % userDefType)
else:
sendEvent("QCloseEvent", "{type='%s' unnamed='1' visible='1'}" % SubprocessType.getWindowType(sType, quickVersion))
resetApplicationContextToCreator()
else:
try:
if isinstance(function, (str, unicode)):
globals()[function]()
else:
function()
except:
test.fatal("Function to execute on sub-process could not be found.",
"Using fallback of pushing STOP inside Creator.")
resetApplicationContextToCreator()
__closeSubprocessByPushingStop__(sType)
resetApplicationContextToCreator()
if not (waitForProcessRunning(False) and waitFor("'exited with code' in str(output.plainText)", 10000)):
test.warning("Sub-process seems not to have closed properly.")
try:
__closeSubprocessByPushingStop__(sType)
except:
pass
if (platform.system() in ('Microsoft', 'Windows') and
'Listening on port %d for incoming connectionsdone' % port not in str(output.plainText)):
checkForStillRunningQmlExecutable([executable + ".exe"])
return True
# this helper tries to reset the current application context back
# to creator - this strange work-around is needed _sometimes_ on MacOS
def resetApplicationContextToCreator():
appCtxt = applicationContext("qtcreator")
if appCtxt.name == "":
appCtxt = applicationContext("Qt Creator")
setApplicationContext(appCtxt)
# helper that examines the text (coming from the create project wizard)
# to figure out which available targets we have
# Simulator must be handled in a special way, because this depends on the