framework/qa/complex/XTitle/CheckXTitle.java | 58 +++++++++++++++++++++------ 1 file changed, 46 insertions(+), 12 deletions(-)
New commits: commit 328310d52e0f52ed1ebbd23535a67a82693adc61 Author: Luke Deller <l...@deller.id.au> Date: Thu Sep 22 18:53:49 2016 +1000 Fix JunitTest_framework_complex:CheckXTitle This unit test class relies on calling waitForEventIdle to wait for UI transitions to complete. On Windows this is not reliable, due to VCL's use of PostMessage (Windows message queue) to asynchronously handle some events such as focus changes. This issue causes the test to intermittently fail when the dispatcher for the action the test wants to perform (like closing the print preview) is not available yet. - Change the test code to explicitly wait for the desired dispatcher to be available - Remove the sleep which was added earlier this year to address this symptom in one location Change-Id: Id701209a28cd0c806ab0a548508d31f9f11211f5 Reviewed-on: https://gerrit.libreoffice.org/29167 Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Tested-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/framework/qa/complex/XTitle/CheckXTitle.java b/framework/qa/complex/XTitle/CheckXTitle.java index 1372cf3..994215a 100644 --- a/framework/qa/complex/XTitle/CheckXTitle.java +++ b/framework/qa/complex/XTitle/CheckXTitle.java @@ -100,18 +100,52 @@ public class CheckXTitle m_xMSF = null; } + private URL parseURL(String unoURL) + { + URL[] aParseURL = new URL[] { new URL() }; + aParseURL[0].Complete = unoURL; + m_xParser.parseStrict(aParseURL); + return aParseURL[0]; + } + + private void waitUntilDispatcherAvailable(XModel xModel, String unoURL) + throws InterruptedException + { + utils.waitForEventIdle(m_xMSF); + + // On Windows, some events such as focus changes are handled + // asynchronously using PostMessage (Windows message queue) + // so the previous UI transition may still not have completed yet + // even though we called waitForEventIdle. + // + // Loop a few times until the desired dispatcher is available, which + // is a better indication that the UI transition has completed. + + XDispatchProvider xDisProv; + XDispatch xDispatcher = null; + URL parsed_url = parseURL(unoURL); + + for (int ntries = 1; ntries < 5; ++ntries) { + xDisProv = UnoRuntime.queryInterface( + XDispatchProvider.class, xModel.getCurrentController() ); + xDispatcher = xDisProv.queryDispatch(parsed_url, "", 0); + if (xDispatcher != null) + break; + Thread.sleep(250); + } + assertNotNull("Can not obtain dispatcher for query: " + unoURL, xDispatcher); + } + + // prepare an uno URL query and dispatch it private void prepareQueryAndDispatch(XDispatchProvider xDisProv, String unoURL) { XDispatch xDispatcher = null; - URL[] aParseURL = new URL[1]; - aParseURL[0] = new URL(); - aParseURL[0].Complete = unoURL; - m_xParser.parseStrict(aParseURL); + URL parsed_url = parseURL(unoURL); - xDispatcher = xDisProv.queryDispatch(aParseURL[0], "", 0); + xDispatcher = xDisProv.queryDispatch(parsed_url, "", 0); assertNotNull("Can not obtain dispatcher for query: " + unoURL, xDispatcher); - xDispatcher.dispatch(aParseURL[0], null); + xDispatcher.dispatch(parsed_url, null); } /** @short checks the numbers displayed in the title @@ -142,7 +176,8 @@ public class CheckXTitle xDisProv = UnoRuntime.queryInterface( XDispatchProvider.class, xModel.getCurrentController() ); prepareQueryAndDispatch( xDisProv, UNO_URL_FOR_PRINT_PREVIEW ); - utils.waitForEventIdle(m_xMSF); + waitUntilDispatcherAvailable( xModel, UNO_URL_FOR_CLOSING_PRINT_PREVIEW ); + // get window title with ui in print preview mode String printPreviewTitle = xTitle.getTitle(); assertEquals("Title mismatch between default view window title and print preview window title", @@ -150,7 +185,8 @@ public class CheckXTitle xDisProv = UnoRuntime.queryInterface( XDispatchProvider.class, xModel.getCurrentController() ); prepareQueryAndDispatch( xDisProv, UNO_URL_FOR_CLOSING_PRINT_PREVIEW ); - utils.waitForEventIdle(m_xMSF); + waitUntilDispatcherAvailable( xModel, UNO_URL_FOR_CLOSING_DOC ); + //get window title with ui back in default mode String printPreviewClosedTitle = xTitle.getTitle(); assertEquals("Title mismatch between default view window title and title after switching from print preview to default view window" ,defaultTitle, printPreviewClosedTitle); @@ -189,14 +225,12 @@ public class CheckXTitle // switch to print preview mode xDisProv = UnoRuntime.queryInterface( XDispatchProvider.class, xModel.getCurrentController() ); prepareQueryAndDispatch( xDisProv, UNO_URL_FOR_PRINT_PREVIEW ); - utils.waitForEventIdle(m_xMSF); + waitUntilDispatcherAvailable( xModel, UNO_URL_FOR_CLOSING_PRINT_PREVIEW ); // switch back to default mode xDisProv = UnoRuntime.queryInterface( XDispatchProvider.class, xModel.getCurrentController() ); prepareQueryAndDispatch( xDisProv, UNO_URL_FOR_CLOSING_PRINT_PREVIEW ); - utils.waitForEventIdle(m_xMSF); - - Thread.sleep(250); // FIXME why is this needed? + waitUntilDispatcherAvailable( xModel, UNO_URL_FOR_CLOSING_DOC ); // close document xDisProv = UnoRuntime.queryInterface( XDispatchProvider.class, xModel.getCurrentController() ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits