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 2015/04/26 22:55:36 UTC
svn commit: r1676146 - in /directory/studio/trunk:
plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/
tests/test.integration.core/
tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integra...
Author: seelmann
Date: Sun Apr 26 20:55:36 2015
New Revision: 1676146
URL: http://svn.apache.org/r1676146
Log:
DIRSTUDIO-1039: close connection only instead of unbind before, added test for DirectoryApiConnectionWrapper
Added:
directory/studio/trunk/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/DirectoryApiConnectionWrapperTest.java
Modified:
directory/studio/trunk/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/DirectoryApiConnectionWrapper.java
directory/studio/trunk/tests/test.integration.core/pom-first.xml
Modified: directory/studio/trunk/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/DirectoryApiConnectionWrapper.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/DirectoryApiConnectionWrapper.java?rev=1676146&r1=1676145&r2=1676146&view=diff
==============================================================================
--- directory/studio/trunk/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/DirectoryApiConnectionWrapper.java (original)
+++ directory/studio/trunk/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/DirectoryApiConnectionWrapper.java Sun Apr 26 20:55:36 2015
@@ -280,11 +280,6 @@ public class DirectoryApiConnectionWrapp
{
try
{
- if ( ldapConnection.isAuthenticated() )
- {
- ldapConnection.unBind();
- }
-
ldapConnection.close();
}
catch ( Exception e )
Modified: directory/studio/trunk/tests/test.integration.core/pom-first.xml
URL: http://svn.apache.org/viewvc/directory/studio/trunk/tests/test.integration.core/pom-first.xml?rev=1676146&r1=1676145&r2=1676146&view=diff
==============================================================================
--- directory/studio/trunk/tests/test.integration.core/pom-first.xml (original)
+++ directory/studio/trunk/tests/test.integration.core/pom-first.xml Sun Apr 26 20:55:36 2015
@@ -61,6 +61,7 @@
org.apache.mina.core;bundle-version="${org.apache.mina.bundleversion}",
org.apache.directory.studio.connection.core,
org.apache.directory.studio.common.core,
+ org.apache.directory.studio.ldapbrowser.core,
org.apache.directory.studio.ldifparser,
org.eclipse.core.runtime,
org.eclipse.ui</Require-Bundle>
Added: directory/studio/trunk/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/DirectoryApiConnectionWrapperTest.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/DirectoryApiConnectionWrapperTest.java?rev=1676146&view=auto
==============================================================================
--- directory/studio/trunk/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/DirectoryApiConnectionWrapperTest.java (added)
+++ directory/studio/trunk/tests/test.integration.core/src/main/java/org/apache/directory/studio/test/integration/core/DirectoryApiConnectionWrapperTest.java Sun Apr 26 20:55:36 2015
@@ -0,0 +1,343 @@
+/*
+ * 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.core;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.net.ConnectException;
+import java.nio.channels.UnresolvedAddressException;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.naming.NamingEnumeration;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+
+import org.apache.directory.ldap.client.api.exception.InvalidConnectionException;
+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.server.core.integ.FrameworkRunner;
+import org.apache.directory.studio.common.core.jobs.StudioProgressMonitor;
+import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
+import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
+import org.apache.directory.studio.connection.core.ConnectionParameter;
+import org.apache.directory.studio.connection.core.ConnectionParameter.AuthenticationMethod;
+import org.apache.directory.studio.connection.core.ConnectionParameter.EncryptionMethod;
+import org.apache.directory.studio.connection.core.ConnectionParameter.NetworkProvider;
+import org.apache.directory.studio.connection.core.event.ConnectionEventRegistry;
+import org.apache.directory.studio.connection.core.io.ConnectionWrapper;
+import org.apache.directory.studio.connection.core.io.api.DirectoryApiConnectionWrapper;
+import org.apache.directory.studio.ldapbrowser.core.jobs.InitializeRootDSERunnable;
+import org.apache.directory.studio.ldapbrowser.core.model.impl.BrowserConnection;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+/**
+ * Tests the {@link DirectoryApiConnectionWrapper}.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+@RunWith(FrameworkRunner.class)
+@CreateLdapServer(transports =
+ { @CreateTransport(protocol = "LDAP"), @CreateTransport(protocol = "LDAPS") })
+public class DirectoryApiConnectionWrapperTest extends AbstractLdapTestUnit
+{
+
+ /**
+ * Tests connecting to the server.
+ */
+ @Test
+ public void testConnect()
+ {
+ StudioProgressMonitor monitor = getProgressMonitor();
+ ConnectionParameter connectionParameter = new ConnectionParameter( null, "localhost", ldapServer.getPort(),
+ EncryptionMethod.NONE, NetworkProvider.APACHE_DIRECTORY_LDAP_API, AuthenticationMethod.NONE, null, null,
+ null, true, null );
+ Connection connection = new Connection( connectionParameter );
+ ConnectionWrapper connectionWrapper = connection.getConnectionWrapper();
+
+ assertFalse( connectionWrapper.isConnected() );
+
+ connectionWrapper.connect( monitor );
+ assertTrue( connectionWrapper.isConnected() );
+ assertNull( monitor.getException() );
+
+ connectionWrapper.disconnect();
+ assertFalse( connectionWrapper.isConnected() );
+
+ // TODO: SSL, StartTLS
+ }
+
+
+ /**
+ * Test failed connections to the server.
+ */
+ @Test
+ public void testConnectFailures()
+ {
+ StudioProgressMonitor monitor = null;
+ ConnectionParameter connectionParameter = null;
+ Connection connection = null;
+ ConnectionWrapper connectionWrapper = null;
+
+ // invalid port
+ monitor = getProgressMonitor();
+ connectionParameter = new ConnectionParameter( null, "localhost", ldapServer.getPort() + 1,
+ EncryptionMethod.NONE, NetworkProvider.APACHE_DIRECTORY_LDAP_API, AuthenticationMethod.NONE, null, null,
+ null, true, null );
+ connection = new Connection( connectionParameter );
+ connectionWrapper = connection.getConnectionWrapper();
+ connectionWrapper.connect( monitor );
+ assertFalse( connectionWrapper.isConnected() );
+ assertNotNull( monitor.getException() );
+ assertTrue( monitor.getException() instanceof InvalidConnectionException );
+ assertNotNull( monitor.getException().getCause() );
+ assertTrue( monitor.getException().getCause() instanceof ConnectException );
+
+ // unknown host
+ monitor = getProgressMonitor();
+ connectionParameter = new ConnectionParameter( null, "555.555.555.555", ldapServer.getPort(),
+ EncryptionMethod.NONE, NetworkProvider.APACHE_DIRECTORY_LDAP_API, AuthenticationMethod.NONE, null, null,
+ null, true, null );
+ connection = new Connection( connectionParameter );
+ connectionWrapper = connection.getConnectionWrapper();
+ connectionWrapper.connect( monitor );
+ assertFalse( connectionWrapper.isConnected() );
+ assertNotNull( monitor.getException() );
+ assertTrue( monitor.getException() instanceof InvalidConnectionException );
+ assertNotNull( monitor.getException().getCause() );
+ assertTrue( monitor.getException().getCause() instanceof UnresolvedAddressException );
+
+ // TODO: SSL, StartTLS
+ }
+
+
+ /**
+ * Test binding to the server.
+ */
+ @Test
+ public void testBind()
+ {
+ StudioProgressMonitor monitor = getProgressMonitor();
+ ConnectionParameter connectionParameter = new ConnectionParameter( null, "localhost", ldapServer.getPort(),
+ EncryptionMethod.NONE, NetworkProvider.APACHE_DIRECTORY_LDAP_API, AuthenticationMethod.SIMPLE,
+ "uid=admin,ou=system", "secret", null, true, null );
+ Connection connection = new Connection( connectionParameter );
+ ConnectionWrapper connectionWrapper = connection.getConnectionWrapper();
+
+ assertFalse( connectionWrapper.isConnected() );
+
+ connectionWrapper.connect( monitor );
+ connectionWrapper.bind( monitor );
+ assertTrue( connectionWrapper.isConnected() );
+ assertNull( monitor.getException() );
+
+ connectionWrapper.unbind();
+ connectionWrapper.disconnect();
+ assertFalse( connectionWrapper.isConnected() );
+
+ }
+
+
+ /**
+ * Test failed binds to the server.
+ */
+ @Test
+ public void testBindFailures()
+ {
+ StudioProgressMonitor monitor = null;
+ ConnectionParameter connectionParameter = null;
+ Connection connection = null;
+ ConnectionWrapper connectionWrapper = null;
+
+ // simple auth without principal and credential
+ monitor = getProgressMonitor();
+ connectionParameter = new ConnectionParameter( null, "localhost", ldapServer.getPort(), EncryptionMethod.NONE,
+ NetworkProvider.APACHE_DIRECTORY_LDAP_API, AuthenticationMethod.SIMPLE, "uid=admin", "invalid", null, true,
+ null );
+ connection = new Connection( connectionParameter );
+ connectionWrapper = connection.getConnectionWrapper();
+ connectionWrapper.connect( monitor );
+ connectionWrapper.bind( monitor );
+ assertFalse( connectionWrapper.isConnected() );
+ assertNotNull( monitor.getException() );
+ assertTrue( monitor.getException() instanceof Exception );
+ assertTrue( monitor.getException().getMessage().contains( "error code 49 - INVALID_CREDENTIALS" ) );
+
+ // simple auth with invalid principal and credential
+ monitor = getProgressMonitor();
+ connectionParameter = new ConnectionParameter( null, "localhost", ldapServer.getPort(), EncryptionMethod.NONE,
+ NetworkProvider.APACHE_DIRECTORY_LDAP_API, AuthenticationMethod.SIMPLE, "uid=admin,ou=system", "bar", null,
+ true, null );
+ connection = new Connection( connectionParameter );
+ connectionWrapper = connection.getConnectionWrapper();
+ connectionWrapper.connect( monitor );
+ connectionWrapper.bind( monitor );
+ assertFalse( connectionWrapper.isConnected() );
+ assertNotNull( monitor.getException() );
+ assertTrue( monitor.getException() instanceof Exception );
+ assertTrue( monitor.getException().getMessage().contains( "error code 49 - INVALID_CREDENTIALS" ) );
+ }
+
+
+ /**
+ * Test searching.
+ */
+ @Test
+ public void testSearch()
+ {
+ StudioProgressMonitor monitor = null;
+ ConnectionParameter connectionParameter = null;
+ Connection connection = null;
+ ConnectionWrapper connectionWrapper = null;
+
+ // simple auth without principal and credential
+ monitor = getProgressMonitor();
+ connectionParameter = new ConnectionParameter( null, "localhost", ldapServer.getPort(), EncryptionMethod.NONE,
+ NetworkProvider.APACHE_DIRECTORY_LDAP_API, AuthenticationMethod.SIMPLE, "uid=admin,ou=system", "secret",
+ null, true, null );
+ connection = new Connection( connectionParameter );
+ connectionWrapper = connection.getConnectionWrapper();
+ connectionWrapper.connect( monitor );
+ connectionWrapper.bind( monitor );
+ assertTrue( connectionWrapper.isConnected() );
+ assertNull( monitor.getException() );
+
+ SearchControls searchControls = new SearchControls();
+ NamingEnumeration<SearchResult> result = connectionWrapper.search( "ou=system", "(objectClass=*)",
+ searchControls, AliasDereferencingMethod.NEVER, ReferralHandlingMethod.IGNORE, null, monitor, null );
+ assertNotNull( result );
+ }
+
+
+ /**
+ * Test initializing of Root DSE.
+ */
+ @Test
+ public void testInitializeAttributesRunnable() throws Exception
+ {
+ StudioProgressMonitor monitor = getProgressMonitor();
+ ConnectionParameter connectionParameter = new ConnectionParameter( null, "localhost", ldapServer.getPort(),
+ EncryptionMethod.NONE, NetworkProvider.APACHE_DIRECTORY_LDAP_API, AuthenticationMethod.SIMPLE,
+ "uid=admin,ou=system", "secret", null, true, null );
+ Connection connection = new Connection( connectionParameter );
+ BrowserConnection browserConnection = new BrowserConnection( connection );
+
+ assertFalse( browserConnection.getRootDSE().isAttributesInitialized() );
+
+ InitializeRootDSERunnable.loadRootDSE( browserConnection, monitor );
+
+ assertTrue( browserConnection.getRootDSE().isAttributesInitialized() );
+ }
+
+
+ /**
+ * DIRSTUDIO-1039
+ */
+ @Test
+ public void testConcurrentUseAndCloseOfConnection() throws Exception
+ {
+ final StudioProgressMonitor monitor = getProgressMonitor();
+ final ConnectionParameter connectionParameter = new ConnectionParameter( null, "localhost",
+ ldapServer.getPort(), EncryptionMethod.NONE, NetworkProvider.APACHE_DIRECTORY_LDAP_API,
+ AuthenticationMethod.SIMPLE, "uid=admin,ou=system", "secret", null, true, null );
+ final Connection connection = new Connection( connectionParameter );
+ final BrowserConnection browserConnection = new BrowserConnection( connection );
+
+ ExecutorService pool = Executors.newFixedThreadPool( 2 );
+
+ final AtomicLong closeCounter = new AtomicLong();
+ final AtomicLong useCounter = new AtomicLong();
+
+ // Thread that permanently closes the connection
+ Callable<Void> closeCallable = new Callable<Void>()
+ {
+ @Override
+ public Void call() throws Exception
+ {
+ ConnectionEventRegistry.suspendEventFiringInCurrentThread();
+
+ while ( true )
+ {
+ connection.getConnectionWrapper().unbind();
+ connection.getConnectionWrapper().disconnect();
+ closeCounter.incrementAndGet();
+ Thread.sleep( 10 );
+ }
+ }
+ };
+ Future<Void> closeFuture = pool.submit( closeCallable );
+
+ // Thread that permanently uses the connection
+ Callable<Void> useCallable = new Callable<Void>()
+ {
+ @Override
+ public Void call() throws Exception
+ {
+ for ( int i = 0; i < 10; i++ )
+ {
+ browserConnection.getRootDSE().setAttributesInitialized( false );
+ assertFalse( browserConnection.getRootDSE().isAttributesInitialized() );
+ InitializeRootDSERunnable.loadRootDSE( browserConnection, monitor );
+ assertTrue( browserConnection.getRootDSE().isAttributesInitialized() );
+ useCounter.incrementAndGet();
+ }
+ return null;
+ }
+ };
+ Future<Void> useFuture = pool.submit( useCallable );
+
+ // wait till useFuture is done
+ useFuture.get( 60, TimeUnit.SECONDS );
+
+ // assert counters,
+ assertEquals( 10, useCounter.get() );
+ assertTrue( closeCounter.get() > 10 );
+
+ // shutdown pool
+ pool.shutdownNow();
+ pool.awaitTermination( 60, TimeUnit.SECONDS );
+ assertTrue( useFuture.isDone() );
+ assertTrue( closeFuture.isDone() );
+ }
+
+
+ private StudioProgressMonitor getProgressMonitor()
+ {
+ StudioProgressMonitor monitor = new StudioProgressMonitor( new NullProgressMonitor() );
+ return monitor;
+ }
+
+}