/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive.ssl; import org.ldaptive.Connection; import org.ldaptive.ConnectionConfig; import org.ldaptive.DefaultConnectionFactory; import org.ldaptive.Response; import org.ldaptive.SearchOperation; import org.ldaptive.SearchRequest; import org.ldaptive.SearchResult; import org.ldaptive.TestControl; import org.testng.AssertJUnit; import org.testng.annotations.Parameters; import org.testng.annotations.Test; /** * Unit test for class loader issues related to custom SSL socket factories. * * @author Middleware Services */ public class ClassLoaderTest { /** * @return ssl config * * @throws Exception On configuration error. */ public SslConfig createSslConfig() throws Exception { final X509CredentialConfig config = new X509CredentialConfig(); config.setTrustCertificates("file:target/test-classes/ldaptive.trust.crt"); return new SslConfig(config); } /** * @param host to connect to * * @throws Exception On test failure. */ @Parameters("ldapSslTestHost") @Test(groups = {"ssl"}) public void connectSSL(final String host) throws Exception { if (!TestControl.isJndiProvider()) { return; } // remove ldaptive classes from the classloader final TestClassLoader cl = new TestClassLoader(Thread.currentThread().getContextClassLoader()); Thread.currentThread().setContextClassLoader(cl); final ConnectionConfig cc = new ConnectionConfig(host); cc.setUseSSL(true); cc.setSslConfig(createSslConfig()); final Connection conn = DefaultConnectionFactory.getConnection(cc); try { conn.open(); final SearchOperation op = new SearchOperation(conn); final Response<SearchResult> response = op.execute(SearchRequest.newObjectScopeSearchRequest("")); AssertJUnit.assertFalse(response.getResult().getEntries().isEmpty()); } finally { conn.close(); } } /** * Class loader that cannot find ldaptive classes. */ public class TestClassLoader extends ClassLoader { /** * Creates a new test class loader. * * @param cl class loader delegate */ public TestClassLoader(final ClassLoader cl) { super(cl); } @Override public Class<?> loadClass(final String name) throws ClassNotFoundException { if (name.startsWith("org.ldaptive")) { throw new ClassNotFoundException("Use a different class loader for ldaptive"); } return loadClass(name, false); } } }