/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive.ad.control.util;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import org.ldaptive.AbstractTest;
import org.ldaptive.AttributeModification;
import org.ldaptive.AttributeModificationType;
import org.ldaptive.Connection;
import org.ldaptive.LdapAttribute;
import org.ldaptive.ModifyOperation;
import org.ldaptive.ModifyRequest;
import org.ldaptive.SearchFilter;
import org.ldaptive.SearchRequest;
import org.ldaptive.SearchScope;
import org.ldaptive.TestControl;
import org.ldaptive.TestUtils;
import org.ldaptive.async.AsyncRequest;
import org.testng.AssertJUnit;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
/**
* Unit test for {@link NotificationClient}.
*
* @author Middleware Services
*/
public class NotificationClientTest extends AbstractTest
{
/**
* @param dn to search on.
*
* @throws Exception On test failure.
*/
@Parameters("ncSearchDn")
@Test(groups = {"control-util"})
public void execute(final String dn)
throws Exception
{
if (!TestControl.isActiveDirectory()) {
return;
}
// provider doesn't support this control
if (TestControl.isApacheProvider()) {
throw new UnsupportedOperationException("Apache LDAP does not support this control");
}
final Connection conn = TestUtils.createConnection();
try {
conn.open();
final NotificationClient client = new NotificationClient(conn);
final SearchRequest request = new SearchRequest(
"ou=test,dc=middleware,dc=vt,dc=edu",
new SearchFilter("(objectClass=*)"));
request.setSearchScope(SearchScope.ONELEVEL);
final BlockingQueue<NotificationClient.NotificationItem> results = client.execute(request);
NotificationClient.NotificationItem item = results.poll(5, TimeUnit.SECONDS);
AssertJUnit.assertNotNull(item);
if (item.isException()) {
throw item.getException();
}
AssertJUnit.assertTrue(item.isAsyncRequest());
AssertJUnit.assertTrue(item.getAsyncRequest().getMessageId() > 0);
final AsyncRequest asyncRequest = item.getAsyncRequest();
final ModifyOperation modify = new ModifyOperation(conn);
modify.execute(
new ModifyRequest(
dn,
new AttributeModification(
AttributeModificationType.REPLACE,
new LdapAttribute("sn", Integer.toString(new Random().nextInt(1000000))))));
item = results.poll(5, TimeUnit.SECONDS);
AssertJUnit.assertNotNull(item);
AssertJUnit.assertTrue(item.isEntry());
AssertJUnit.assertNotNull(item.getEntry());
asyncRequest.abandon();
} finally {
final ModifyOperation modify = new ModifyOperation(conn);
modify.execute(
new ModifyRequest(
dn,
new AttributeModification(AttributeModificationType.REPLACE, new LdapAttribute("sn", "Admin"))));
conn.close();
}
}
}