Commits

Anonymous committed 222f9fa

fs34b: remaint of CWS debuglevels: UNO API test for ensuring the proper order of events when closing the doc by various means. Two of three test cases disabled currently, due to #i117585#

Comments (0)

Files changed (4)

sfx2/JunitTest_sfx2_complex.mk

 	sfx2/qa/complex/sfx2/DocumentInfo \
 	sfx2/qa/complex/sfx2/StandaloneDocumentInfo \
 	sfx2/qa/complex/sfx2/UndoManager \
+	sfx2/qa/complex/sfx2/JUnitBasedTest \
+	sfx2/qa/complex/sfx2/DocumentEvents \
 	sfx2/qa/complex/sfx2/standalonedocinfo/StandaloneDocumentInfoTest \
 	sfx2/qa/complex/sfx2/standalonedocinfo/TestHelper \
 	sfx2/qa/complex/sfx2/standalonedocinfo/Test01 \
 	complex.sfx2.DocumentProperties \
 	complex.sfx2.DocumentMetadataAccess \
 	complex.sfx2.UndoManager \
+	complex.sfx2.DocumentEvents \
 ))
 # #i115674# fails currently: misses some OnUnfocus event
 #	complex.sfx2.GlobalEventBroadcaster \

sfx2/qa/complex/sfx2/DocumentEvents.java

+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package complex.sfx2;
+
+import com.sun.star.document.DocumentEvent;
+import com.sun.star.document.XDocumentEventBroadcaster;
+import com.sun.star.document.XDocumentEventListener;
+import com.sun.star.lang.EventObject;
+import com.sun.star.lang.XEventListener;
+import com.sun.star.uno.Exception;
+import com.sun.star.uno.UnoRuntime;
+import com.sun.star.util.CloseVetoException;
+import com.sun.star.util.XCloseListener;
+import com.sun.star.util.XCloseable;
+import java.util.Vector;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.*;
+import org.openoffice.test.tools.OfficeDocument;
+
+/**
+ *
+ * @author frank.shoenheit@oracle.com
+ */
+public class DocumentEvents extends JUnitBasedTest
+{
+    @Before
+    public void beforeTest() throws Exception
+    {
+        m_document = OfficeDocument.blankTextDocument( this.getORB() );
+    }
+
+    @After
+    public void afterTest()
+    {
+        if ( m_document != null )
+        {
+            assertTrue( "closing the test document failed", m_document.close() );
+            m_document = null;
+        }
+    }
+
+    /**
+     * sets up the environment for a test which checks the behavior upon closing a doc
+     */
+    private void impl_setupDocCloseTest()
+    {
+        m_observedCloseEvents.clear();
+
+        final XDocumentEventBroadcaster docEventBroadcaster = UnoRuntime.queryInterface(
+            XDocumentEventBroadcaster.class, m_document.getDocument() );
+        docEventBroadcaster.addDocumentEventListener( new DocumentEventListener() );
+
+        final XCloseable docCloseable = UnoRuntime.queryInterface( XCloseable.class,
+                m_document.getDocument() );
+        docCloseable.addCloseListener( new CloseListener() );
+
+        m_document.getDocument().addEventListener( new DocDisposeListener() );
+    }
+
+    /**
+     * sets up the environment for a test which checks the behavior upon closing a doc
+     */
+    private void impl_tearDownDocCloseTest( final String i_docCloseMethod )
+    {
+        synchronized( m_document )
+        {
+            try
+            {
+                m_document.wait(10000);
+            }
+            catch (InterruptedException ex)
+            {
+                // don't continue the test if somebody interrupted us ...
+                return;
+            }
+        }
+
+        m_document = null;
+        synchronized( m_observedCloseEvents )
+        {
+            assertArrayEquals(
+                "wrong order of events when closing a doc " + i_docCloseMethod,
+                new CloseEventType[] { CloseEventType.OnUnload, CloseEventType.NotifyClosing, CloseEventType.Disposing },
+                m_observedCloseEvents.toArray( new CloseEventType[0] )
+            );
+        }
+    }
+
+    @Test
+    public void testCloseWinEvents() throws Exception
+    {
+        impl_setupDocCloseTest();
+        m_document.getCurrentView().dispatch( ".uno:CloseWin" );
+        impl_tearDownDocCloseTest( "via .uno:CloseWin" );
+    }
+
+    //@Test
+    public void testCloseDocEvents() throws Exception
+    {
+        impl_setupDocCloseTest();
+        m_document.getCurrentView().dispatch( ".uno:CloseDoc" );
+        impl_tearDownDocCloseTest( "via .uno:CloseDoc" );
+    }
+
+    //@Test
+    public void testCloseByAPI() throws Exception
+    {
+        impl_setupDocCloseTest();
+        // closing the doc by API is synchronous, so do this in a separate thread, else we will get a deadlock
+        // when the document tries to call back our listener (well, I admit I didn't understand *why* we get this
+        // deadlock ... :-\ )
+        (new DocCloser()).start();
+        impl_tearDownDocCloseTest( "by API" );
+    }
+
+    private class DocumentEventListener implements XDocumentEventListener
+    {
+
+        public void documentEventOccured( DocumentEvent i_documentEvent )
+        {
+            if ( i_documentEvent.EventName.equals( "OnUnload" ) )
+            {
+                synchronized( m_observedCloseEvents )
+                {
+                    m_observedCloseEvents.add( CloseEventType.OnUnload );
+                }
+            }
+        }
+
+        public void disposing(EventObject eo)
+        {
+            // not interested in
+        }
+    };
+
+    private class CloseListener implements XCloseListener
+    {
+
+        public void queryClosing(EventObject eo, boolean bln) throws CloseVetoException
+        {
+            // not interested in
+        }
+
+        public void notifyClosing(EventObject eo)
+        {
+            synchronized( m_observedCloseEvents )
+            {
+                m_observedCloseEvents.add( CloseEventType.NotifyClosing );
+            }
+        }
+
+        public void disposing(EventObject eo)
+        {
+            // not interested in
+        }
+    };
+
+    private class DocDisposeListener implements XEventListener
+    {
+        public void disposing(EventObject eo)
+        {
+            synchronized( m_observedCloseEvents )
+            {
+                m_observedCloseEvents.add( CloseEventType.Disposing );
+            }
+            synchronized ( m_document )
+            {
+                m_document.notifyAll();
+            }
+        }
+    };
+
+    private class DocCloser extends Thread
+    {
+        @Override
+        public void run()
+        {
+            try
+            {
+                final XCloseable docCloseable = UnoRuntime.queryInterface(XCloseable.class, m_document.getDocument());
+                docCloseable.close(true);
+            }
+            catch (CloseVetoException ex)
+            {
+                Logger.getLogger(DocumentEvents.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        }
+    };
+
+    private enum CloseEventType
+    {
+        OnUnload,
+        NotifyClosing,
+        Disposing
+    };
+
+    private OfficeDocument m_document = null;
+    final private Vector< CloseEventType > m_observedCloseEvents = new Vector<DocumentEvents.CloseEventType>();
+}

sfx2/qa/complex/sfx2/JUnitBasedTest.java

+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package complex.sfx2;
+
+import org.openoffice.test.OfficeConnection;
+import com.sun.star.uno.UnoRuntime;
+import com.sun.star.lang.XMultiServiceFactory;
+import com.sun.star.uno.XComponentContext;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ *
+ * @author Frank
+ */
+public class JUnitBasedTest
+{
+    // -----------------------------------------------------------------------------------------------------------------
+    protected XComponentContext getContext()
+    {
+        return m_connection.getComponentContext();
+    }
+
+    // -----------------------------------------------------------------------------------------------------------------
+    protected XMultiServiceFactory getORB()
+    {
+        final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(
+            XMultiServiceFactory.class, getContext().getServiceManager() );
+        return xMSF1;
+    }
+
+    // -----------------------------------------------------------------------------------------------------------------
+    @BeforeClass
+    public static void setUpConnection() throws Exception
+    {
+        System.out.println( "--------------------------------------------------------------------------------" );
+        System.out.println( "connecting ..." );
+        m_connection.setUp();
+    }
+
+    // -----------------------------------------------------------------------------------------------------------------
+    @AfterClass
+    public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception
+    {
+        System.out.println();
+        System.out.println( "tearing down connection" );
+        m_connection.tearDown();
+        System.out.println( "--------------------------------------------------------------------------------" );
+    }
+
+    private static final OfficeConnection   m_connection = new OfficeConnection();
+}

sfx2/qa/complex/sfx2/UndoManager.java

         events.replaceByName( "OnViewCreated", scriptDescriptor );
 
         // The below doesn't work: event notification is broken in m96, see http://www.openoffice.org/issues/show_bug.cgi?id=116313
-/*        m_callbackCalled = false;
+        m_callbackCalled = false;
         m_currentDocument.getCurrentView().dispatch( ".uno:NewWindow" );
         assertTrue( "triggering an event did not work as expected - basic script not called", m_callbackCalled );
         // same as above: The script didn't close the context, but the OOo framework should have
         assertEquals( "undo context was not auto-closed as expected", 0, m_undoListener.getCurrentUndoContextDepth() );
- */
 
         // .............................................................................................................
         // scenario 4: let the script enter an Undo context, but not close it, as usual.