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 2021/02/06 15:09:52 UTC

[directory-studio] branch master updated: Cleanup save/load of connections and folders, add connection view tests

This is an automated email from the ASF dual-hosted git repository.

seelmann pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/directory-studio.git


The following commit(s) were added to refs/heads/master by this push:
     new 020b4a0  Cleanup save/load of connections and folders, add connection view tests
020b4a0 is described below

commit 020b4a00090b3ec088f29e9aea9c21b1cf7e673c
Author: Stefan Seelmann <ma...@stefan-seelmann.de>
AuthorDate: Sat Feb 6 16:09:19 2021 +0100

    Cleanup save/load of connections and folders, add connection view tests
---
 .../connection/core/ConnectionFolderManager.java   |  47 ++---
 .../studio/connection/core/ConnectionManager.java  |  41 ++--
 .../test/integration/ui/ApacheDSPluginTest.java    |   8 +-
 .../test/integration/ui/ConnectionViewTest.java    | 221 +++++++++++++++++++++
 .../integration/ui/NewConnectionWizardTest.java    |   2 +-
 .../test/integration/ui/PreferencesTest.java       |   6 +-
 .../test/integration/ui/SchemaBrowserTest.java     |   2 +-
 .../studio/test/integration/ui/SearchTest.java     |   4 +-
 .../integration/ui/bots/ConnectionsViewBot.java    |  87 ++++++--
 .../test/integration/ui/bots/DeleteDialogBot.java  |   4 +
 .../ui/bots/ExportConnectionsWizardBot.java        |  36 ++++
 .../ui/bots/ImportConnectionsWizardBot.java        |  36 ++++
 .../ui/bots/NewConnectionFolderDialogBot.java      |  36 ++++
 13 files changed, 447 insertions(+), 83 deletions(-)

diff --git a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/ConnectionFolderManager.java b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/ConnectionFolderManager.java
index 84f4216..942ebad 100644
--- a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/ConnectionFolderManager.java
+++ b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/ConnectionFolderManager.java
@@ -23,7 +23,6 @@ package org.apache.directory.studio.connection.core;
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -35,7 +34,8 @@ import org.apache.directory.api.util.FileUtils;
 import org.apache.directory.studio.connection.core.event.ConnectionEventRegistry;
 import org.apache.directory.studio.connection.core.event.ConnectionUpdateListener;
 import org.apache.directory.studio.connection.core.io.ConnectionIO;
-import org.apache.directory.studio.connection.core.io.ConnectionIOException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
 
 
 /**
@@ -365,21 +365,23 @@ public class ConnectionFolderManager implements ConnectionUpdateListener
      */
     private synchronized void saveConnectionFolders()
     {
+        File file = new File( getConnectionFolderStoreFileName() );
+        File tempFile = new File( getConnectionFolderStoreFileName() + ConnectionManager.TEMP_SUFFIX );
+
         // To avoid a corrupt file, save object to a temp file first 
-        try
+        try ( FileOutputStream fileOutputStream = new FileOutputStream( tempFile ) )
         {
-            ConnectionIO.saveConnectionFolders( folderList, new FileOutputStream( getConnectionFolderStoreFileName()
-                + ConnectionManager.TEMP_SUFFIX ) );
+            ConnectionIO.saveConnectionFolders( folderList, fileOutputStream );
         }
         catch ( IOException e )
         {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
+            Status status = new Status( IStatus.ERROR, ConnectionCoreConstants.PLUGIN_ID,
+                Messages.error__saving_connections + e.getMessage(), e );
+            ConnectionCorePlugin.getDefault().getLog().log( status );
+            return;
         }
 
         // move temp file to good file
-        File file = new File( getConnectionFolderStoreFileName() );
-        File tempFile = new File( getConnectionFolderStoreFileName() + ConnectionManager.TEMP_SUFFIX );
         if ( file.exists() )
         {
             file.delete();
@@ -392,8 +394,10 @@ public class ConnectionFolderManager implements ConnectionUpdateListener
         }
         catch ( IOException e )
         {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
+            Status status = new Status( IStatus.ERROR, ConnectionCoreConstants.PLUGIN_ID,
+                Messages.error__saving_connections + e.getMessage(), e );
+            ConnectionCorePlugin.getDefault().getLog().log( status );
+            return;
         }
     }
 
@@ -405,26 +409,15 @@ public class ConnectionFolderManager implements ConnectionUpdateListener
     {
         ConnectionEventRegistry.suspendEventFiringInCurrentThread();
 
-        try
+        try ( FileInputStream fileInputStream = new FileInputStream( getConnectionFolderStoreFileName() ) )
         {
-            folderList = ConnectionIO.loadConnectionFolders( new FileInputStream( getConnectionFolderStoreFileName() ) );
+            folderList = ConnectionIO.loadConnectionFolders( fileInputStream );
         }
         catch ( Exception e )
         {
-            // If loading failed, try with temp file
-            try
-            {
-                folderList = ConnectionIO.loadConnectionFolders( new FileInputStream(
-                    getConnectionFolderStoreFileName() + ConnectionManager.TEMP_SUFFIX ) );
-            }
-            catch ( FileNotFoundException e1 )
-            {
-                // TODO Auto-generated catch block
-            }
-            catch ( ConnectionIOException e1 )
-            {
-                // TODO Auto-generated catch block
-            }
+            Status status = new Status( IStatus.ERROR, ConnectionCoreConstants.PLUGIN_ID,
+                Messages.error__saving_connections + e.getMessage(), e );
+            ConnectionCorePlugin.getDefault().getLog().log( status );
         }
 
         if ( !folderList.isEmpty() )
diff --git a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/ConnectionManager.java b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/ConnectionManager.java
index af28362..a1fddb1 100644
--- a/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/ConnectionManager.java
+++ b/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/ConnectionManager.java
@@ -23,7 +23,6 @@ package org.apache.directory.studio.connection.core;
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.HashSet;
@@ -33,7 +32,6 @@ import org.apache.directory.api.util.FileUtils;
 import org.apache.directory.studio.connection.core.event.ConnectionEventRegistry;
 import org.apache.directory.studio.connection.core.event.ConnectionUpdateListener;
 import org.apache.directory.studio.connection.core.io.ConnectionIO;
-import org.apache.directory.studio.connection.core.io.ConnectionIOException;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtensionPoint;
@@ -360,29 +358,29 @@ public class ConnectionManager implements ConnectionUpdateListener
     public synchronized void saveConnections()
     {
         Set<ConnectionParameter> connectionParameters = new HashSet<>();
-        
+
         for ( Connection connection : connectionList )
         {
             connectionParameters.add( connection.getConnectionParameter() );
         }
 
+        File file = new File( getConnectionStoreFileName() );
+        File tempFile = new File( getConnectionStoreFileName() + TEMP_SUFFIX );
+
         // To avoid a corrupt file, save object to a temp file first 
-        try
+        try ( FileOutputStream fileOutputStream = new FileOutputStream( tempFile ) )
         {
-            ConnectionIO
-                .save( connectionParameters, new FileOutputStream( getConnectionStoreFileName() + TEMP_SUFFIX ) );
+            ConnectionIO.save( connectionParameters, fileOutputStream );
         }
         catch ( IOException e )
         {
             Status status = new Status( IStatus.ERROR, ConnectionCoreConstants.PLUGIN_ID,
                 Messages.error__saving_connections + e.getMessage(), e );
             ConnectionCorePlugin.getDefault().getLog().log( status );
+            return;
         }
 
         // move temp file to good file
-        File file = new File( getConnectionStoreFileName() );
-        File tempFile = new File( getConnectionStoreFileName() + TEMP_SUFFIX );
-        
         if ( file.exists() )
         {
             file.delete();
@@ -398,6 +396,7 @@ public class ConnectionManager implements ConnectionUpdateListener
             Status status = new Status( IStatus.ERROR, ConnectionCoreConstants.PLUGIN_ID,
                 Messages.error__saving_connections + e.getMessage(), e );
             ConnectionCorePlugin.getDefault().getLog().log( status );
+            return;
         }
     }
 
@@ -409,29 +408,15 @@ public class ConnectionManager implements ConnectionUpdateListener
     {
         Set<ConnectionParameter> connectionParameters = null;
 
-        try
+        try ( FileInputStream fileInputStream = new FileInputStream( getConnectionStoreFileName() ) )
         {
-            connectionParameters = ConnectionIO.load( new FileInputStream( getConnectionStoreFileName() ) );
+            connectionParameters = ConnectionIO.load( fileInputStream );
         }
         catch ( Exception e )
         {
-            // If loading failed, try with temp file
-            try
-            {
-                connectionParameters = ConnectionIO.load( new FileInputStream( getConnectionStoreFileName()
-                    + TEMP_SUFFIX ) );
-            }
-            catch ( FileNotFoundException e1 )
-            {
-                // ignore, this is a fresh workspace
-                return;
-            }
-            catch ( ConnectionIOException e1 )
-            {
-                Status status = new Status( IStatus.ERROR, ConnectionCoreConstants.PLUGIN_ID,
-                    Messages.error__loading_connections + e.getMessage(), e );
-                ConnectionCorePlugin.getDefault().getLog().log( status );
-            }
+            Status status = new Status( IStatus.ERROR, ConnectionCoreConstants.PLUGIN_ID,
+                Messages.error__loading_connections + e.getMessage(), e );
+            ConnectionCorePlugin.getDefault().getLog().log( status );
         }
 
         if ( connectionParameters != null )
diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/ApacheDSPluginTest.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/ApacheDSPluginTest.java
index e6c30c6..019199e 100644
--- a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/ApacheDSPluginTest.java
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/ApacheDSPluginTest.java
@@ -124,7 +124,7 @@ public class ApacheDSPluginTest
         assertEquals( 1, getBrowserConnectionsCount() );
 
         // Opening the connection
-        connectionsViewBot.selectConnection( serverName );
+        connectionsViewBot.select( serverName );
         connectionsViewBot.openSelectedConnection();
 
         // Getting the associated connection object
@@ -134,7 +134,7 @@ public class ApacheDSPluginTest
         assertTrue( connection.getConnectionWrapper().isConnected() );
 
         // Closing the connection
-        connectionsViewBot.selectConnection( serverName );
+        connectionsViewBot.select( serverName );
         connectionsViewBot.closeSelectedConnections();
 
         // Checking if the connection is closed
@@ -350,7 +350,7 @@ public class ApacheDSPluginTest
         connectionFromServerDialogBot.clickOkButton();
 
         // Open the connection
-        connectionsViewBot.selectConnection( serverName );
+        connectionsViewBot.select( serverName );
         connectionsViewBot.openSelectedConnection();
 
         // Open the config editor and load remote config
@@ -389,7 +389,7 @@ public class ApacheDSPluginTest
         localEditorBot.close();
 
         // Close the connection
-        connectionsViewBot.selectConnection( serverName );
+        connectionsViewBot.select( serverName );
         connectionsViewBot.closeSelectedConnections();
 
         // Delete the connection
diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/ConnectionViewTest.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/ConnectionViewTest.java
new file mode 100644
index 0000000..4464267
--- /dev/null
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/ConnectionViewTest.java
@@ -0,0 +1,221 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+
+package org.apache.directory.studio.test.integration.ui;
+
+
+import static org.apache.directory.studio.test.integration.ui.Constants.LOCALHOST;
+import static org.junit.Assert.assertEquals;
+
+import java.net.URL;
+
+import org.apache.directory.server.annotations.CreateLdapServer;
+import org.apache.directory.server.annotations.CreateTransport;
+import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
+import org.apache.directory.studio.test.integration.ui.bots.ConnectionsViewBot;
+import org.apache.directory.studio.test.integration.ui.bots.ExportConnectionsWizardBot;
+import org.apache.directory.studio.test.integration.ui.bots.ImportConnectionsWizardBot;
+import org.apache.directory.studio.test.integration.ui.bots.NewConnectionFolderDialogBot;
+import org.apache.directory.studio.test.integration.ui.bots.NewConnectionWizardBot;
+import org.apache.directory.studio.test.integration.ui.bots.StudioBot;
+import org.apache.directory.studio.test.integration.ui.bots.utils.Assertions;
+import org.apache.directory.studio.test.integration.ui.bots.utils.FrameworkRunnerWithScreenshotCaptureListener;
+import org.eclipse.core.runtime.Platform;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+/**
+ * Tests the LDAP browser.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+@RunWith(FrameworkRunnerWithScreenshotCaptureListener.class)
+@CreateLdapServer(transports =
+    { @CreateTransport(protocol = "LDAP") })
+public class ConnectionViewTest extends AbstractLdapTestUnit
+{
+    private StudioBot studioBot;
+    private ConnectionsViewBot connectionsViewBot;
+
+    @Before
+    public void setUp() throws Exception
+    {
+        studioBot = new StudioBot();
+        studioBot.resetLdapPerspective();
+        connectionsViewBot = studioBot.getConnectionView();
+    }
+
+
+    @After
+    public void tearDown() throws Exception
+    {
+        connectionsViewBot.deleteTestConnections();
+        Assertions.genericTearDownAssertions();
+    }
+
+
+    @Test
+    public void testCreateAndDeleteConnections()
+    {
+        String connectionName = "Test connection 1";
+        createConnection( connectionName );
+
+        // ensure connection is visible in Connections view
+        assertEquals( 1, connectionsViewBot.getCount() );
+
+        // delete connection
+        connectionsViewBot.select( connectionName );
+        connectionsViewBot.openDeleteConnectionDialog().clickOkButton();
+
+        // ensure connection is no longer visible in Connections view
+        assertEquals( 0, connectionsViewBot.getCount() );
+    }
+
+
+    @Test
+    public void testCreateAndDeleteConnectionFolders()
+    {
+        String folderName = "Connection folder 1";
+        String subFolder1Name = "Connection folder 2";
+        String subFolder2Name = "Connection folder 3";
+
+        // create one folder
+        createConnectionFolder( folderName );
+
+        // ensure folder is visible
+        assertEquals( 1, connectionsViewBot.getCount() );
+
+        // create two sub folders
+        connectionsViewBot.select( folderName );
+        createConnectionFolder( subFolder1Name );
+        connectionsViewBot.select( folderName );
+        createConnectionFolder( subFolder2Name );
+
+        // ensure connection folders are visible
+        assertEquals( 3, connectionsViewBot.getCount() );
+
+        // delete one sub folder
+        connectionsViewBot.select( folderName, subFolder1Name );
+        connectionsViewBot.openDeleteConnectionFolderDialog().clickOkButton();
+
+        // ensure connection folders are visible
+        assertEquals( 2, connectionsViewBot.getCount() );
+
+        // delete connection folder
+        connectionsViewBot.select( folderName );
+        connectionsViewBot.openDeleteConnectionFolderDialog().clickOkButton();
+
+        // ensure folders no longer exist
+        assertEquals( 0, connectionsViewBot.getCount() );
+    }
+
+
+    @Test
+    public void testExportImportConnections() throws Exception
+    {
+        String connection1Name = "Test connection 1";
+        String connection2Name = "Test connection 2";
+        String connection3Name = "Test connection 3";
+        String folderName = "Connection folder 1";
+        String subFolder1Name = "Connection folder 2";
+        String subFolder2Name = "Connection folder 3";
+
+        // create connections and folders
+        createConnection( connection1Name );
+        createConnectionFolder( folderName );
+        connectionsViewBot.select( folderName );
+        createConnection( connection2Name );
+        connectionsViewBot.select( folderName );
+        createConnectionFolder( subFolder1Name );
+        connectionsViewBot.select( folderName, subFolder1Name );
+        createConnection( connection3Name );
+        connectionsViewBot.select( folderName );
+        createConnectionFolder( subFolder2Name );
+
+        // verify connections and folders exist
+        assertEquals( 6, connectionsViewBot.getCount() );
+        connectionsViewBot.select( folderName );
+        connectionsViewBot.select( folderName, subFolder1Name );
+        connectionsViewBot.select( folderName, subFolder2Name );
+        connectionsViewBot.select( connection1Name );
+        connectionsViewBot.select( folderName, connection2Name );
+        connectionsViewBot.select( folderName, subFolder1Name, connection3Name );
+
+        // export connections and folders
+        URL url = Platform.getInstanceLocation().getURL();
+        final String file = url.getFile() + "ImportExportConnections.zip";
+        ExportConnectionsWizardBot exportConnectionsWizardBot = connectionsViewBot.openExportConnectionsWizard();
+        exportConnectionsWizardBot.typeFile( file );
+        exportConnectionsWizardBot.clickFinishButton();
+
+        // delete connections and folders
+        connectionsViewBot.deleteTestConnections();
+        assertEquals( 0, connectionsViewBot.getCount() );
+
+        // import connections and folders
+        ImportConnectionsWizardBot importConnectionsWizardBot = connectionsViewBot.openImportConnectionsWizard();
+        importConnectionsWizardBot.typeFile( file );
+        importConnectionsWizardBot.clickFinishButton();
+
+        // verify connections and folders exist
+        assertEquals( 6, connectionsViewBot.getCount() );
+        connectionsViewBot.select( folderName );
+        connectionsViewBot.select( folderName, subFolder1Name );
+        connectionsViewBot.select( folderName, subFolder2Name );
+        connectionsViewBot.select( connection1Name );
+        connectionsViewBot.select( folderName, connection2Name );
+        connectionsViewBot.select( folderName, subFolder1Name, connection3Name );
+    }
+
+
+    private void createConnection( String connectionName )
+    {
+        NewConnectionWizardBot wizardBot = connectionsViewBot.openNewConnectionWizard();
+
+        // enter connection parameter
+        wizardBot.typeConnectionName( connectionName );
+        wizardBot.typeHost( LOCALHOST );
+        wizardBot.typePort( ldapServer.getPort() );
+
+        // jump to auth page
+        wizardBot.clickNextButton();
+
+        // enter authentication parameters
+        wizardBot.typeUser( "uid=admin,ou=system" );
+        wizardBot.typePassword( "secret" );
+
+        // finish dialog
+        wizardBot.clickFinishButton( true );
+        // connectionsViewBot.waitForConnection( connectionName );
+    }
+
+
+    private void createConnectionFolder( String folderName )
+    {
+        NewConnectionFolderDialogBot newConnectionFolderDialog = connectionsViewBot.openNewConnectionFolderDialog();
+        newConnectionFolderDialog.setConnectionFoldername( folderName );
+        newConnectionFolderDialog.clickOkButton();
+    }
+
+}
diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/NewConnectionWizardTest.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/NewConnectionWizardTest.java
index cb31bee..b99ba39 100644
--- a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/NewConnectionWizardTest.java
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/NewConnectionWizardTest.java
@@ -357,7 +357,7 @@ public class NewConnectionWizardTest extends AbstractLdapTestUnit
         assertEquals( "secret", connection.getBindPassword() );
 
         // ensure connection is visible in Connections view
-        assertEquals( 1, connectionsViewBot.getConnectionCount() );
+        assertEquals( 1, connectionsViewBot.getCount() );
 
         // close connection
         connectionsViewBot.closeSelectedConnections();
diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/PreferencesTest.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/PreferencesTest.java
index 2059293..cf6c224 100644
--- a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/PreferencesTest.java
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/PreferencesTest.java
@@ -233,7 +233,7 @@ public class PreferencesTest extends AbstractLdapTestUnit
         assertTrue( passwordsKeyStoreManager.isLoaded() );
 
         // verify connection can be opened because keystore is already loaded
-        connectionsViewBot.selectConnection( connection.getName() );
+        connectionsViewBot.select( connection.getName() );
         connectionsViewBot.openSelectedConnection();
         connectionsViewBot.closeSelectedConnections();
 
@@ -242,7 +242,7 @@ public class PreferencesTest extends AbstractLdapTestUnit
         assertFalse( passwordsKeyStoreManager.isLoaded() );
 
         // verify master password prompt when opening the connection
-        connectionsViewBot.selectConnection( connection.getName() );
+        connectionsViewBot.select( connection.getName() );
         connectionsViewBot.openSelectedConnectionExpectingVerifyMasterPasswordDialog( "secret12" );
         connectionsViewBot.closeSelectedConnections();
 
@@ -264,7 +264,7 @@ public class PreferencesTest extends AbstractLdapTestUnit
         assertFalse( passwordsKeyStoreManager.isLoaded() );
 
         // verify connection can be opened and connections password was kept
-        connectionsViewBot.selectConnection( connection.getName() );
+        connectionsViewBot.select( connection.getName() );
         connectionsViewBot.openSelectedConnection();
         connectionsViewBot.closeSelectedConnections();
     }
diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/SchemaBrowserTest.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/SchemaBrowserTest.java
index d6064a1..2a9aea6 100644
--- a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/SchemaBrowserTest.java
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/SchemaBrowserTest.java
@@ -79,7 +79,7 @@ public class SchemaBrowserTest extends AbstractLdapTestUnit
     @Test
     public void testRawSchemaDefinitionIsFilled() throws Exception
     {
-        connectionsViewBot.selectConnection( connection.getName() );
+        connectionsViewBot.select( connection.getName() );
         SchemaBrowserBot schemaBrowser = connectionsViewBot.openSchemaBrowser();
         //schemaBrowser.activateObjectClassesTab();
         schemaBrowser.selectObjectClass( "account" );
diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/SearchTest.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/SearchTest.java
index 68ff60f..aa908e0 100644
--- a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/SearchTest.java
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/SearchTest.java
@@ -112,7 +112,7 @@ public class SearchTest extends AbstractLdapTestUnit
         assertEquals( 0, browserConnection2.getSearchManager().getSearches().size() );
 
         // create a search for in connection 1
-        connectionsViewBot.selectConnection( connection1.getName() );
+        connectionsViewBot.select( connection1.getName() );
         browserViewBot.selectEntry( "DIT", "Root DSE", "ou=system" );
         SearchDialogBot dialogBot = browserViewBot.openSearchDialog();
         assertTrue( dialogBot.isVisible() );
@@ -129,7 +129,7 @@ public class SearchTest extends AbstractLdapTestUnit
 
         // copy/paste the created search from connection 1 to connection 2
         browserViewBot.copy();
-        connectionsViewBot.selectConnection( connection2.getName() );
+        connectionsViewBot.select( connection2.getName() );
         browserViewBot.selectEntry( "Searches" );
         SearchPropertiesDialogBot searchPropertiesDialogBot = browserViewBot.pasteSearch();
         assertTrue( searchPropertiesDialogBot.isVisible() );
diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/ConnectionsViewBot.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/ConnectionsViewBot.java
index 92687cc..1a7b2c9 100644
--- a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/ConnectionsViewBot.java
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/ConnectionsViewBot.java
@@ -22,6 +22,10 @@ package org.apache.directory.studio.test.integration.ui.bots;
 
 import static org.apache.directory.studio.test.integration.ui.Constants.LOCALHOST;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 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,10 +60,10 @@ public class ConnectionsViewBot
     }
 
 
-    public SchemaBrowserBot openSchemaBrowser()
+    public NewConnectionFolderDialogBot openNewConnectionFolderDialog()
     {
-        ContextMenuHelper.clickContextMenu( getConnectionsTree(), "Open Schema Browser" );
-        return new SchemaBrowserBot();
+        ContextMenuHelper.clickContextMenu( getConnectionsTree(), "New Connection Folder..." );
+        return new NewConnectionFolderDialogBot();
     }
 
 
@@ -101,13 +105,62 @@ public class ConnectionsViewBot
     }
 
 
-    public void selectConnection( String connectionName )
+    public SchemaBrowserBot openSchemaBrowser()
+    {
+        ContextMenuHelper.clickContextMenu( getConnectionsTree(), "Open Schema Browser" );
+        return new SchemaBrowserBot();
+    }
+
+
+    public DeleteDialogBot openDeleteConnectionDialog()
+    {
+        getConnectionsTree().contextMenu( "Delete Connection" ).click();
+        return new DeleteDialogBot( DeleteDialogBot.DELETE_CONNECTION );
+    }
+
+
+    public DeleteDialogBot openDeleteConnectionFolderDialog()
+    {
+        getConnectionsTree().contextMenu( DeleteDialogBot.DELETE_CONNECTION_FOLDER ).click();
+        return new DeleteDialogBot( DeleteDialogBot.DELETE_CONNECTION_FOLDER );
+    }
+
+
+    public ExportConnectionsWizardBot openExportConnectionsWizard()
+    {
+        getConnectionsTree().contextMenu( "Export" ).contextMenu( "Export Connections..." ).click();
+        return new ExportConnectionsWizardBot();
+    }
+
+
+    public ImportConnectionsWizardBot openImportConnectionsWizard()
     {
-        getConnectionsTree().select( connectionName );
+        getConnectionsTree().contextMenu( "Import" ).contextMenu( "Import Connections..." ).click();
+        return new ImportConnectionsWizardBot();
     }
 
 
-    public String getSelectedConnection()
+    public ApacheDSConfigurationEditorBot openApacheDSConfiguration()
+    {
+        getConnectionsTree().contextMenu( "Open Configuration" ).click();
+        String title = getSelection() + " - Configuration";
+        return new ApacheDSConfigurationEditorBot( title );
+    }
+
+
+    public void select( String... path )
+    {
+        List<String> pathList = new ArrayList<String>( Arrays.asList( path ) );
+        SWTBotTreeItem item = getConnectionsTree().getTreeItem( pathList.remove( 0 ) );
+        while ( !pathList.isEmpty() )
+        {
+            item = item.getNode( pathList.remove( 0 ) );
+        }
+        item.select();
+    }
+
+
+    public String getSelection()
     {
         TableCollection selection = getConnectionsTree().selection();
         if ( selection != null && selection.rowCount() == 1 )
@@ -119,9 +172,9 @@ public class ConnectionsViewBot
     }
 
 
-    public int getConnectionCount()
+    public int getCount()
     {
-        return getConnectionsTree().rowCount();
+        return getConnectionsTree().visibleRowCount();
     }
 
 
@@ -177,7 +230,8 @@ public class ConnectionsViewBot
     }
 
 
-    public Connection createTestConnection( String name, String host, int port, String bindDn, String bindPassword ) throws Exception
+    public Connection createTestConnection( String name, String host, int port, String bindDn, String bindPassword )
+        throws Exception
     {
         name = name + "_" + System.currentTimeMillis();
 
@@ -198,7 +252,7 @@ public class ConnectionsViewBot
         ConnectionFolder rootConnectionFolder = connectionFolderManager.getRootConnectionFolder();
         rootConnectionFolder.addConnectionId( connection.getId() );
 
-        selectConnection( name );
+        select( name );
         StudioConnectionJob job = new StudioConnectionJob( new OpenConnectionsRunnable( connection ) );
         job.execute();
         job.join();
@@ -217,14 +271,13 @@ public class ConnectionsViewBot
         {
             connectionManager.removeConnection( connection );
         }
-    }
-
 
-    public ApacheDSConfigurationEditorBot openApacheDSConfiguration()
-    {
-        getConnectionsTree().contextMenu( "Open Configuration" ).click();
-        String title = getSelectedConnection() + " - Configuration";
-        return new ApacheDSConfigurationEditorBot( title );
+        ConnectionFolderManager connectionFolderManager = ConnectionCorePlugin.getDefault()
+            .getConnectionFolderManager();
+        for ( ConnectionFolder connectionFolder : connectionFolderManager.getConnectionFolders() )
+        {
+            connectionFolderManager.removeConnectionFolder( connectionFolder );
+        }
     }
 
 }
diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/DeleteDialogBot.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/DeleteDialogBot.java
index 722f875..6c6cdc2 100644
--- a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/DeleteDialogBot.java
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/DeleteDialogBot.java
@@ -26,6 +26,8 @@ import org.apache.directory.studio.test.integration.ui.bots.utils.JobWatcher;
 
 public class DeleteDialogBot extends DialogBot
 {
+    public static final String DELETE_CONNECTION = "Delete Connection";
+    public static final String DELETE_CONNECTION_FOLDER = "Delete Connection Folder";
     public static final String DELETE_ENTRY_TITLE = "Delete Entry";
     public static final String DELETE_ENTRIES_TITLE = "Delete Entries";
     public static final String DELETE_VALUE_TITLE = "Delete Value";
@@ -61,6 +63,8 @@ public class DeleteDialogBot extends DialogBot
         {
             case DELETE_VALUE_TITLE:
                 return BrowserCoreMessages.jobs__execute_ldif_name;
+            case DELETE_CONNECTION:
+            case DELETE_CONNECTION_FOLDER:
             case DELETE_PROJECT:
                 return null;
             default:
diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/ExportConnectionsWizardBot.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/ExportConnectionsWizardBot.java
new file mode 100644
index 0000000..2a329e5
--- /dev/null
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/ExportConnectionsWizardBot.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.studio.test.integration.ui.bots;
+
+
+public class ExportConnectionsWizardBot extends WizardBot
+{
+    public ExportConnectionsWizardBot()
+    {
+        super( "Connections Export" );
+    }
+
+
+    public void typeFile( String file )
+    {
+        bot.comboBox().setText( file );
+    }
+
+}
diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/ImportConnectionsWizardBot.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/ImportConnectionsWizardBot.java
new file mode 100644
index 0000000..7f0f6da
--- /dev/null
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/ImportConnectionsWizardBot.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.studio.test.integration.ui.bots;
+
+
+public class ImportConnectionsWizardBot extends WizardBot
+{
+    public ImportConnectionsWizardBot()
+    {
+        super( "Connections Import" );
+    }
+
+
+    public void typeFile( String file )
+    {
+        bot.comboBox().setText( file );
+    }
+
+}
diff --git a/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/NewConnectionFolderDialogBot.java b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/NewConnectionFolderDialogBot.java
new file mode 100644
index 0000000..29c00f4
--- /dev/null
+++ b/tests/test.integration.ui/src/main/java/org/apache/directory/studio/test/integration/ui/bots/NewConnectionFolderDialogBot.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.studio.test.integration.ui.bots;
+
+public class NewConnectionFolderDialogBot extends DialogBot
+{
+
+    public NewConnectionFolderDialogBot()
+    {
+        super( "New Connection Folder" );
+    }
+
+
+    public void setConnectionFoldername( String name )
+    {
+        bot.text().setText( name );
+    }
+
+}