From 263d085885df024dca9250cc03c807912b0a7662 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 24 Apr 2012 22:33:21 +0000
Subject: [PATCH] Reformat to comply with new Checkstyle rules.
---
opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/ConnectionFactoryTestCase.java | 785 ++++++++++++++++++++++++++------------------------------
1 files changed, 364 insertions(+), 421 deletions(-)
diff --git a/opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/ConnectionFactoryTestCase.java b/opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/ConnectionFactoryTestCase.java
index aeb42b3..180889c 100644
--- a/opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/ConnectionFactoryTestCase.java
+++ b/opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/ConnectionFactoryTestCase.java
@@ -6,17 +6,16 @@
* (the "License"). You may not use this file except in compliance
* with the License.
*
- * You can obtain a copy of the license at
- * trunk/opendj3/legal-notices/CDDLv1_0.txt
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
* or http://forgerock.org/license/CDDLv1.0.html.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at
- * trunk/opendj3/legal-notices/CDDLv1_0.txt. If applicable,
- * add the following below this CDDL HEADER, with the fields enclosed
- * by brackets "[]" replaced with your own identifying information:
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
@@ -28,14 +27,13 @@
package org.forgerock.opendj.ldap;
-
-
import static org.fest.assertions.Assertions.assertThat;
-
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
-import static org.mockito.Matchers.*;
-import static org.mockito.Mockito.*;
import java.net.InetSocketAddress;
import java.util.Arrays;
@@ -62,430 +60,375 @@
import com.forgerock.opendj.util.CompletedFutureResult;
import com.forgerock.opendj.util.StaticUtils;
-
-
/**
* Tests the {@code ConnectionFactory} classes.
*/
@SuppressWarnings("javadoc")
-public class ConnectionFactoryTestCase extends SdkTestCase
-{
- class MyResultHandler implements ResultHandler<Connection>
- {
- // latch.
- private final CountDownLatch latch;
- // invalid flag.
- private volatile ErrorResultException error;
+public class ConnectionFactoryTestCase extends SdkTestCase {
+ class MyResultHandler implements ResultHandler<Connection> {
+ // latch.
+ private final CountDownLatch latch;
+ // invalid flag.
+ private volatile ErrorResultException error;
+ MyResultHandler(final CountDownLatch latch) {
+ this.latch = latch;
+ }
+ public void handleErrorResult(final ErrorResultException error) {
+ // came here.
+ this.error = error;
+ latch.countDown();
+ }
- MyResultHandler(final CountDownLatch latch)
- {
- this.latch = latch;
+ public void handleResult(final Connection con) {
+ //
+ latch.countDown();
+ }
}
-
-
- public void handleErrorResult(final ErrorResultException error)
- {
- // came here.
- this.error = error;
- latch.countDown();
+ /**
+ * Ensures that the LDAP Server is running.
+ *
+ * @throws Exception
+ * If an unexpected problem occurs.
+ */
+ @BeforeClass()
+ public void startServer() throws Exception {
+ TestCaseUtils.startServer();
}
-
-
- public void handleResult(final Connection con)
- {
- //
- latch.countDown();
- }
- }
-
-
-
- /**
- * Ensures that the LDAP Server is running.
- *
- * @throws Exception
- * If an unexpected problem occurs.
- */
- @BeforeClass()
- public void startServer() throws Exception
- {
- TestCaseUtils.startServer();
- }
-
-
-
- /**
- * Disables logging before the tests.
- */
- @BeforeClass()
- public void disableLogging()
- {
- StaticUtils.DEBUG_LOG.setLevel(Level.SEVERE);
- }
-
-
-
- /**
- * Re-enable logging after the tests.
- */
- @AfterClass()
- public void enableLogging()
- {
- StaticUtils.DEBUG_LOG.setLevel(Level.INFO);
- }
-
-
-
- @DataProvider(name = "connectionFactories")
- public Object[][] getConnectionFactories() throws Exception
- {
- Object[][] factories = new Object[21][1];
-
- // HeartBeatConnectionFactory
- // Use custom search request.
- SearchRequest request = Requests.newSearchRequest(
- "uid=user.0,ou=people,o=test", SearchScope.BASE_OBJECT,
- "objectclass=*", "cn");
-
- factories[0][0] = new HeartBeatConnectionFactory(new LDAPConnectionFactory(
- "localhost", TestCaseUtils.getLdapPort()), 1000, TimeUnit.MILLISECONDS,
- request);
-
- // InternalConnectionFactory
- factories[1][0] = Connections.newInternalConnectionFactory(
- LDAPServer.getInstance(), null);
-
- // AuthenticatedConnectionFactory
- factories[2][0] = new AuthenticatedConnectionFactory(
- new LDAPConnectionFactory("localhost", TestCaseUtils.getLdapPort()),
- Requests.newSimpleBindRequest("", new char[0]));
-
- // AuthenticatedConnectionFactory with multi-stage SASL
- factories[3][0] = new AuthenticatedConnectionFactory(
- new LDAPConnectionFactory("localhost", TestCaseUtils.getLdapPort()),
- Requests.newCRAMMD5SASLBindRequest("id:user", "password".toCharArray()));
-
- // LDAPConnectionFactory with default options
- factories[4][0] = new LDAPConnectionFactory("localhost",
- TestCaseUtils.getLdapPort());
-
- // LDAPConnectionFactory with startTLS
- SSLContext sslContext = new SSLContextBuilder().setTrustManager(
- TrustManagers.trustAll()).getSSLContext();
- LDAPOptions options = new LDAPOptions()
- .setSSLContext(sslContext)
- .setUseStartTLS(true)
- .addEnabledCipherSuite(
- new String[] { "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA",
- "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5",
- "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA",
- "SSL_DH_anon_WITH_DES_CBC_SHA", "SSL_DH_anon_WITH_RC4_128_MD5",
- "TLS_DH_anon_WITH_AES_128_CBC_SHA",
- "TLS_DH_anon_WITH_AES_256_CBC_SHA" });
- factories[5][0] = new LDAPConnectionFactory("localhost",
- TestCaseUtils.getLdapPort(), options);
-
- // startTLS + SASL confidentiality
- // Use IP address here so that DIGEST-MD5 host verification works if local
- // host name is not localhost (e.g. on some machines it might be
- // localhost.localdomain).
- factories[6][0] = new AuthenticatedConnectionFactory(
- new LDAPConnectionFactory(new InetSocketAddress("127.0.0.1",
- TestCaseUtils.getLdapPort()), options), Requests
- .newDigestMD5SASLBindRequest("id:user", "password".toCharArray())
- .addQOP(DigestMD5SASLBindRequest.QOP_AUTH_CONF)
- .setCipher(DigestMD5SASLBindRequest.CIPHER_LOW));
-
- // Connection pool and load balancing tests.
- ConnectionFactory offlineServer1 = Connections.newNamedConnectionFactory(
- new LDAPConnectionFactory("localhost", TestCaseUtils.findFreePort()),
- "offline1");
- ConnectionFactory offlineServer2 = Connections.newNamedConnectionFactory(
- new LDAPConnectionFactory("localhost", TestCaseUtils.findFreePort()),
- "offline2");
- ConnectionFactory onlineServer = Connections.newNamedConnectionFactory(
- new LDAPConnectionFactory("localhost", TestCaseUtils.getLdapPort()),
- "online");
-
- // Connection pools.
- factories[7][0] = Connections.newFixedConnectionPool(onlineServer, 10);
-
- // Round robin.
- factories[8][0] = Connections
- .newLoadBalancer(new RoundRobinLoadBalancingAlgorithm(Arrays.asList(
- onlineServer, offlineServer1)));
- factories[9][0] = factories[8][0];
- factories[10][0] = factories[8][0];
- factories[11][0] = Connections
- .newLoadBalancer(new RoundRobinLoadBalancingAlgorithm(Arrays.asList(
- offlineServer1, onlineServer)));
- factories[12][0] = Connections
- .newLoadBalancer(new RoundRobinLoadBalancingAlgorithm(Arrays.asList(
- offlineServer1, offlineServer2, onlineServer)));
- factories[13][0] = Connections
- .newLoadBalancer(new RoundRobinLoadBalancingAlgorithm(Arrays
- .<ConnectionFactory> asList(
- Connections.newFixedConnectionPool(offlineServer1, 10),
- Connections.newFixedConnectionPool(onlineServer, 10))));
-
- // Fail-over.
- factories[14][0] = Connections
- .newLoadBalancer(new FailoverLoadBalancingAlgorithm(Arrays.asList(
- onlineServer, offlineServer1)));
- factories[15][0] = factories[14][0];
- factories[16][0] = factories[14][0];
- factories[17][0] = Connections
- .newLoadBalancer(new FailoverLoadBalancingAlgorithm(Arrays.asList(
- offlineServer1, onlineServer)));
- factories[18][0] = Connections
- .newLoadBalancer(new FailoverLoadBalancingAlgorithm(Arrays.asList(
- offlineServer1, offlineServer2, onlineServer)));
- factories[19][0] = Connections
- .newLoadBalancer(new FailoverLoadBalancingAlgorithm(Arrays
- .<ConnectionFactory> asList(
- Connections.newFixedConnectionPool(offlineServer1, 10),
- Connections.newFixedConnectionPool(onlineServer, 10))));
-
- factories[20][0] = Connections.newFixedConnectionPool(onlineServer, 10);
-
- return factories;
- }
-
-
-
- /**
- * Tests the async connection in the blocking mode. This is not fully async as
- * it blocks on the future.
- *
- * @throws Exception
- */
- @Test(dataProvider = "connectionFactories")
- public void testBlockingFutureNoHandler(ConnectionFactory factory)
- throws Exception
- {
- final FutureResult<Connection> future = factory.getConnectionAsync(null);
- final Connection con = future.get();
- // quickly check if it is a valid connection.
- // Don't use a result handler.
- assertNotNull(con.readEntryAsync(DN.rootDN(), null, null).get());
- con.close();
- }
-
-
-
- /**
- * Tests the non-blocking fully async connection using a handler.
- *
- * @throws Exception
- */
- @Test(dataProvider = "connectionFactories")
- public void testNonBlockingFutureWithHandler(ConnectionFactory factory)
- throws Exception
- {
- // Use the handler to get the result asynchronously.
- final CountDownLatch latch = new CountDownLatch(1);
- final MyResultHandler handler = new MyResultHandler(latch);
- factory.getConnectionAsync(handler);
-
- // Since we don't have anything to do, we would rather
- // be notified by the latch when the other thread calls our handler.
- latch.await(); // should do a timed wait rather?
- if (handler.error != null)
- {
- throw handler.error;
- }
- }
-
-
-
- /**
- * Tests the synchronous connection.
- *
- * @throws Exception
- */
- @Test(dataProvider = "connectionFactories")
- public void testSynchronousConnection(ConnectionFactory factory)
- throws Exception
- {
- final Connection con = factory.getConnection();
- assertNotNull(con);
- // quickly check if it is a valid connection.
- assertTrue(con.readEntry("").getName().isRootDN());
- con.close();
- }
-
-
-
- /**
- * Verifies that LDAP connections take into consideration changes to the
- * default schema post creation. See OPENDJ-159.
- * <p>
- * This test is disabled because it cannot be run in parallel with rest of the
- * test suite, because it modifies the global default schema.
- *
- * @throws Exception
- * If an unexpected error occurred.
- */
- @Test(enabled = false)
- public void testSchemaUsage() throws Exception
- {
- // Create a connection factory: this should always use the default schema,
- // even if it is updated.
- final ConnectionFactory factory = new LDAPConnectionFactory("localhost",
- TestCaseUtils.getLdapPort());
- final Schema defaultSchema = Schema.getDefaultSchema();
-
- final Connection connection = factory.getConnection();
- try
- {
- // Simulate a client which reads the schema from the server and then
- // sets it as the application default. We then want subsequent
- // operations to use this schema, not the original default.
- final SchemaBuilder builder = new SchemaBuilder(Schema.getCoreSchema());
- builder.addAttributeType(
- "( 0.9.2342.19200300.100.1.3 NAME 'mail' EQUALITY "
- + "caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch "
- + "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )", false);
- final Schema testSchema = builder.toSchema().asNonStrictSchema();
- assertThat(testSchema.getWarnings()).isEmpty();
- Schema.setDefaultSchema(testSchema);
-
- // Read an entry containing the mail attribute.
- final SearchResultEntry e = connection
- .readEntry("uid=user.0,ou=people,o=test");
-
- assertThat(e.getAttribute("mail")).isNotNull();
- assertThat(
- e.getAttribute(AttributeDescription.valueOf("mail", testSchema)))
- .isNotNull();
- }
- finally
- {
- // Restore original schema.
- Schema.setDefaultSchema(defaultSchema);
-
- // Close connection.
- connection.close();
- }
- }
-
-
-
- /**
- * Tests connection pool closure.
- *
- * @throws Exception
- * If an unexpected exception occurred.
- */
- @SuppressWarnings("unchecked")
- @Test
- public void testConnectionPoolClose() throws Exception
- {
- // We'll use a pool of 4 connections.
- final int SIZE = 4;
-
- // Count number of real connections which are open.
- final AtomicInteger realConnectionCount = new AtomicInteger();
- final boolean[] realConnectionIsClosed = new boolean[SIZE];
- Arrays.fill(realConnectionIsClosed, true);
-
- // Mock underlying connection factory which always succeeds.
- final ConnectionFactory mockFactory = mock(ConnectionFactory.class);
- when(mockFactory.getConnectionAsync(any(ResultHandler.class))).thenAnswer(
- new Answer<FutureResult<Connection>>()
- {
-
- public FutureResult<Connection> answer(InvocationOnMock invocation)
- throws Throwable
- {
- // Update state.
- final int connectionID = realConnectionCount.getAndIncrement();
- realConnectionIsClosed[connectionID] = false;
-
- // Mock connection decrements counter on close.
- Connection mockConnection = mock(Connection.class);
- doAnswer(new Answer<Void>()
- {
- public Void answer(InvocationOnMock invocation) throws Throwable
- {
- realConnectionCount.decrementAndGet();
- realConnectionIsClosed[connectionID] = true;
- return null;
- }
- }).when(mockConnection).close();
- when(mockConnection.isValid()).thenReturn(true);
- when(mockConnection.toString()).thenReturn(
- "Mock connection " + connectionID);
-
- // Execute handler and return future.
- ResultHandler<? super Connection> handler = (ResultHandler<? super Connection>) invocation
- .getArguments()[0];
- if (handler != null)
- {
- handler.handleResult(mockConnection);
- }
- return new CompletedFutureResult<Connection>(mockConnection);
- }
- });
-
- ConnectionPool pool = Connections.newFixedConnectionPool(mockFactory, SIZE);
- Connection[] pooledConnections = new Connection[SIZE];
- for (int i = 0; i < SIZE; i++)
- {
- pooledConnections[i] = pool.getConnection();
+ /**
+ * Disables logging before the tests.
+ */
+ @BeforeClass()
+ public void disableLogging() {
+ StaticUtils.DEBUG_LOG.setLevel(Level.SEVERE);
}
- // Pool is fully utilized.
- assertThat(realConnectionCount.get()).isEqualTo(SIZE);
- assertThat(pooledConnections[0].isClosed()).isFalse();
- assertThat(pooledConnections[1].isClosed()).isFalse();
- assertThat(pooledConnections[2].isClosed()).isFalse();
- assertThat(pooledConnections[3].isClosed()).isFalse();
- assertThat(realConnectionIsClosed[0]).isFalse();
- assertThat(realConnectionIsClosed[1]).isFalse();
- assertThat(realConnectionIsClosed[2]).isFalse();
- assertThat(realConnectionIsClosed[3]).isFalse();
+ /**
+ * Re-enable logging after the tests.
+ */
+ @AfterClass()
+ public void enableLogging() {
+ StaticUtils.DEBUG_LOG.setLevel(Level.INFO);
+ }
- // Release two connections.
- pooledConnections[0].close();
- pooledConnections[1].close();
- assertThat(realConnectionCount.get()).isEqualTo(4);
- assertThat(pooledConnections[0].isClosed()).isTrue();
- assertThat(pooledConnections[1].isClosed()).isTrue();
- assertThat(pooledConnections[2].isClosed()).isFalse();
- assertThat(pooledConnections[3].isClosed()).isFalse();
- assertThat(realConnectionIsClosed[0]).isFalse();
- assertThat(realConnectionIsClosed[1]).isFalse();
- assertThat(realConnectionIsClosed[2]).isFalse();
- assertThat(realConnectionIsClosed[3]).isFalse();
+ @DataProvider(name = "connectionFactories")
+ public Object[][] getConnectionFactories() throws Exception {
+ Object[][] factories = new Object[21][1];
- // Close the pool closing the two connections immediately.
- pool.close();
- assertThat(realConnectionCount.get()).isEqualTo(2);
- assertThat(pooledConnections[0].isClosed()).isTrue();
- assertThat(pooledConnections[1].isClosed()).isTrue();
- assertThat(pooledConnections[2].isClosed()).isFalse();
- assertThat(pooledConnections[3].isClosed()).isFalse();
- assertThat(realConnectionIsClosed[0]).isTrue();
- assertThat(realConnectionIsClosed[1]).isTrue();
- assertThat(realConnectionIsClosed[2]).isFalse();
- assertThat(realConnectionIsClosed[3]).isFalse();
+ // HeartBeatConnectionFactory
+ // Use custom search request.
+ SearchRequest request =
+ Requests.newSearchRequest("uid=user.0,ou=people,o=test", SearchScope.BASE_OBJECT,
+ "objectclass=*", "cn");
- // Release two remaining connections and check that they get closed.
- pooledConnections[2].close();
- pooledConnections[3].close();
- assertThat(realConnectionCount.get()).isEqualTo(0);
- assertThat(pooledConnections[0].isClosed()).isTrue();
- assertThat(pooledConnections[1].isClosed()).isTrue();
- assertThat(pooledConnections[2].isClosed()).isTrue();
- assertThat(pooledConnections[3].isClosed()).isTrue();
- assertThat(realConnectionIsClosed[0]).isTrue();
- assertThat(realConnectionIsClosed[1]).isTrue();
- assertThat(realConnectionIsClosed[2]).isTrue();
- assertThat(realConnectionIsClosed[3]).isTrue();
- }
+ factories[0][0] =
+ new HeartBeatConnectionFactory(new LDAPConnectionFactory("localhost", TestCaseUtils
+ .getLdapPort()), 1000, TimeUnit.MILLISECONDS, request);
+
+ // InternalConnectionFactory
+ factories[1][0] = Connections.newInternalConnectionFactory(LDAPServer.getInstance(), null);
+
+ // AuthenticatedConnectionFactory
+ factories[2][0] =
+ new AuthenticatedConnectionFactory(new LDAPConnectionFactory("localhost",
+ TestCaseUtils.getLdapPort()), Requests
+ .newSimpleBindRequest("", new char[0]));
+
+ // AuthenticatedConnectionFactory with multi-stage SASL
+ factories[3][0] =
+ new AuthenticatedConnectionFactory(new LDAPConnectionFactory("localhost",
+ TestCaseUtils.getLdapPort()), Requests.newCRAMMD5SASLBindRequest("id:user",
+ "password".toCharArray()));
+
+ // LDAPConnectionFactory with default options
+ factories[4][0] = new LDAPConnectionFactory("localhost", TestCaseUtils.getLdapPort());
+
+ // LDAPConnectionFactory with startTLS
+ SSLContext sslContext =
+ new SSLContextBuilder().setTrustManager(TrustManagers.trustAll()).getSSLContext();
+ LDAPOptions options =
+ new LDAPOptions().setSSLContext(sslContext).setUseStartTLS(true)
+ .addEnabledCipherSuite(
+ new String[] { "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA",
+ "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5",
+ "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA",
+ "SSL_DH_anon_WITH_DES_CBC_SHA", "SSL_DH_anon_WITH_RC4_128_MD5",
+ "TLS_DH_anon_WITH_AES_128_CBC_SHA",
+ "TLS_DH_anon_WITH_AES_256_CBC_SHA" });
+ factories[5][0] =
+ new LDAPConnectionFactory("localhost", TestCaseUtils.getLdapPort(), options);
+
+ // startTLS + SASL confidentiality
+ // Use IP address here so that DIGEST-MD5 host verification works if
+ // local
+ // host name is not localhost (e.g. on some machines it might be
+ // localhost.localdomain).
+ factories[6][0] =
+ new AuthenticatedConnectionFactory(new LDAPConnectionFactory(new InetSocketAddress(
+ "127.0.0.1", TestCaseUtils.getLdapPort()), options), Requests
+ .newDigestMD5SASLBindRequest("id:user", "password".toCharArray()).addQOP(
+ DigestMD5SASLBindRequest.QOP_AUTH_CONF).setCipher(
+ DigestMD5SASLBindRequest.CIPHER_LOW));
+
+ // Connection pool and load balancing tests.
+ ConnectionFactory offlineServer1 =
+ Connections.newNamedConnectionFactory(new LDAPConnectionFactory("localhost",
+ TestCaseUtils.findFreePort()), "offline1");
+ ConnectionFactory offlineServer2 =
+ Connections.newNamedConnectionFactory(new LDAPConnectionFactory("localhost",
+ TestCaseUtils.findFreePort()), "offline2");
+ ConnectionFactory onlineServer =
+ Connections.newNamedConnectionFactory(new LDAPConnectionFactory("localhost",
+ TestCaseUtils.getLdapPort()), "online");
+
+ // Connection pools.
+ factories[7][0] = Connections.newFixedConnectionPool(onlineServer, 10);
+
+ // Round robin.
+ factories[8][0] =
+ Connections.newLoadBalancer(new RoundRobinLoadBalancingAlgorithm(Arrays.asList(
+ onlineServer, offlineServer1)));
+ factories[9][0] = factories[8][0];
+ factories[10][0] = factories[8][0];
+ factories[11][0] =
+ Connections.newLoadBalancer(new RoundRobinLoadBalancingAlgorithm(Arrays.asList(
+ offlineServer1, onlineServer)));
+ factories[12][0] =
+ Connections.newLoadBalancer(new RoundRobinLoadBalancingAlgorithm(Arrays.asList(
+ offlineServer1, offlineServer2, onlineServer)));
+ factories[13][0] =
+ Connections.newLoadBalancer(new RoundRobinLoadBalancingAlgorithm(Arrays
+ .<ConnectionFactory> asList(Connections.newFixedConnectionPool(
+ offlineServer1, 10), Connections.newFixedConnectionPool(
+ onlineServer, 10))));
+
+ // Fail-over.
+ factories[14][0] =
+ Connections.newLoadBalancer(new FailoverLoadBalancingAlgorithm(Arrays.asList(
+ onlineServer, offlineServer1)));
+ factories[15][0] = factories[14][0];
+ factories[16][0] = factories[14][0];
+ factories[17][0] =
+ Connections.newLoadBalancer(new FailoverLoadBalancingAlgorithm(Arrays.asList(
+ offlineServer1, onlineServer)));
+ factories[18][0] =
+ Connections.newLoadBalancer(new FailoverLoadBalancingAlgorithm(Arrays.asList(
+ offlineServer1, offlineServer2, onlineServer)));
+ factories[19][0] =
+ Connections.newLoadBalancer(new FailoverLoadBalancingAlgorithm(Arrays
+ .<ConnectionFactory> asList(Connections.newFixedConnectionPool(
+ offlineServer1, 10), Connections.newFixedConnectionPool(
+ onlineServer, 10))));
+
+ factories[20][0] = Connections.newFixedConnectionPool(onlineServer, 10);
+
+ return factories;
+ }
+
+ /**
+ * Tests the async connection in the blocking mode. This is not fully async
+ * as it blocks on the future.
+ *
+ * @throws Exception
+ */
+ @Test(dataProvider = "connectionFactories")
+ public void testBlockingFutureNoHandler(ConnectionFactory factory) throws Exception {
+ final FutureResult<Connection> future = factory.getConnectionAsync(null);
+ final Connection con = future.get();
+ // quickly check if it is a valid connection.
+ // Don't use a result handler.
+ assertNotNull(con.readEntryAsync(DN.rootDN(), null, null).get());
+ con.close();
+ }
+
+ /**
+ * Tests the non-blocking fully async connection using a handler.
+ *
+ * @throws Exception
+ */
+ @Test(dataProvider = "connectionFactories")
+ public void testNonBlockingFutureWithHandler(ConnectionFactory factory) throws Exception {
+ // Use the handler to get the result asynchronously.
+ final CountDownLatch latch = new CountDownLatch(1);
+ final MyResultHandler handler = new MyResultHandler(latch);
+ factory.getConnectionAsync(handler);
+
+ // Since we don't have anything to do, we would rather
+ // be notified by the latch when the other thread calls our handler.
+ latch.await(); // should do a timed wait rather?
+ if (handler.error != null) {
+ throw handler.error;
+ }
+ }
+
+ /**
+ * Tests the synchronous connection.
+ *
+ * @throws Exception
+ */
+ @Test(dataProvider = "connectionFactories")
+ public void testSynchronousConnection(ConnectionFactory factory) throws Exception {
+ final Connection con = factory.getConnection();
+ assertNotNull(con);
+ // quickly check if it is a valid connection.
+ assertTrue(con.readEntry("").getName().isRootDN());
+ con.close();
+ }
+
+ /**
+ * Verifies that LDAP connections take into consideration changes to the
+ * default schema post creation. See OPENDJ-159.
+ * <p>
+ * This test is disabled because it cannot be run in parallel with rest of
+ * the test suite, because it modifies the global default schema.
+ *
+ * @throws Exception
+ * If an unexpected error occurred.
+ */
+ @Test(enabled = false)
+ public void testSchemaUsage() throws Exception {
+ // Create a connection factory: this should always use the default
+ // schema,
+ // even if it is updated.
+ final ConnectionFactory factory =
+ new LDAPConnectionFactory("localhost", TestCaseUtils.getLdapPort());
+ final Schema defaultSchema = Schema.getDefaultSchema();
+
+ final Connection connection = factory.getConnection();
+ try {
+ // Simulate a client which reads the schema from the server and then
+ // sets it as the application default. We then want subsequent
+ // operations to use this schema, not the original default.
+ final SchemaBuilder builder = new SchemaBuilder(Schema.getCoreSchema());
+ builder.addAttributeType("( 0.9.2342.19200300.100.1.3 NAME 'mail' EQUALITY "
+ + "caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch "
+ + "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )", false);
+ final Schema testSchema = builder.toSchema().asNonStrictSchema();
+ assertThat(testSchema.getWarnings()).isEmpty();
+ Schema.setDefaultSchema(testSchema);
+
+ // Read an entry containing the mail attribute.
+ final SearchResultEntry e = connection.readEntry("uid=user.0,ou=people,o=test");
+
+ assertThat(e.getAttribute("mail")).isNotNull();
+ assertThat(e.getAttribute(AttributeDescription.valueOf("mail", testSchema)))
+ .isNotNull();
+ } finally {
+ // Restore original schema.
+ Schema.setDefaultSchema(defaultSchema);
+
+ // Close connection.
+ connection.close();
+ }
+ }
+
+ /**
+ * Tests connection pool closure.
+ *
+ * @throws Exception
+ * If an unexpected exception occurred.
+ */
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testConnectionPoolClose() throws Exception {
+ // We'll use a pool of 4 connections.
+ final int size = 4;
+
+ // Count number of real connections which are open.
+ final AtomicInteger realConnectionCount = new AtomicInteger();
+ final boolean[] realConnectionIsClosed = new boolean[size];
+ Arrays.fill(realConnectionIsClosed, true);
+
+ // Mock underlying connection factory which always succeeds.
+ final ConnectionFactory mockFactory = mock(ConnectionFactory.class);
+ when(mockFactory.getConnectionAsync(any(ResultHandler.class))).thenAnswer(
+ new Answer<FutureResult<Connection>>() {
+
+ public FutureResult<Connection> answer(InvocationOnMock invocation)
+ throws Throwable {
+ // Update state.
+ final int connectionID = realConnectionCount.getAndIncrement();
+ realConnectionIsClosed[connectionID] = false;
+
+ // Mock connection decrements counter on close.
+ Connection mockConnection = mock(Connection.class);
+ doAnswer(new Answer<Void>() {
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ realConnectionCount.decrementAndGet();
+ realConnectionIsClosed[connectionID] = true;
+ return null;
+ }
+ }).when(mockConnection).close();
+ when(mockConnection.isValid()).thenReturn(true);
+ when(mockConnection.toString()).thenReturn(
+ "Mock connection " + connectionID);
+
+ // Execute handler and return future.
+ ResultHandler<? super Connection> handler =
+ (ResultHandler<? super Connection>) invocation.getArguments()[0];
+ if (handler != null) {
+ handler.handleResult(mockConnection);
+ }
+ return new CompletedFutureResult<Connection>(mockConnection);
+ }
+ });
+
+ ConnectionPool pool = Connections.newFixedConnectionPool(mockFactory, size);
+ Connection[] pooledConnections = new Connection[size];
+ for (int i = 0; i < size; i++) {
+ pooledConnections[i] = pool.getConnection();
+ }
+
+ // Pool is fully utilized.
+ assertThat(realConnectionCount.get()).isEqualTo(size);
+ assertThat(pooledConnections[0].isClosed()).isFalse();
+ assertThat(pooledConnections[1].isClosed()).isFalse();
+ assertThat(pooledConnections[2].isClosed()).isFalse();
+ assertThat(pooledConnections[3].isClosed()).isFalse();
+ assertThat(realConnectionIsClosed[0]).isFalse();
+ assertThat(realConnectionIsClosed[1]).isFalse();
+ assertThat(realConnectionIsClosed[2]).isFalse();
+ assertThat(realConnectionIsClosed[3]).isFalse();
+
+ // Release two connections.
+ pooledConnections[0].close();
+ pooledConnections[1].close();
+ assertThat(realConnectionCount.get()).isEqualTo(4);
+ assertThat(pooledConnections[0].isClosed()).isTrue();
+ assertThat(pooledConnections[1].isClosed()).isTrue();
+ assertThat(pooledConnections[2].isClosed()).isFalse();
+ assertThat(pooledConnections[3].isClosed()).isFalse();
+ assertThat(realConnectionIsClosed[0]).isFalse();
+ assertThat(realConnectionIsClosed[1]).isFalse();
+ assertThat(realConnectionIsClosed[2]).isFalse();
+ assertThat(realConnectionIsClosed[3]).isFalse();
+
+ // Close the pool closing the two connections immediately.
+ pool.close();
+ assertThat(realConnectionCount.get()).isEqualTo(2);
+ assertThat(pooledConnections[0].isClosed()).isTrue();
+ assertThat(pooledConnections[1].isClosed()).isTrue();
+ assertThat(pooledConnections[2].isClosed()).isFalse();
+ assertThat(pooledConnections[3].isClosed()).isFalse();
+ assertThat(realConnectionIsClosed[0]).isTrue();
+ assertThat(realConnectionIsClosed[1]).isTrue();
+ assertThat(realConnectionIsClosed[2]).isFalse();
+ assertThat(realConnectionIsClosed[3]).isFalse();
+
+ // Release two remaining connections and check that they get closed.
+ pooledConnections[2].close();
+ pooledConnections[3].close();
+ assertThat(realConnectionCount.get()).isEqualTo(0);
+ assertThat(pooledConnections[0].isClosed()).isTrue();
+ assertThat(pooledConnections[1].isClosed()).isTrue();
+ assertThat(pooledConnections[2].isClosed()).isTrue();
+ assertThat(pooledConnections[3].isClosed()).isTrue();
+ assertThat(realConnectionIsClosed[0]).isTrue();
+ assertThat(realConnectionIsClosed[1]).isTrue();
+ assertThat(realConnectionIsClosed[2]).isTrue();
+ assertThat(realConnectionIsClosed[3]).isTrue();
+ }
}
--
Gitblit v1.10.0