From 2c155447be40b45c6a16a0f8bc67e5b26735695b Mon Sep 17 00:00:00 2001
From: Christian Stenger <christian.stenger@nokia.com>
Date: Fri, 7 Oct 2011 15:43:45 +0200
Subject: [PATCH] Squish: Fixed some minor problems
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

 * problems on shutdown (mostly Win)
 * timing problems (Mac, Win)
 * support for accidental whitespace in settingspath (all)
 * added support for further special characters that could exist
   inside TreeView of the Project files (all)
 * removing the testing folder instead its content (all)

Change-Id: I146b56d253e3245641d0dcaebfad4d6f1dd684fc
Reviewed-by: Robert Löhning <robert.loehning@nokia.com>
---
 tests/system/shared/qtcreator.py              |  8 ++--
 tests/system/shared/qtquick.py                |  5 ++-
 .../suite_qtquick/tst_qml_editor/test.py      | 38 +++++++++++++++----
 3 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/tests/system/shared/qtcreator.py b/tests/system/shared/qtcreator.py
index 418f6967792..2aacbf68c15 100644
--- a/tests/system/shared/qtcreator.py
+++ b/tests/system/shared/qtcreator.py
@@ -21,11 +21,13 @@ source("../../shared/editor_utils.py")
 
 def waitForCleanShutdown(timeOut=10):
     appCtxt = currentApplicationContext()
-    shutdownDone = False
+    shutdownDone = (str(appCtxt)=="")
     if platform.system() in ('Windows','Microsoft'):
         endtime = datetime.utcnow() + timedelta(seconds=timeOut)
         while not shutdownDone:
             # following work-around because os.kill() works for win not until python 2.7
+            if appCtxt.pid==-1:
+                break
             tasks = subprocess.Popen("tasklist /FI \"PID eq %d\"" % appCtxt.pid, shell=True,stdout=subprocess.PIPE)
             output = tasks.communicate()[0]
             tasks.stdout.close()
@@ -47,7 +49,7 @@ def waitForCleanShutdown(timeOut=10):
 
 def __removeTmpSettingsDir__():
     waitForCleanShutdown()
-    deleteDirIfExists(os.path.dirname(tmpSettingsDir))
+    deleteDirIfExists(os.path.dirname(os.path.dirname(tmpSettingsDir)))
 
 if platform.system() in ('Windows', 'Microsoft'):
     sdkPath = "C:\\QtSDK"
@@ -67,5 +69,5 @@ tmpSettingsDir = os.path.abspath(tmpSettingsDir+"/settings")
 shutil.copytree(cwd, tmpSettingsDir)
 # the following only doesn't work if the test ends in an exception
 atexit.register(__removeTmpSettingsDir__)
-SettingsPath = " -settingspath %s" % tmpSettingsDir
+SettingsPath = ' -settingspath "%s"' % tmpSettingsDir
 
diff --git a/tests/system/shared/qtquick.py b/tests/system/shared/qtquick.py
index 98b664bf0b1..899bdeeda06 100644
--- a/tests/system/shared/qtquick.py
+++ b/tests/system/shared/qtquick.py
@@ -119,8 +119,11 @@ def runAndCloseQtQuickUI():
     # the following is currently a work-around for not using hooking into subprocesses
     if (waitForObject(":Qt Creator_Core::Internal::OutputPaneToggleButton").checked!=True):
         clickButton(":Qt Creator_Core::Internal::OutputPaneToggleButton")
-    clickButton(":Qt Creator.Stop_QToolButton")
+    stop = findObject(":Qt Creator.Stop_QToolButton")
+    waitFor("stop.enabled==True")
+    clickButton(stop)
     if platform.system()=="Darwin":
+        waitFor("stop.enabled==False")
         snooze(2)
         nativeType("<Escape>")
     return True
diff --git a/tests/system/suite_qtquick/tst_qml_editor/test.py b/tests/system/suite_qtquick/tst_qml_editor/test.py
index 4c7edff0f0a..f2bf98e3c9b 100644
--- a/tests/system/suite_qtquick/tst_qml_editor/test.py
+++ b/tests/system/suite_qtquick/tst_qml_editor/test.py
@@ -32,11 +32,22 @@ def testRenameId():
     model = navTree.model()
     files = ["Core.ContextMenu\\.qml", "Core.GridMenu\\.qml", "Core.ListMenu\\.qml", "focus\\.qml"]
     originalTexts = {}
+    editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' "
+                           "window=':Qt Creator_Core::Internal::MainWindow'}", 20000)
+    # temporarily store editor content for synchronizing purpose
+    # usage of formerTxt is done because I couldn't get waitForSignal() to work
+    # it always stored a different object into the signalObjects map as it looked up afterwards
+    # although used objectMap.realName() for both
+    formerTxt = editor.plainText
     for file in files:
         doubleClickFile(navTree, file)
-        editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' "
-                               "window=':Qt Creator_Core::Internal::MainWindow'}", 20000)
-        originalTexts.setdefault(file, "%s" % editor.plainText)
+        # wait until editor content switched to the double-clicked file
+        while formerTxt==editor.plainText:
+            editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' "
+                                   "window=':Qt Creator_Core::Internal::MainWindow'}", 20000)
+        # store content for next round
+        formerTxt = editor.plainText
+        originalTexts.setdefault(file, "%s" % formerTxt)
         test.log("stored %s's content" % file.replace("Core.","").replace("\\",""))
     # last opened file is the main file focus.qml
     line = "FocusScope\s*\{"
@@ -52,21 +63,32 @@ def testRenameId():
                        "window=':Qt Creator_Core::Internal::MainWindow'}"), "renamedView")
     clickButton(waitForObject("{text='Replace' type='QToolButton' unnamed='1' visible='1' "
                               "window=':Qt Creator_Core::Internal::MainWindow'}"))
+    # store editor content for synchronizing purpose
+    formerTxt = editor.plainText
     for file in files:
         doubleClickFile(navTree, file)
-        editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' "
-                               "window=':Qt Creator_Core::Internal::MainWindow'}", 20000)
-        modifiedText = "%s" % editor.plainText
+        # wait until editor content switched to double-clicked file
+        while formerTxt==editor.plainText:
+            editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' "
+                                   "window=':Qt Creator_Core::Internal::MainWindow'}", 20000)
+        # store content for next round
+        formerTxt = editor.plainText
         originalText = originalTexts.get(file).replace("mainView", "renamedView")
-        test.compare(originalText,modifiedText)
+        test.compare(originalText,formerTxt, "Comparing %s" % file.replace("Core.","").replace("\\",""))
     invokeMenuItem("File","Save All")
 
 def doubleClickFile(navTree, file):
     treeElement = ("untitled.QML.%s/qml.%s" %
-                   (templateDir.replace("\\", "/").replace("_", "\\_").replace(".","\\."),file))
+                   (maskSpecialCharsForProjectTree(templateDir),file))
     waitForObjectItem(navTree, treeElement)
     doubleClickItem(navTree, treeElement, 5, 5, 0, Qt.LeftButton)
 
+def maskSpecialCharsForProjectTree(filename):
+    filename = filename.replace("\\", "/").replace("_", "\\_").replace(".","\\.")
+    # undoing mask operations on chars masked by mistake
+    filename = filename.replace("/?","\\?").replace("/*","\\*")
+    return filename
+
 def cleanup():
     global workingDir, templateDir
     waitForCleanShutdown()
-- 
GitLab