/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive.extended; import org.ldaptive.AbstractTest; import org.ldaptive.Connection; import org.ldaptive.LdapException; import org.ldaptive.Response; import org.ldaptive.ResultCode; import org.ldaptive.SearchEntry; import org.ldaptive.SearchRequest; import org.ldaptive.SearchResult; import org.ldaptive.TestControl; import org.ldaptive.TestUtils; import org.ldaptive.async.AsyncSearchOperation; import org.ldaptive.control.SyncRequestControl; import org.ldaptive.handler.HandlerResult; import org.ldaptive.handler.SearchEntryHandler; import org.testng.AssertJUnit; import org.testng.annotations.Parameters; import org.testng.annotations.Test; /** * Unit test for {@link CancelOperation}. * * @author Middleware Services */ public class CancelOperationTest extends AbstractTest { /** * @param dn to search on. * * @throws Exception On test failure. */ @Parameters("cancelDn") @Test(groups = {"extended"}) public void cancel(final String dn) throws Exception { // AD server returns UNAVAILABLE_CRITICAL_EXTENSION if (TestControl.isActiveDirectory()) { return; } // provider doesn't support cancel if (TestControl.isOpenDJProvider()) { throw new UnsupportedOperationException("OpenDJ does not support cancel"); } try (Connection conn = TestUtils.createConnection()) { conn.open(); final AsyncSearchOperation search = new AsyncSearchOperation(conn); // needed to perform operations inside a handler search.setUseMultiThreadedListener(true); search.setExceptionHandler( (conn1, request, exception) -> { throw new UnsupportedOperationException(exception); }); final SearchRequest request = SearchRequest.newObjectScopeSearchRequest(dn); request.setSearchEntryHandlers( new SearchEntryHandler() { @Override public HandlerResult<SearchEntry> handle( final Connection conn, final SearchRequest request, final SearchEntry entry) throws LdapException { try { final CancelOperation cancel = new CancelOperation(conn); final Response<Void> response = cancel.execute(new CancelRequest(entry.getMessageId())); AssertJUnit.assertEquals(ResultCode.SUCCESS, response.getResultCode()); return new HandlerResult<>(null); } catch (LdapException e) { return new HandlerResult<>(null, true); } } @Override public void initializeRequest(final SearchRequest request) {} }); request.setControls(new SyncRequestControl(SyncRequestControl.Mode.REFRESH_AND_PERSIST, true)); final Response<SearchResult> response = search.execute(request); AssertJUnit.assertEquals(ResultCode.CANCELED, response.getResultCode()); } catch (IllegalStateException e) { throw (Exception) e.getCause(); } } }