Author: seelmann
Date: Thu Nov 1 12:26:15 2018
New Revision: 1845459
URL: http://svn.apache.org/viewvc?rev=1845459&view=rev
Log:
Add unit test doc, contributed by Maxim Solodovnik
Modified:
directory/site/trunk/content/apacheds/advanced-ug/7-embedding-apacheds.mdtext
Modified: directory/site/trunk/content/apacheds/advanced-ug/7-embedding-apacheds.mdtext
URL: http://svn.apache.org/viewvc/directory/site/trunk/content/apacheds/advanced-ug/7-embedding-apacheds.mdtext?rev=1845459&r1=1845458&r2=1845459&view=diff
==============================================================================
--- directory/site/trunk/content/apacheds/advanced-ug/7-embedding-apacheds.mdtext (original)
+++ directory/site/trunk/content/apacheds/advanced-ug/7-embedding-apacheds.mdtext Thu Nov
1 12:26:15 2018
@@ -24,4 +24,132 @@ Notice: Licensed to the Apache Software
# 7 - Embedding ApacheDS in Java
-TODO...
+## Using ApacheDS for unit tests
+The idea is to use ADS as an embedded server for Ldap junit tests.
+We will build an environment in which it will be convenient to test
+Ldap applications.
+
+We also want to avoid launching the server for every test, as it's
+an expensive operation. We have built ApacheDS so that you can start
+a server, inject some data, launch a test, then revert the data and
+go on to another test. At the end of the tests, the server is stopped.
+
+### Prerequicites
+We will assume you have **Maven** project and using **JUNIT** for testing
+
+### First steps
+#### Maven
+You need to add following dependency to your `pom.xml`:
+
+ <dependency>
+ <groupId>org.apache.directory.server</groupId>
+ <artifactId>apacheds-test-framework</artifactId>
+ <version>2.0.0.AM25</version>
+ <scope>test</scope>
+ </dependency>
+
+Please NOTE: you need to exclude `org.apache.directory.api:api-ldap-schema-data`
+artifact from above dependency in case your project uses `org.apache.directory.api:api-all`
+
+#### Java
+Maven set-up was easy enough, let's create our first unit test:
+
+##### Resources
+Lets describe your LDAP structure in external LDIF file
+
+Create file `src/test/resources/users.ldif` with following text:
+
+ version: 1
+ dn: dc=myorg,dc=com
+ objectClass: domain
+ objectClass: top
+ dc: myorg
+
+ dn: ou=Users,dc=myorg,dc=com
+ objectClass: organizationalUnit
+ objectClass: top
+ ou: Users
+
+ dn: ou=Groups,dc=myorg,dc=com
+ objectClass: organizationalUnit
+ objectClass: top
+ ou: Groups
+
+ dn: cn=Test1 Ldap,ou=Users,dc=myorg,dc=com
+ objectClass: inetOrgPerson
+ objectClass: organizationalPerson
+ objectClass: person
+ objectClass: top
+ cn: Test1 Ldap
+ sn: Ldap
+ uid: ldaptest1
+ userPassword: 12345
+
+
+##### Basic test
+
+ import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
+ import org.apache.directory.server.core.integ.FrameworkRunner;
+ import org.apache.directory.server.core.annotations.CreateDS;
+ import org.apache.directory.server.core.annotations.CreatePartition;
+ import org.apache.directory.server.annotations.CreateLdapServer;
+ import org.apache.directory.server.annotations.CreateTransport;
+ import org.apache.directory.server.core.annotations.ApplyLdifFiles;
+ import org.junit.runner.RunWith;
+ import org.junit.Test;
+
+ @RunWith(FrameworkRunner.class)
+ @CreateDS(name = "myDS",
+ partitions = {
+ @CreatePartition(name = "test", suffix = "dc=myorg,dc=com")
+ })
+ @CreateLdapServer(transports = { @CreateTransport(protocol = "LDAP", address = "localhost")})
+ @ApplyLdifFiles({"users.ldif"})
+ public class TestLdap extends AbstractLdapTestUnit {
+ @Test
+ public void test() {
+ //do whatever you need with `ldapServer`
+ }
+ }
+
+
+As a result you can access running ApacheDS server at `ldap://localhost:<random port>`
+inside your test, or access server internals via `static ldapServer`.
+
+##### Advanced usage
+Often you need to add LDAP unit tests to already created tests, in this case you might
+not be allowed to `extend AbstractLdapTestUnit` and/or to `@RunWith(FrameworkRunner.class)`
+In this case you can use `@ClassRule`.
+Here is the example:
+
+ import org.apache.directory.server.core.annotations.CreateDS;
+ import org.apache.directory.server.core.annotations.CreatePartition;
+ import org.apache.directory.server.annotations.CreateLdapServer;
+ import org.apache.directory.server.annotations.CreateTransport;
+ import org.apache.directory.server.core.annotations.ApplyLdifFiles;
+ import org.apache.directory.server.core.integ.CreateLdapServerRule;
+ import org.junit.ClassRule;
+ import org.junit.Test;
+
+ @CreateDS(name = "myDS",
+ partitions = {
+ @CreatePartition(name = "test", suffix = "dc=myorg,dc=com")
+ })
+ @CreateLdapServer(transports = { @CreateTransport(protocol = "LDAP", address = "localhost")})
+ @ApplyLdifFiles({"users.ldif"})
+ public class TestLdap {
+ @ClassRule
+ public static CreateLdapServerRule serverRule = new CreateLdapServerRule();
+
+ @Test
+ public void test() {
+ //do whatever you need with `serverRule.getLdapServer()`
+ }
+ }
+
+
+As you can see the code if very much the same, the only difference: you are working with
+`serverRule.getLdapServer()` and not with `ldapServer`
+
+
+
|