/* * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.security.ldap; import java.io.IOException; import java.net.ServerSocket; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.springframework.security.ldap.authentication.BindAuthenticatorTests; import org.springframework.security.ldap.authentication.PasswordComparisonAuthenticatorTests; import org.springframework.security.ldap.search.FilterBasedLdapUserSearchTests; import org.springframework.security.ldap.server.ApacheDSContainer; import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulatorTests; import org.springframework.security.ldap.userdetails.LdapUserDetailsManagerTests; /** * @author Luke Taylor */ @RunWith(Suite.class) @Suite.SuiteClasses({ BindAuthenticatorTests.class, PasswordComparisonAuthenticatorTests.class, FilterBasedLdapUserSearchTests.class, DefaultLdapAuthoritiesPopulatorTests.class, LdapUserDetailsManagerTests.class, DefaultSpringSecurityContextSourceTests.class, SpringSecurityLdapTemplateITests.class }) public final class ApacheDSServerIntegrationTests { private static ApacheDSContainer server; private static Integer serverPort; @BeforeClass public static void startServer() throws Exception { // OpenLDAP configuration // contextSource = new // DefaultSpringSecurityContextSource("ldap://127.0.0.1:22389/dc=springsource,dc=com"); // contextSource.setUserDn("cn=admin,dc=springsource,dc=com"); // contextSource.setPassword("password"); server = new ApacheDSContainer("dc=springframework,dc=org", "classpath:test-server.ldif"); int port = getAvailablePort(); server.setPort(port); server.afterPropertiesSet(); serverPort = port; } @AfterClass public static void stopServer() throws Exception { serverPort = null; if (server != null) { server.stop(); } } /** * Main class to allow server to be started from gradle script */ public static void main(String[] args) throws Exception { ApacheDSContainer server = new ApacheDSContainer("dc=springframework,dc=org", "classpath:test-server.ldif"); server.afterPropertiesSet(); } public static int getServerPort() { if (serverPort == null) { throw new IllegalStateException( "The ApacheDSContainer is not currently running"); } return serverPort; } /* * @After public final void reloadServerDataIfDirty() throws Exception { * ClassPathResource ldifs = new ClassPathResource("test-server.ldif"); * * if (!ldifs.getFile().exists()) { throw new IllegalStateException( * "Ldif file not found: " + ldifs.getFile().getAbsolutePath()); } * * DirContext ctx = getContextSource().getReadWriteContext(); * * // First of all, make sure the database is empty. Name startingPoint = new * DistinguishedName("dc=springframework,dc=org"); * * try { clearSubContexts(ctx, startingPoint); LdifFileLoader loader = new * LdifFileLoader(server.getService().getAdminSession(), * ldifs.getFile().getAbsolutePath()); loader.execute(); } finally { ctx.close(); } } * * private void clearSubContexts(DirContext ctx, Name name) throws NamingException { * * NamingEnumeration<Binding> enumeration = null; try { enumeration = * ctx.listBindings(name); while (enumeration.hasMore()) { Binding element = * enumeration.next(); DistinguishedName childName = new * DistinguishedName(element.getName()); childName.prepend((DistinguishedName) name); * * try { ctx.destroySubcontext(childName); } catch (ContextNotEmptyException e) { * clearSubContexts(ctx, childName); ctx.destroySubcontext(childName); } } } * catch(NameNotFoundException ignored) { } catch (NamingException e) { * e.printStackTrace(); } finally { try { enumeration.close(); } catch (Exception * ignored) { } } } */ private static int getAvailablePort() throws IOException { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(0); return serverSocket.getLocalPort(); } finally { if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { } } } } }