configurationCustomizer) {
+ this.configurationCustomizer = configurationCustomizer;
+ return this;
+ }
+
+ /**
+ * Sets the partition name for the embedded LDAP server.
+ * @param partitionName the partition name for the embedded LDAP server. Defaults
+ * to the left most element of the partition suffix.
+ * @return this {@link Builder} instance.
+ */
+ public Builder partitionName(String partitionName) {
+ this.partitionName = partitionName;
+ return this;
+ }
+
+ /**
+ * Builds and returns a {@link EmbeddedLdapServer}.
+ *
+ * In order to start the server, you should call
+ * {@link EmbeddedLdapServer#start()}.
+ * @return a new {@link EmbeddedLdapServer}.
+ */
+ public EmbeddedLdapServer build() {
+ try {
+ InMemoryDirectoryServerConfig config = inMemoryDirectoryServerConfig(this.partitionSuffix, this.port);
+ this.configurationCustomizer.accept(config);
+
+ Entry entry = ldapEntry(this.partitionName, this.partitionSuffix);
+ InMemoryDirectoryServer directoryServer = inMemoryDirectoryServer(config, entry);
+ return new EmbeddedLdapServer(directoryServer);
+ }
+ catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ static String leftMostElement(String partitionSuffix) {
+ try {
+ List rdns = new LdapName(partitionSuffix).getRdns();
+ return CollectionUtils.lastElement(rdns).getValue().toString();
+ }
+ catch (InvalidNameException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ private static InMemoryDirectoryServerConfig inMemoryDirectoryServerConfig(String partitionSuffix, int port)
+ throws LDAPException {
+ InMemoryDirectoryServerConfig config = new InMemoryDirectoryServerConfig(partitionSuffix);
+ config.addAdditionalBindCredentials("uid=admin,ou=system", "secret");
+ config.setListenerConfigs(InMemoryListenerConfig.createLDAPConfig("LDAP", port));
+ config.setEnforceSingleStructuralObjectClass(false);
+ config.setEnforceAttributeSyntaxCompliance(true);
+ return config;
+ }
+
+ private static Entry ldapEntry(String defaultPartitionName, String defaultPartitionSuffix)
+ throws LDAPException {
+ Entry entry = new Entry(new DN(defaultPartitionSuffix));
+ entry.addAttribute("objectClass", "top", "domain", "extensibleObject");
+ entry.addAttribute("dc", defaultPartitionName);
+ return entry;
+ }
+
+ private static InMemoryDirectoryServer inMemoryDirectoryServer(InMemoryDirectoryServerConfig config,
+ Entry entry) throws LDAPException {
+ InMemoryDirectoryServer directoryServer = new InMemoryDirectoryServer(config);
+ directoryServer.add(entry);
+ return directoryServer;
+ }
+
+ }
+
}
diff --git a/test-support/src/main/java/org/springframework/ldap/test/unboundid/EmbeddedLdapServerFactoryBean.java b/test-support/src/main/java/org/springframework/ldap/test/unboundid/EmbeddedLdapServerFactoryBean.java
index 360a6867..1db35095 100644
--- a/test-support/src/main/java/org/springframework/ldap/test/unboundid/EmbeddedLdapServerFactoryBean.java
+++ b/test-support/src/main/java/org/springframework/ldap/test/unboundid/EmbeddedLdapServerFactoryBean.java
@@ -48,7 +48,13 @@ public class EmbeddedLdapServerFactoryBean extends AbstractFactoryBean config.setCodeLogDetails(tempLogFile, true));
+
+ try (EmbeddedLdapServer server = serverBuilder.build()) {
+ server.start();
+
+ ldapTemplate("dc=jayway,dc=se", port).search(LdapQueryBuilder.query().where("objectclass").is("person"),
+ new AttributesMapper<>() {
+ public String mapFromAttributes(Attributes attrs) throws NamingException {
+ return (String) attrs.get("cn").get();
+ }
+ });
+ }
+
+ assertThat(Path.of(tempLogFile))
+ .as("Applying the custom configuration should create a log file and populate it with the request")
+ .isNotEmptyFile();
+ }
+
static boolean isPortOpen(int port) {
try (Socket ignored = new Socket("localhost", port)) {
return true;
@@ -112,4 +166,14 @@ public class EmbeddedLdapServerTests {
}
}
+ static LdapTemplate ldapTemplate(String base, int port) {
+ LdapContextSource ctx = new LdapContextSource();
+ ctx.setBase(base);
+ ctx.setUrl("ldap://127.0.0.1:" + port);
+ ctx.setUserDn("uid=admin,ou=system");
+ ctx.setPassword("secret");
+ ctx.afterPropertiesSet();
+ return new LdapTemplate(ctx);
+ }
+
}