/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * 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 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 * * * Copyright 2013 ForgeRock AS. */ package org.forgerock.opendj.grizzly; import static org.fest.assertions.Assertions.assertThat; import static org.forgerock.opendj.ldap.TestCaseUtils.findFreeSocketAddress; import static org.mockito.Mockito.mock; import java.io.IOException; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import org.forgerock.opendj.ldap.Connection; import org.forgerock.opendj.ldap.ConnectionFactory; import org.forgerock.opendj.ldap.ErrorResultException; import org.forgerock.opendj.ldap.LDAPClientContext; import org.forgerock.opendj.ldap.LDAPConnectionFactory; import org.forgerock.opendj.ldap.LDAPListener; import org.forgerock.opendj.ldap.LDAPOptions; import org.forgerock.opendj.ldap.MockConnectionEventListener; import org.forgerock.opendj.ldap.ProviderNotFoundException; import org.forgerock.opendj.ldap.SdkTestCase; import org.forgerock.opendj.ldap.ServerConnection; import org.forgerock.opendj.ldap.ServerConnectionFactory; import org.testng.annotations.Test; /** * Tests the {@link LDAPConnectionFactory} class. */ @SuppressWarnings("javadoc") public class GrizzlyLDAPConnectionFactoryTestCase extends SdkTestCase { // Test timeout for tests which need to wait for network events. private static final long TEST_TIMEOUT = 30L; @Test public void testCreateLDAPConnectionFactory() throws Exception { // test no exception is thrown, which means transport provider is correctly loaded LDAPConnectionFactory factory = new LDAPConnectionFactory(findFreeSocketAddress()); factory.close(); } @Test public void testCreateLDAPConnectionFactoryWithCustomClassLoader() throws Exception { // test no exception is thrown, which means transport provider is correctly loaded LDAPOptions options = new LDAPOptions(). setProviderClassLoader(Thread.currentThread().getContextClassLoader()); LDAPConnectionFactory factory = new LDAPConnectionFactory(findFreeSocketAddress(), options); factory.close(); } @Test(expectedExceptions = { ProviderNotFoundException.class }, expectedExceptionsMessageRegExp = "^The requested provider 'unknown' .*") public void testCreateLDAPConnectionFactoryFailureProviderNotFound() throws Exception { LDAPOptions options = new LDAPOptions().setTransportProvider("unknown"); LDAPConnectionFactory factory = new LDAPConnectionFactory(findFreeSocketAddress(), options); factory.close(); } /** * This unit test exposes the bug raised in issue OPENDJ-1156: NPE in * ReferenceCountedObject after shutting down directory. */ @Test public void testResourceManagement() throws Exception { final AtomicReference context = new AtomicReference(); final Semaphore latch = new Semaphore(0); final LDAPListener server = createServer(latch, context); final ConnectionFactory factory = new LDAPConnectionFactory(server.getSocketAddress()); try { for (int i = 0; i < 100; i++) { // Connect to the server. final Connection connection = factory.getConnection(); try { // Wait for the server to accept the connection. assertThat(latch.tryAcquire(TEST_TIMEOUT, TimeUnit.SECONDS)).isTrue(); final MockConnectionEventListener listener = new MockConnectionEventListener(); connection.addConnectionEventListener(listener); // Perform remote disconnect which will trigger a client side connection error. context.get().disconnect(); // Wait for the error notification to reach the client. listener.awaitError(TEST_TIMEOUT, TimeUnit.SECONDS); } finally { connection.close(); } } } finally { factory.close(); server.close(); } } private LDAPListener createServer(final Semaphore latch, final AtomicReference context) throws IOException { return new LDAPListener(findFreeSocketAddress(), new ServerConnectionFactory() { @SuppressWarnings("unchecked") @Override public ServerConnection handleAccept(final LDAPClientContext clientContext) throws ErrorResultException { context.set(clientContext); latch.release(); return mock(ServerConnection.class); } }); } }