/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive.ldapi;
import java.util.HashMap;
import java.util.Map;
import org.ldaptive.Connection;
import org.ldaptive.ConnectionConfig;
import org.ldaptive.ConnectionFactory;
import org.ldaptive.DefaultConnectionFactory;
import org.ldaptive.SearchOperation;
import org.ldaptive.SearchRequest;
import org.ldaptive.SearchResult;
import org.ldaptive.provider.jndi.JndiProvider;
import org.newsclub.net.unix.AFUNIXSocket;
import org.testng.AssertJUnit;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
/**
* Performance test for an ldap search operation over native sockets.
*
* @author Middleware Services
*/
public class PerformanceTest
{
/** LDAP host. */
private String ldapHost;
/** LDAP base dn. */
private String ldapBaseDn;
/** LDAP search filter. */
private String ldapSearchFilter;
/**
* Initialize this test.
*
* @param socketFile file system location of the unix domain socket
* @param host for comparison
* @param baseDn to search on
* @param searchFilter to execute
*/
@BeforeClass(groups = {"ldapi"})
@Parameters(
{
"ldapSocketFile",
"ldapTestHost",
"ldapBaseDn",
"ldapSearchFilter"
}
)
public void initialize(final String socketFile, final String host, final String baseDn, final String searchFilter)
{
System.setProperty(AFUnixSocketFactory.SOCKET_FILE_PROPERTY, socketFile);
ldapHost = host;
ldapBaseDn = baseDn;
ldapSearchFilter = searchFilter;
}
/**
* Test connection factories.
*
* @return test data
*
* @throws Exception on test failure
*/
@DataProvider(name = "factories")
@SuppressWarnings("unchecked")
public Object[][] connectionFactories()
throws Exception
{
//Make sure native libraries are loaded and supported for the current unix based operating system.
AssertJUnit.assertTrue(AFUNIXSocket.isSupported());
final Map<String, Object> props = new HashMap<>();
props.put(JndiProvider.SOCKET_FACTORY, "org.ldaptive.ldapi.AFUnixSocketFactory");
final DefaultConnectionFactory nativeFactory = new DefaultConnectionFactory(
new ConnectionConfig("ldap://domainsocket"));
nativeFactory.getProvider().getProviderConfig().setProperties(props);
final DefaultConnectionFactory localFactory = new DefaultConnectionFactory(new ConnectionConfig(ldapHost));
final SearchRequest request = new SearchRequest(ldapBaseDn, ldapSearchFilter);
return new Object[][] {
new Object[] {nativeFactory, request, },
new Object[] {localFactory, request, },
};
}
/**
* Searches with the supplied connection factory.
*
* @param connFactory to get connections from
* @param request to execute
*
* @throws Exception On test errors.
*/
@Test(groups = {"ldapi"}, dataProvider = "factories")
public void search(final ConnectionFactory connFactory, final SearchRequest request)
throws Exception
{
final long beforeTS = System.currentTimeMillis();
try (Connection conn = connFactory.getConnection()) {
conn.open();
for (int i = 0; i < 10000; i++) {
final SearchOperation search = new SearchOperation(conn);
final SearchResult result = search.execute(request).getResult();
result.getEntries().forEach(org.ldaptive.LdapEntry::toString);
}
}
final long afterTS = System.currentTimeMillis();
System.out.println(String.format("Total Execution Time %s ms for %s", afterTS - beforeTS, connFactory));
}
}