/** * Unit test for OPENDJ-1247: a locally timed out request which is not a bind or startTLS should * result in a client side timeout error, but the connection should remain valid. In addition, no * abandon request should be sent. */ @Test public void testClientSideTimeoutForSearchRequest() throws Exception { resetState(); registerSearchEvent(); registerAbandonEvent(); for (int i = 0; i < ITERATIONS; i++) { final Connection connection = factory.getConnection(); try { waitForConnect(); final ConnectionEventListener listener = mock(ConnectionEventListener.class); connection.addConnectionEventListener(listener); final PromiseImpl<LdapException, NeverThrowsException> promise = PromiseImpl.create(); final LdapPromise<SearchResultEntry> connectionPromise = connection.readEntryAsync(DN.valueOf("cn=test"), null); connectionPromise.onFailure(getFailureHandler(promise)); waitForSearch(); LdapException e = promise.getOrThrow(TEST_TIMEOUT, TimeUnit.SECONDS); verifyResultCodeIsClientSideTimeout(e); // Wait for the request to timeout. try { connectionPromise.getOrThrow(TEST_TIMEOUT, TimeUnit.SECONDS); fail("The search request succeeded unexpectedly"); } catch (TimeoutResultException te) { verifyResultCodeIsClientSideTimeout(te); } // The connection should still be valid. assertThat(connection.isValid()).isTrue(); verifyZeroInteractions(listener); /* * FIXME: The search should have been abandoned (see comment in * LDAPConnection for explanation). */ // waitForAbandon(); } finally { connection.close(); } } }