You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by se...@apache.org on 2009/02/06 14:22:01 UTC

svn commit: r741561 [3/3] - in /directory/studio/trunk: ./ repository/ repository/net/ repository/org/eclipse/swtbot/ repository/org/eclipse/swtbot/eclipse/ repository/org/eclipse/swtbot/eclipse/core/ repository/org/eclipse/swtbot/eclipse/core/2.0.0.13...

Modified: directory/studio/trunk/test-integration-ui/src/main/java/org/apache/directory/studio/test/integration/ui/SWTBotUtils.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/test-integration-ui/src/main/java/org/apache/directory/studio/test/integration/ui/SWTBotUtils.java?rev=741561&r1=741560&r2=741561&view=diff
==============================================================================
--- directory/studio/trunk/test-integration-ui/src/main/java/org/apache/directory/studio/test/integration/ui/SWTBotUtils.java (original)
+++ directory/studio/trunk/test-integration-ui/src/main/java/org/apache/directory/studio/test/integration/ui/SWTBotUtils.java Fri Feb  6 13:21:59 2009
@@ -20,31 +20,14 @@
 
 package org.apache.directory.studio.test.integration.ui;
 
-
-import static net.sf.swtbot.finder.UIThreadRunnable.syncExec;
-import static net.sf.swtbot.matcher.WidgetMatcherFactory.widgetOfType;
+import static org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable.syncExec;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;
 import static org.hamcrest.Matchers.anything;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-import net.sf.swtbot.eclipse.finder.SWTEclipseBot;
-import net.sf.swtbot.eclipse.finder.widgets.SWTBotView;
-import net.sf.swtbot.eclipse.finder.widgets.SWTBotWorkbenchPart;
-import net.sf.swtbot.finder.UIThreadRunnable;
-import net.sf.swtbot.finder.results.VoidResult;
-import net.sf.swtbot.finder.results.WidgetResult;
-import net.sf.swtbot.wait.DefaultCondition;
-import net.sf.swtbot.wait.ICondition;
-import net.sf.swtbot.widgets.SWTBotButton;
-import net.sf.swtbot.widgets.SWTBotMenu;
-import net.sf.swtbot.widgets.SWTBotTable;
-import net.sf.swtbot.widgets.SWTBotTree;
-import net.sf.swtbot.widgets.SWTBotTreeItem;
-import net.sf.swtbot.widgets.TimeoutException;
-import net.sf.swtbot.widgets.WidgetNotFoundException;
-
 import org.apache.directory.studio.connection.core.Connection;
 import org.apache.directory.studio.connection.core.ConnectionCorePlugin;
 import org.apache.directory.studio.connection.core.ConnectionFolder;
@@ -56,459 +39,454 @@
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Tree;
 import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swtbot.eclipse.finder.SWTEclipseBot;
+import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
+import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotWorkbenchPart;
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.results.WidgetResult;
+import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
+import org.eclipse.swtbot.swt.finder.waits.ICondition;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotButton;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
+import org.eclipse.swtbot.swt.finder.widgets.TimeoutException;
 import org.eclipse.ui.IEditorReference;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PlatformUI;
 
-
 /**
  * Helpers for using SWTBot.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory
+ *         Project</a>
  * @version $Rev$, $Date$
  */
-public class SWTBotUtils
-{
+public class SWTBotUtils {
 
-    /**
-     * Opens the LDAP perspective.
-     * 
-     * @param bot the bot
-     * 
-     * @throws Exception the exception
-     */
-    public static void openLdapPerspective( final SWTEclipseBot eBot ) throws Exception
-    {
-        // optimization: only open LDAP perspective if not yet opened
-        try
-        {
-            if ( eBot.view( "Connections" ) != null )
-            {
-                // LDAP perspective already opened
-                return;
-            }
-        }
-        catch ( Exception e )
-        {
-            // no 'Connections' view, continue to open the LDAP perspective
-        }
-
-        // open "Open Perspective" dialog
-        SWTBotMenu windowMenu = eBot.menu( "Window" );
-        windowMenu.click();
-        SWTBotMenu perspectiveMenu = windowMenu.menu( "Open Perspective" );
-        perspectiveMenu.click();
-        SWTBotMenu otherMenu = windowMenu.menu( "Other..." );
-        otherMenu.click();
-
-        // select "LDAP" perspective
-        SWTBotTable table = eBot.table();
-        table.select( "LDAP" );
-
-        // press "OK"
-        SWTBotButton okButton = eBot.button( "OK" );
-        okButton.click();
-
-        // wait till Connections view become visible
-        eBot.waitUntil( new DefaultCondition()
-        {
-            public boolean test() throws Exception
-            {
-                return eBot.view( "Connections" ) != null;
-            }
-
-
-            public String getFailureMessage()
-            {
-                return "Could not find widget";
-            }
-        } );
-
-        // close welcome view, if it is there
-        try
-        {
-            eBot.view( "Welcome" ).close();
-        }
-        catch ( Exception e )
-        {
-        }
-    }
-
-
-    /**
-     * Creates the test connection.
-     * 
-     * @param bot the bot
-     * @param name the name of the connection
-     * @param port the port to use
-     * 
-     * @return the connection
-     * 
-     * @throws Exception the exception
-     */
-    public static Connection createTestConnection( SWTEclipseBot bot, String name, int port ) throws Exception
-    {
-        SWTBotTree connectionsTree = getConnectionsTree( bot );
-
-        ConnectionManager connectionManager = ConnectionCorePlugin.getDefault().getConnectionManager();
-        ConnectionParameter connectionParameter = new ConnectionParameter();
-        connectionParameter.setName( name );
-        connectionParameter.setHost( "localhost" );
-        connectionParameter.setPort( port );
-        connectionParameter.setEncryptionMethod( EncryptionMethod.NONE );
-        connectionParameter.setAuthMethod( AuthenticationMethod.SIMPLE );
-        connectionParameter.setBindPrincipal( "uid=admin,ou=system" );
-        connectionParameter.setBindPassword( "secret" );
-        Connection connection = new Connection( connectionParameter );
-        connectionManager.addConnection( connection );
-
-        ConnectionFolderManager connectionFolderManager = ConnectionCorePlugin.getDefault()
-            .getConnectionFolderManager();
-        ConnectionFolder rootConnectionFolder = connectionFolderManager.getRootConnectionFolder();
-        rootConnectionFolder.addConnectionId( connection.getId() );
-
-        connectionsTree.select( name );
-        //new OpenConnectionsJob( connection ).execute();
-
-        Thread.sleep( 1000 );
-        return connection;
-    }
-
-
-    /**
-     * Deletes the test connection.
-     */
-    public static void deleteTestConnections()
-    {
-        ConnectionManager connectionManager = ConnectionCorePlugin.getDefault().getConnectionManager();
-        for ( Connection connection : connectionManager.getConnections() )
-        {
-            connectionManager.removeConnection( connection );
-        }
-    }
-
-
-    /**
-     * Gets the connections tree.
-     * 
-     * @param bot the bot
-     * 
-     * @return the connections tree
-     * 
-     * @throws Exception the exception
-     */
-    public static SWTBotTree getConnectionsTree( SWTEclipseBot bot ) throws Exception
-    {
-        SWTBotView view = bot.view( "Connections" );
-        view.show();
-
-        Tree tree = ( Tree ) bot.widget( widgetOfType( Tree.class ), view.widget );
-        return new SWTBotTree( tree );
-    }
-
-
-    /**
-     * Gets the ldap browser tree.
-     * 
-     * @param bot the bot
-     * 
-     * @return the ldap browser tree
-     * 
-     * @throws Exception the exception
-     */
-    public static SWTBotTree getLdapBrowserTree( SWTEclipseBot bot ) throws Exception
-    {
-        SWTBotView view = bot.view( "LDAP Browser" );
-        view.show();
-
-        Tree tree = ( Tree ) bot.widget( widgetOfType( Tree.class ), view.widget );
-        return new SWTBotTree( tree );
-    }
-
-
-    /**
-     * Gets the entry editor tree.
-     * 
-     * @param bot the bot
-     * 
-     * @return the entry editor tree
-     * 
-     * @throws Exception the exception
-     */
-    public static SWTBotTree getEntryEditorTree( final SWTEclipseBot bot ) throws Exception
-    {
-        Tree tree = UIThreadRunnable.syncExec( new WidgetResult<Tree>()
-        {
-            public Tree run()
-            {
-                IWorkbench workbench = PlatformUI.getWorkbench();
-                IWorkbenchWindow activeWorkbenchWindow = workbench.getActiveWorkbenchWindow();
-                IWorkbenchPage[] pages = activeWorkbenchWindow.getPages();
-                for ( int i = 0; i < pages.length; i++ )
-                {
-                    IWorkbenchPage page = pages[i];
-                    IEditorReference[] editorReferences = page.getEditorReferences();
-                    for ( int j = 0; j < editorReferences.length; j++ )
-                    {
-                        IEditorReference editorReference = editorReferences[j];
-                        if ( editorReference.getName().equals( "Entry Editor" ) )
-                        {
-                            DummyEditor editor = new DummyEditor( editorReference, bot );
-                            Tree tree = ( Tree ) bot.widget( widgetOfType( Tree.class ), editor.widget );
-                            return tree;
-
-                        }
-                    }
-                }
-                throw new WidgetNotFoundException( "Could not find Entry Editor tree" );
-            }
-        } );
-        return new SWTBotTree( tree );
-    }
-
-    static class DummyEditor extends SWTBotWorkbenchPart<IEditorReference>
-    {
-        public Widget widget;
-
-
-        public DummyEditor( IEditorReference editorReference, SWTEclipseBot bot )
-        {
-            super( editorReference, bot );
-            widget = findWidget( anything() );
-        }
-
-
-        public void setFocus()
-        {
-            syncExec( new VoidResult()
-            {
-                public void run()
-                {
-                    ( ( Control ) widget ).setFocus();
-                }
-            } );
-        }
-    }
-
-
-    /**
-     * Clicks a button asynchronously and waits till the given condition
-     * is fulfilled.
-     * 
-     * @param bot the SWT bot
-     * @param button the button to click
-     * @param waitCondition the condition to wait for, may be null
-     * 
-     * @throws TimeoutException 
-     */
-    public static void asyncClick( final SWTEclipseBot bot, final SWTBotButton button, final ICondition waitCondition )
-        throws TimeoutException
-    {
-        bot.waitUntil( new DefaultCondition()
-        {
-            public boolean test() throws Exception
-            {
-                return button.isEnabled();
-            }
-
-
-            public String getFailureMessage()
-            {
-                return "Button isn't enabled.";
-            }
-        } );
-
-        UIThreadRunnable.asyncExec( bot.getDisplay(), new VoidResult()
-        {
-            public void run()
-            {
-                button.click();
-            }
-        } );
-
-        if ( waitCondition != null )
-        {
-            bot.waitUntil( waitCondition );
-        }
-    }
-
-
-    /**
-     * Clicks a menu item asynchronously and waits till the given condition
-     * is fulfilled.
-     * 
-     * @param bot the SWT bot
-     * @param button the button to click
-     * @param waitCondition the condition to wait for, may be null
-     * 
-     * @throws TimeoutException 
-     */
-    public static void asyncClick( final SWTEclipseBot bot, final SWTBotMenu menu, final ICondition waitCondition )
-        throws TimeoutException
-    {
-        UIThreadRunnable.asyncExec( bot.getDisplay(), new VoidResult()
-        {
-            public void run()
-            {
-                menu.click();
-            }
-        } );
-
-        if ( waitCondition != null )
-        {
-            bot.waitUntil( waitCondition );
-        }
-    }
-
-
-    /**
-     * Clicks a tree item asynchronously and waits till the given condition
-     * is fulfilled.
-     * 
-     * @param bot the SWT bot
-     * @param item the tree item to click
-     * @param waitCondition the condition to wait for, may be null
-     * 
-     * @throws TimeoutException the timeout exception
-     */
-    public static void asyncClick( final SWTEclipseBot bot, final SWTBotTreeItem item, final ICondition waitCondition )
-        throws TimeoutException
-    {
-        UIThreadRunnable.asyncExec( bot.getDisplay(), new VoidResult()
-        {
-            public void run()
-            {
-                item.click();
-            }
-        } );
-
-        if ( waitCondition != null )
-        {
-            bot.waitUntil( waitCondition );
-        }
-    }
-
-
-    /**
-     * Selects an entry in the browser tree and optionally expands the selected entry.
-     * Takes care that all attributes and child entries are initialized so 
-     * that there are no pending background actions and event notifications. 
-     * This is necessary to avoid race conditions.
-     * 
-     * @param bot the SWT bot
-     * @param tree the browser tree
-     * @param expandChild true to expand the child entry
-     * @param path the path to the entry
-     * 
-     * @return the selected entry as SWTBotTreeItem
-     * 
-     * @throws Exception the exception
-     */
-    public static SWTBotTreeItem selectEntry( final SWTEclipseBot bot, final SWTBotTree tree,
-        final boolean expandChild, final String... path ) throws Exception
-    {
-        List<String> pathList = new ArrayList<String>( Arrays.asList( path ) );
-        SWTBotTreeItem entry = null;
-
-        while ( !pathList.isEmpty() )
-        {
-            String currentPath = pathList.remove( 0 );
-
-            if ( entry == null )
-            {
-                entry = tree.getTreeItem( currentPath );
-            }
-            else
-            {
-                // adjust current path, because the label is decorated with the number of children
-                currentPath = adjustNodeName( entry, currentPath );
-                entry = entry.getNode( currentPath );
-            }
-
-            final SWTBotTreeItem tempEntry = entry;
-            UIThreadRunnable.asyncExec( bot.getDisplay(), new VoidResult()
-            {
-                public void run()
-                {
-                    tempEntry.select();
-                }
-            } );
-
-            if ( !pathList.isEmpty() || expandChild )
-            {
-                // expand entry and wait till 
-                // - children are displayed
-                // - next child is visible
-                final String nextName = !pathList.isEmpty() ? pathList.get( 0 ) : null;
-                expandEntry( bot, entry, nextName );
-            }
-
-        }
-        return entry;
-    }
-
-
-    /**
-     * Expands the entry.
-     * Takes care that all attributes and child entries are initialized so 
-     * that there are no pending background actions and event notifications. 
-     * This is necessary to avoid race conditions.
-     * 
-     * @param bot the bot
-     * @param entry the entry to expand
-     * @param nextName the name of the entry that must become visible, may be null
-     * 
-     * @throws Exception the exception
-     */
-    public static void expandEntry( final SWTEclipseBot bot, final SWTBotTreeItem entry, final String nextName )
-        throws Exception
-    {
-        UIThreadRunnable.asyncExec( bot.getDisplay(), new VoidResult()
-        {
-            public void run()
-            {
-                entry.expand();
-            }
-        } );
-
-        bot.waitUntil( new DefaultCondition()
-        {
-            public boolean test() throws Exception
-            {
-                if ( nextName != null )
-                {
-                    String adjustedNodeName = nextName != null ? adjustNodeName( entry, nextName ) : null;
-                    SWTBotTreeItem node = entry.getNode( adjustedNodeName );
-                    if ( node == null )
-                    {
-                        return false;
-                    }
-                }
-                return !entry.getNodes().contains( "Fetching Entries..." );
-            }
-
-
-            public String getFailureMessage()
-            {
-                return "Could not find entry " + entry.getText() + " -> " + nextName;
-            }
-        } );
-    }
-
-
-    private static String adjustNodeName( SWTBotTreeItem child, String nodeName )
-    {
-        List<String> nodes = child.getNodes();
-        for ( String node : nodes )
-        {
-            if ( node.toUpperCase().startsWith( nodeName.toUpperCase() ) )
-            {
-                return node;
-            }
-        }
-        return null;
-    }
+	/**
+	 * Opens the LDAP perspective.
+	 * 
+	 * @param bot
+	 *            the bot
+	 * 
+	 * @throws Exception
+	 *             the exception
+	 */
+	public static void openLdapPerspective(final SWTEclipseBot eBot)
+			throws Exception {
+		// optimization: only open LDAP perspective if not yet opened
+		try {
+			if (eBot.view("Connections") != null) {
+				// LDAP perspective already opened
+				return;
+			}
+		} catch (Exception e) {
+			// no 'Connections' view, continue to open the LDAP perspective
+		}
+
+		// open "Open Perspective" dialog
+		SWTBotMenu windowMenu = eBot.menu("Window");
+		windowMenu.click();
+		SWTBotMenu perspectiveMenu = windowMenu.menu("Open Perspective");
+		perspectiveMenu.click();
+		SWTBotMenu otherMenu = windowMenu.menu("Other...");
+		otherMenu.click();
+
+		// select "LDAP" perspective
+		SWTBotTable table = eBot.table();
+		table.select("LDAP");
+
+		// press "OK"
+		SWTBotButton okButton = eBot.button("OK");
+		okButton.click();
+
+		// wait till Connections view become visible
+		eBot.waitUntil(new DefaultCondition() {
+			public boolean test() throws Exception {
+				return eBot.view("Connections") != null;
+			}
+
+			public String getFailureMessage() {
+				return "Could not find widget";
+			}
+		});
+
+		// close welcome view, if it is there
+		try {
+			eBot.view("Welcome").close();
+		} catch (Exception e) {
+		}
+	}
+
+	/**
+	 * Creates the test connection.
+	 * 
+	 * @param bot
+	 *            the bot
+	 * @param name
+	 *            the name of the connection
+	 * @param port
+	 *            the port to use
+	 * 
+	 * @return the connection
+	 * 
+	 * @throws Exception
+	 *             the exception
+	 */
+	public static Connection createTestConnection(SWTEclipseBot bot,
+			String name, int port) throws Exception {
+		SWTBotTree connectionsTree = getConnectionsTree(bot);
+
+		ConnectionManager connectionManager = ConnectionCorePlugin.getDefault()
+				.getConnectionManager();
+		ConnectionParameter connectionParameter = new ConnectionParameter();
+		connectionParameter.setName(name);
+		connectionParameter.setHost("localhost");
+		connectionParameter.setPort(port);
+		connectionParameter.setEncryptionMethod(EncryptionMethod.NONE);
+		connectionParameter.setAuthMethod(AuthenticationMethod.SIMPLE);
+		connectionParameter.setBindPrincipal("uid=admin,ou=system");
+		connectionParameter.setBindPassword("secret");
+		Connection connection = new Connection(connectionParameter);
+		connectionManager.addConnection(connection);
+
+		ConnectionFolderManager connectionFolderManager = ConnectionCorePlugin
+				.getDefault().getConnectionFolderManager();
+		ConnectionFolder rootConnectionFolder = connectionFolderManager
+				.getRootConnectionFolder();
+		rootConnectionFolder.addConnectionId(connection.getId());
+
+		connectionsTree.select(name);
+		// new OpenConnectionsJob( connection ).execute();
+
+		Thread.sleep(1000);
+		return connection;
+	}
+
+	/**
+	 * Deletes the test connection.
+	 */
+	public static void deleteTestConnections() {
+		ConnectionManager connectionManager = ConnectionCorePlugin.getDefault()
+				.getConnectionManager();
+		for (Connection connection : connectionManager.getConnections()) {
+			connectionManager.removeConnection(connection);
+		}
+	}
+
+	/**
+	 * Gets the connections tree.
+	 * 
+	 * @param bot
+	 *            the bot
+	 * 
+	 * @return the connections tree
+	 * 
+	 * @throws Exception
+	 *             the exception
+	 */
+	public static SWTBotTree getConnectionsTree(SWTEclipseBot bot)
+			throws Exception {
+		SWTBotView view = bot.view("Connections");
+		view.show();
+
+		Tree tree = (Tree) bot.widget(widgetOfType(Tree.class), view
+				.getWidget());
+		return new SWTBotTree(tree);
+	}
+
+	/**
+	 * Gets the ldap browser tree.
+	 * 
+	 * @param bot
+	 *            the bot
+	 * 
+	 * @return the ldap browser tree
+	 * 
+	 * @throws Exception
+	 *             the exception
+	 */
+	public static SWTBotTree getLdapBrowserTree(SWTEclipseBot bot)
+			throws Exception {
+		SWTBotView view = bot.view("LDAP Browser");
+		view.show();
+
+		Tree tree = (Tree) bot.widget(widgetOfType(Tree.class), view
+				.getWidget());
+		return new SWTBotTree(tree);
+	}
+
+	/**
+	 * Gets the entry editor tree.
+	 * 
+	 * @param bot
+	 *            the bot
+	 * 
+	 * @return the entry editor tree
+	 * 
+	 * @throws Exception
+	 *             the exception
+	 */
+	public static SWTBotTree getEntryEditorTree(final SWTEclipseBot bot)
+			throws Exception {
+		Tree tree = UIThreadRunnable.syncExec(new WidgetResult<Tree>() {
+			public Tree run() {
+				IWorkbench workbench = PlatformUI.getWorkbench();
+				IWorkbenchWindow activeWorkbenchWindow = workbench
+						.getActiveWorkbenchWindow();
+				IWorkbenchPage[] pages = activeWorkbenchWindow.getPages();
+				for (int i = 0; i < pages.length; i++) {
+					IWorkbenchPage page = pages[i];
+					IEditorReference[] editorReferences = page
+							.getEditorReferences();
+					for (int j = 0; j < editorReferences.length; j++) {
+						IEditorReference editorReference = editorReferences[j];
+						if (editorReference.getName().equals("Entry Editor")) {
+							DummyEditor editor = new DummyEditor(
+									editorReference, bot);
+							Tree tree = (Tree) bot.widget(
+									widgetOfType(Tree.class), editor.widget);
+							return tree;
+
+						}
+					}
+				}
+				throw new WidgetNotFoundException(
+						"Could not find Entry Editor tree");
+			}
+		});
+		return new SWTBotTree(tree);
+	}
+
+	static class DummyEditor extends SWTBotWorkbenchPart<IEditorReference> {
+		public Widget widget;
+
+		public DummyEditor(IEditorReference editorReference, SWTEclipseBot bot) {
+			super(editorReference, bot);
+			widget = findWidget(anything());
+		}
+
+		public void setFocus() {
+			syncExec(new VoidResult() {
+				public void run() {
+					((Control) widget).setFocus();
+				}
+			});
+		}
+
+		public boolean isActive() {
+			return true;
+		}
+	}
+
+	/**
+	 * Clicks a button asynchronously and waits till the given condition is
+	 * fulfilled.
+	 * 
+	 * @param bot
+	 *            the SWT bot
+	 * @param button
+	 *            the button to click
+	 * @param waitCondition
+	 *            the condition to wait for, may be null
+	 * 
+	 * @throws TimeoutException
+	 */
+	public static void asyncClick(final SWTEclipseBot bot,
+			final SWTBotButton button, final ICondition waitCondition)
+			throws TimeoutException {
+		bot.waitUntil(new DefaultCondition() {
+			public boolean test() throws Exception {
+				return button.isEnabled();
+			}
+
+			public String getFailureMessage() {
+				return "Button isn't enabled.";
+			}
+		});
+
+		UIThreadRunnable.asyncExec(bot.getDisplay(), new VoidResult() {
+			public void run() {
+				button.click();
+			}
+		});
+
+		if (waitCondition != null) {
+			bot.waitUntil(waitCondition);
+		}
+	}
+
+	/**
+	 * Clicks a menu item asynchronously and waits till the given condition is
+	 * fulfilled.
+	 * 
+	 * @param bot
+	 *            the SWT bot
+	 * @param button
+	 *            the button to click
+	 * @param waitCondition
+	 *            the condition to wait for, may be null
+	 * 
+	 * @throws TimeoutException
+	 */
+	public static void asyncClick(final SWTEclipseBot bot,
+			final SWTBotMenu menu, final ICondition waitCondition)
+			throws TimeoutException {
+		UIThreadRunnable.asyncExec(bot.getDisplay(), new VoidResult() {
+			public void run() {
+				menu.click();
+			}
+		});
+
+		if (waitCondition != null) {
+			bot.waitUntil(waitCondition);
+		}
+	}
+
+	/**
+	 * Clicks a tree item asynchronously and waits till the given condition is
+	 * fulfilled.
+	 * 
+	 * @param bot
+	 *            the SWT bot
+	 * @param item
+	 *            the tree item to click
+	 * @param waitCondition
+	 *            the condition to wait for, may be null
+	 * 
+	 * @throws TimeoutException
+	 *             the timeout exception
+	 */
+	public static void asyncClick(final SWTEclipseBot bot,
+			final SWTBotTreeItem item, final ICondition waitCondition)
+			throws TimeoutException {
+		UIThreadRunnable.asyncExec(bot.getDisplay(), new VoidResult() {
+			public void run() {
+				item.click();
+			}
+		});
+
+		if (waitCondition != null) {
+			bot.waitUntil(waitCondition);
+		}
+	}
+
+	/**
+	 * Selects an entry in the browser tree and optionally expands the selected
+	 * entry. Takes care that all attributes and child entries are initialized
+	 * so that there are no pending background actions and event notifications.
+	 * This is necessary to avoid race conditions.
+	 * 
+	 * @param bot
+	 *            the SWT bot
+	 * @param tree
+	 *            the browser tree
+	 * @param expandChild
+	 *            true to expand the child entry
+	 * @param path
+	 *            the path to the entry
+	 * 
+	 * @return the selected entry as SWTBotTreeItem
+	 * 
+	 * @throws Exception
+	 *             the exception
+	 */
+	public static SWTBotTreeItem selectEntry(final SWTEclipseBot bot,
+			final SWTBotTree tree, final boolean expandChild,
+			final String... path) throws Exception {
+		List<String> pathList = new ArrayList<String>(Arrays.asList(path));
+		SWTBotTreeItem entry = null;
+
+		while (!pathList.isEmpty()) {
+			String currentPath = pathList.remove(0);
+
+			if (entry == null) {
+				entry = tree.getTreeItem(currentPath);
+			} else {
+				// adjust current path, because the label is decorated with the
+				// number of children
+				currentPath = adjustNodeName(entry, currentPath);
+				entry = entry.getNode(currentPath);
+			}
+
+			final SWTBotTreeItem tempEntry = entry;
+			UIThreadRunnable.asyncExec(bot.getDisplay(), new VoidResult() {
+				public void run() {
+					tempEntry.select();
+				}
+			});
+
+			if (!pathList.isEmpty() || expandChild) {
+				// expand entry and wait till
+				// - children are displayed
+				// - next child is visible
+				final String nextName = !pathList.isEmpty() ? pathList.get(0)
+						: null;
+				expandEntry(bot, entry, nextName);
+			}
+
+		}
+		return entry;
+	}
+
+	/**
+	 * Expands the entry. Takes care that all attributes and child entries are
+	 * initialized so that there are no pending background actions and event
+	 * notifications. This is necessary to avoid race conditions.
+	 * 
+	 * @param bot
+	 *            the bot
+	 * @param entry
+	 *            the entry to expand
+	 * @param nextName
+	 *            the name of the entry that must become visible, may be null
+	 * 
+	 * @throws Exception
+	 *             the exception
+	 */
+	public static void expandEntry(final SWTEclipseBot bot,
+			final SWTBotTreeItem entry, final String nextName) throws Exception {
+		UIThreadRunnable.asyncExec(bot.getDisplay(), new VoidResult() {
+			public void run() {
+				entry.expand();
+			}
+		});
+
+		bot.waitUntil(new DefaultCondition() {
+			public boolean test() throws Exception {
+				if (nextName != null) {
+					String adjustedNodeName = nextName != null ? adjustNodeName(
+							entry, nextName)
+							: null;
+					SWTBotTreeItem node = entry.getNode(adjustedNodeName);
+					if (node == null) {
+						return false;
+					}
+				}
+				return !entry.getNodes().contains("Fetching Entries...");
+			}
+
+			public String getFailureMessage() {
+				return "Could not find entry " + entry.getText() + " -> "
+						+ nextName;
+			}
+		});
+	}
+
+	private static String adjustNodeName(SWTBotTreeItem child, String nodeName) {
+		List<String> nodes = child.getNodes();
+		for (String node : nodes) {
+			if (node.toUpperCase().startsWith(nodeName.toUpperCase())) {
+				return node;
+			}
+		}
+		return null;
+	}
 
 }

Modified: directory/studio/trunk/test-integration-ui/src/main/java/org/apache/directory/studio/test/integration/ui/SwtResourcesTest.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/test-integration-ui/src/main/java/org/apache/directory/studio/test/integration/ui/SwtResourcesTest.java?rev=741561&r1=741560&r2=741561&view=diff
==============================================================================
--- directory/studio/trunk/test-integration-ui/src/main/java/org/apache/directory/studio/test/integration/ui/SwtResourcesTest.java (original)
+++ directory/studio/trunk/test-integration-ui/src/main/java/org/apache/directory/studio/test/integration/ui/SwtResourcesTest.java Fri Feb  6 13:21:59 2009
@@ -20,197 +20,173 @@
 
 package org.apache.directory.studio.test.integration.ui;
 
-
-import net.sf.swtbot.eclipse.finder.SWTEclipseBot;
-import net.sf.swtbot.finder.UIThreadRunnable;
-import net.sf.swtbot.finder.results.IntResult;
-import net.sf.swtbot.wait.DefaultCondition;
-import net.sf.swtbot.widgets.SWTBotCombo;
-import net.sf.swtbot.widgets.SWTBotText;
-import net.sf.swtbot.widgets.SWTBotTree;
-
 import org.apache.directory.server.unit.AbstractServerTest;
 import org.eclipse.swt.graphics.DeviceData;
-
+import org.eclipse.swtbot.eclipse.finder.SWTEclipseBot;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.results.IntResult;
+import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotCombo;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotText;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
 
 /**
  * Tests allocation of SWT Resources.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory
+ *         Project</a>
  * @version $Rev$, $Date$
  */
-public class SwtResourcesTest extends AbstractServerTest
-{
-    private SWTEclipseBot bot;
-
-
-    protected void setUp() throws Exception
-    {
-        super.setUp();
-        bot = new SWTEclipseBot();
-        SWTBotUtils.openLdapPerspective( bot );
-        SWTBotUtils.createTestConnection( bot, "SwtResourcesTest", ldapService.getPort() );
-    }
-
-
-    protected void tearDown() throws Exception
-    {
-        SWTBotUtils.deleteTestConnections();
-        bot = null;
-        super.tearDown();
-    }
-
-
-    /**
-     * Test for DIRSTUDIO-319.
-     * 
-     * Creates multiple entries using the New Entry wizard. Checks
-     * that we don't allocate too much SWT resources during the run.
-     * 
-     * @throws Exception the exception
-     */
-    public void testSwtResourcesDelta() throws Exception
-    {
-        SWTBotTree browserTree = SWTBotUtils.getLdapBrowserTree( bot );
-
-        // run the new entry wizard once to ensure all SWT resources are created
-        createAndDeleteEntry( browserTree, "testSwtResourcesDelta" + 0 );
-
-        // remember the SWT objects before the run
-        int beforeObjectCount = getSwtObjectCount();
-
-        // now lets run the new entry wizard it several times
-        for ( int i = 1; i < 25; i++ )
-        {
-            createAndDeleteEntry( browserTree, "testSwtResourcesDelta" + i );
-        }
-
-        // get the SWT objects after the run
-        int afterObjectCount = getSwtObjectCount();
-
-        // we expect not more than 10 additional SWT objects
-        assertTrue( "Too many SWT resources were allocated in testSwtResourcesDelta: before=" + beforeObjectCount
-            + ", after=" + afterObjectCount, afterObjectCount - beforeObjectCount < 10 );
-    }
-
-
-    /**
-     * Ensure that we have not allocated more the 1000 SWT resources 
-     * during the complete test suite.
-     * 
-     * 1000 is not a fix number but it is a good starting point.
-     * 
-     * @throws Exception the exception
-     */
-    public void testSwtResourcesCount() throws Exception
-    {
-        int swtObjectCount = getSwtObjectCount();
-        assertTrue( "Too many SWT resources were allocated: " + swtObjectCount, swtObjectCount < 1000 );
-    }
-
-
-    private int getSwtObjectCount()
-    {
-        return UIThreadRunnable.syncExec( bot.getDisplay(), new IntResult()
-        {
-            public Integer run()
-            {
-                DeviceData info = bot.getDisplay().getDeviceData();
-                if ( !info.tracking )
-                {
-                    fail( "To run this test options 'org.eclipse.ui/debug' and 'org.eclipse.ui/trace/graphics' must be true." );
-                }
-                return info.objects.length;
-            }
-        } );
-    }
-
-
-    private void createAndDeleteEntry( final SWTBotTree browserTree, final String name ) throws Exception
-    {
-        SWTBotUtils.selectEntry( bot, browserTree, true, "DIT", "Root DSE", "ou=system" );
-        SWTBotUtils.asyncClick( bot, browserTree.contextMenu( "New Entry..." ), new DefaultCondition()
-        {
-            public boolean test() throws Exception
-            {
-                return bot.shell( "New Entry" ) != null;
-            }
-
-
-            public String getFailureMessage()
-            {
-                return "Could not find dialog 'New Entry'";
-            }
-        } );
-
-        bot.radio( "Create entry from scratch" ).click();
-        bot.button( "Next >" ).click();
-
-        bot.table( 0 ).select( "organization" );
-        bot.button( "Add" ).click();
-        bot.button( "Next >" ).click();
-
-        SWTBotCombo typeCombo = bot.comboBox( "" );
-        typeCombo.setText( "o" );
-        SWTBotText valueText = bot.text( "" );
-        valueText.setText( name );
-        SWTBotUtils.asyncClick( bot, bot.button( "Next >" ), new DefaultCondition()
-        {
-            public boolean test() throws Exception
-            {
-                return bot.button( "Finish" ).isEnabled();
-            }
-
-
-            public String getFailureMessage()
-            {
-                return "Finish button is not enabled";
-            }
-        } );
-
-        // click finish to create the entry
-        SWTBotUtils.asyncClick( bot, bot.button( "Finish" ), new DefaultCondition()
-        {
-            public boolean test() throws Exception
-            {
-                return browserTree.selection().get( 0 ).get( 0 ).startsWith( "o=" + name );
-            }
-
-
-            public String getFailureMessage()
-            {
-                return "Could not select 'o=" + name + "'";
-            }
-        } );
-
-        // delete the entry
-        SWTBotUtils.selectEntry( bot, browserTree, false, "DIT", "Root DSE", "ou=system", "o=" + name );
-        SWTBotUtils.asyncClick( bot, browserTree.contextMenu( "Delete Entry" ), new DefaultCondition()
-        {
-            public boolean test() throws Exception
-            {
-                return bot.shell( "Delete Entry" ) != null;
-            }
-
-
-            public String getFailureMessage()
-            {
-                return "Could not find dialog 'New Entry'";
-            }
-        } );
-        SWTBotUtils.asyncClick( bot, bot.button( "OK" ), new DefaultCondition()
-        {
-            public boolean test() throws Exception
-            {
-                return browserTree.selection().get( 0 ).get( 0 ).startsWith( "ou=system" );
-            }
-
-
-            public String getFailureMessage()
-            {
-                return "Could not select 'ou=system'";
-            }
-        } );
-    }
+public class SwtResourcesTest extends AbstractServerTest {
+	private SWTEclipseBot bot;
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		bot = new SWTEclipseBot();
+		SWTBotUtils.openLdapPerspective(bot);
+		SWTBotUtils.createTestConnection(bot, "SwtResourcesTest", ldapService
+				.getPort());
+	}
+
+	protected void tearDown() throws Exception {
+		SWTBotUtils.deleteTestConnections();
+		bot = null;
+		super.tearDown();
+	}
+
+	/**
+	 * Test for DIRSTUDIO-319.
+	 * 
+	 * Creates multiple entries using the New Entry wizard. Checks that we don't
+	 * allocate too much SWT resources during the run.
+	 * 
+	 * @throws Exception
+	 *             the exception
+	 */
+	public void testSwtResourcesDelta() throws Exception {
+		SWTBotTree browserTree = SWTBotUtils.getLdapBrowserTree(bot);
+
+		// run the new entry wizard once to ensure all SWT resources are created
+		createAndDeleteEntry(browserTree, "testSwtResourcesDelta" + 0);
+
+		// remember the SWT objects before the run
+		int beforeObjectCount = getSwtObjectCount();
+
+		// now lets run the new entry wizard it several times
+		for (int i = 1; i < 25; i++) {
+			createAndDeleteEntry(browserTree, "testSwtResourcesDelta" + i);
+		}
+
+		// get the SWT objects after the run
+		int afterObjectCount = getSwtObjectCount();
+
+		// we expect not more than 10 additional SWT objects
+		assertTrue(
+				"Too many SWT resources were allocated in testSwtResourcesDelta: before="
+						+ beforeObjectCount + ", after=" + afterObjectCount,
+				afterObjectCount - beforeObjectCount < 10);
+	}
+
+	/**
+	 * Ensure that we have not allocated more the 1000 SWT resources during the
+	 * complete test suite.
+	 * 
+	 * 1000 is not a fix number but it is a good starting point.
+	 * 
+	 * @throws Exception
+	 *             the exception
+	 */
+	public void testSwtResourcesCount() throws Exception {
+		int swtObjectCount = getSwtObjectCount();
+		assertTrue("Too many SWT resources were allocated: " + swtObjectCount,
+				swtObjectCount < 1000);
+	}
+
+	private int getSwtObjectCount() {
+		return UIThreadRunnable.syncExec(bot.getDisplay(), new IntResult() {
+			public Integer run() {
+				DeviceData info = bot.getDisplay().getDeviceData();
+				if (!info.tracking) {
+					fail("To run this test options 'org.eclipse.ui/debug' and 'org.eclipse.ui/trace/graphics' must be true.");
+				}
+				return info.objects.length;
+			}
+		});
+	}
+
+	private void createAndDeleteEntry(final SWTBotTree browserTree,
+			final String name) throws Exception {
+		SWTBotUtils.selectEntry(bot, browserTree, true, "DIT", "Root DSE",
+				"ou=system");
+		SWTBotUtils.asyncClick(bot, browserTree.contextMenu("New Entry..."),
+				new DefaultCondition() {
+					public boolean test() throws Exception {
+						return bot.shell("New Entry") != null;
+					}
+
+					public String getFailureMessage() {
+						return "Could not find dialog 'New Entry'";
+					}
+				});
+
+		bot.radio("Create entry from scratch").click();
+		bot.button("Next >").click();
+
+		bot.table(0).select("organization");
+		bot.button("Add").click();
+		bot.button("Next >").click();
+
+		SWTBotCombo typeCombo = bot.comboBox("");
+		typeCombo.setText("o");
+		SWTBotText valueText = bot.text("");
+		valueText.setText(name);
+		SWTBotUtils.asyncClick(bot, bot.button("Next >"),
+				new DefaultCondition() {
+					public boolean test() throws Exception {
+						return bot.button("Finish").isEnabled();
+					}
+
+					public String getFailureMessage() {
+						return "Finish button is not enabled";
+					}
+				});
+
+		// click finish to create the entry
+		SWTBotUtils.asyncClick(bot, bot.button("Finish"),
+				new DefaultCondition() {
+					public boolean test() throws Exception {
+						return browserTree.selection().get(0).get(0)
+								.startsWith("o=" + name);
+					}
+
+					public String getFailureMessage() {
+						return "Could not select 'o=" + name + "'";
+					}
+				});
+
+		// delete the entry
+		SWTBotUtils.selectEntry(bot, browserTree, false, "DIT", "Root DSE",
+				"ou=system", "o=" + name);
+		SWTBotUtils.asyncClick(bot, browserTree.contextMenu("Delete Entry"),
+				new DefaultCondition() {
+					public boolean test() throws Exception {
+						return bot.shell("Delete Entry") != null;
+					}
+
+					public String getFailureMessage() {
+						return "Could not find dialog 'New Entry'";
+					}
+				});
+		SWTBotUtils.asyncClick(bot, bot.button("OK"), new DefaultCondition() {
+			public boolean test() throws Exception {
+				return browserTree.selection().get(0).get(0).startsWith(
+						"ou=system");
+			}
+
+			public String getFailureMessage() {
+				return "Could not select 'ou=system'";
+			}
+		});
+	}
 
 }