diff options
author | Luke Deller <luke@deller.id.au> | 2016-09-22 18:53:49 +1000 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2016-09-22 09:53:35 +0000 |
commit | 328310d52e0f52ed1ebbd23535a67a82693adc61 (patch) | |
tree | dc245cca09adcecb96973453585bbcc7b463bcc8 | |
parent | 7acac4e5b2635f561143701c9634941293f6db14 (diff) |
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.grandin@collabora.co.uk>
Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | framework/qa/complex/XTitle/CheckXTitle.java | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/framework/qa/complex/XTitle/CheckXTitle.java b/framework/qa/complex/XTitle/CheckXTitle.java index 1372cf3dc432..994215aba32a 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() ); |