From 3d8848801b06656f425b027d16219b026bbbb2a8 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Fri, 27 Sep 2013 22:20:48 +0000
Subject: [PATCH] Fix OPENDJ-1156 - NPE in ReferenceCountedObject after shutting down directory

---
 opendj3/opendj-ldap-sdk/src/test/java/com/forgerock/opendj/ldap/ConnectionStateTest.java |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/test/java/com/forgerock/opendj/ldap/ConnectionStateTest.java b/opendj3/opendj-ldap-sdk/src/test/java/com/forgerock/opendj/ldap/ConnectionStateTest.java
index 18ef073..aa0053a 100644
--- a/opendj3/opendj-ldap-sdk/src/test/java/com/forgerock/opendj/ldap/ConnectionStateTest.java
+++ b/opendj3/opendj-ldap-sdk/src/test/java/com/forgerock/opendj/ldap/ConnectionStateTest.java
@@ -29,6 +29,7 @@
 import static org.forgerock.opendj.ldap.ErrorResultException.newErrorResult;
 import static org.forgerock.opendj.ldap.responses.Responses.newGenericExtendedResult;
 import static org.mockito.Matchers.same;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -37,6 +38,8 @@
 import org.forgerock.opendj.ldap.ErrorResultException;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.responses.ExtendedResult;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 import org.testng.annotations.Test;
 
 /**
@@ -247,4 +250,28 @@
         assertThat(state.isClosed()).isFalse();
         assertThat(state.getConnectionError()).isNull();
     }
+
+    /**
+     * Tests that reentrant close from error listener is handled.
+     */
+    @Test
+    public void testReentrantClose() {
+        final ConnectionState state = new ConnectionState();
+        final ConnectionEventListener listener1 = mock(ConnectionEventListener.class);
+        doAnswer(new Answer<Void>() {
+            public Void answer(InvocationOnMock invocation) {
+                state.notifyConnectionClosed();
+                return null;
+            }
+        }).when(listener1).handleConnectionError(false, ERROR);
+
+        state.addConnectionEventListener(listener1);
+        state.notifyConnectionError(false, ERROR);
+
+        assertThat(state.isValid()).isFalse();
+        assertThat(state.isClosed()).isTrue();
+        assertThat(state.getConnectionError()).isSameAs(ERROR);
+        verify(listener1).handleConnectionError(false, ERROR);
+        verify(listener1).handleConnectionClosed();
+    }
 }

--
Gitblit v1.10.0