| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 ${groupId}; |
| |
| |
| import static junit.framework.Assert.assertNotNull; |
| import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertTrue; |
| import static org.junit.Assert.fail; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import javax.naming.NameNotFoundException; |
| import javax.naming.NamingEnumeration; |
| import javax.naming.directory.Attribute; |
| import javax.naming.directory.Attributes; |
| import javax.naming.directory.BasicAttribute; |
| import javax.naming.directory.BasicAttributes; |
| import javax.naming.directory.DirContext; |
| import javax.naming.directory.ModificationItem; |
| import javax.naming.directory.SearchControls; |
| import javax.naming.directory.SearchResult; |
| import javax.naming.ldap.LdapContext; |
| |
| import org.apache.directory.server.core.CoreSession; |
| import org.apache.directory.server.core.entry.DefaultServerEntry; |
| import org.apache.directory.server.core.entry.ServerEntry; |
| import org.apache.directory.server.core.filtering.EntryFilteringCursor; |
| import org.apache.directory.server.integ.SiRunner; |
| import org.apache.directory.server.ldap.LdapServer; |
| import org.apache.directory.server.schema.registries.Registries; |
| import org.apache.directory.shared.ldap.entry.Modification; |
| import org.apache.directory.shared.ldap.entry.ModificationOperation; |
| import org.apache.directory.shared.ldap.entry.client.ClientModification; |
| import org.apache.directory.shared.ldap.entry.client.ClientStringValue; |
| import org.apache.directory.shared.ldap.entry.client.DefaultClientAttribute; |
| import org.apache.directory.shared.ldap.filter.EqualityNode; |
| import org.apache.directory.shared.ldap.filter.SearchScope; |
| import org.apache.directory.shared.ldap.message.AliasDerefMode; |
| import org.apache.directory.shared.ldap.name.LdapDN; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| |
| /** |
| * This is a minimal test template. |
| * It just starts up an embedded ApacheDS with default configuration: |
| * <ul> |
| * <li>Only system partion 'ou=system' and schema partition 'ou=schema' exist.</li> |
| * <li>Only LDAP protocol (no LDAPS) is enabled, listening on port 1024.</li> |
| * <li>The directory data can also be accessed directly via the core API.</li> |
| * <li></li> |
| * </ul> |
| * |
| * The two tests methods demonstrate how to use the core API and JNDI |
| * to access the embedded ApacheDS within the JVM or over the wire. |
| * |
| * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> |
| */ |
| @RunWith(SiRunner.class) |
| public class MinimalTest |
| { |
| // the LdapServer is injected on test startup |
| public static LdapServer ldapServer; |
| |
| |
| /** |
| * Demonstrates how to use the core API. |
| * Note that those requests don't go over the wire but access |
| * the ApacheDS within the same JVM. |
| * |
| * @throws Exception |
| */ |
| @Test |
| public void demonstrateCoreAPI() throws Exception |
| { |
| // get the admin session which has unlimited access rights to the directory |
| CoreSession session = ldapServer.getDirectoryService().getAdminSession(); |
| Registries registries = ldapServer.getDirectoryService().getRegistries(); |
| |
| // this entry should exist |
| assertTrue( session.exists( new LdapDN( "ou=users,ou=system" ) ) ); |
| |
| // this entry should not exist |
| assertFalse( session.exists( new LdapDN( "uid=foo.bar,ou=users,ou=system" ) ) ); |
| |
| // create an entry |
| ServerEntry newEntry = new DefaultServerEntry( registries, new LdapDN( "uid=foo.bar,ou=users,ou=system" ) ); |
| newEntry.add( "objectClass", "top", "person", "organizationalPerson", "inetOrgPerson" ); |
| newEntry.add( "uid", "foo.bar" ); |
| newEntry.add( "cn", "Foo Bar" ); |
| newEntry.add( "sn", "Bar" ); |
| newEntry.add( "givenName", "Foo" ); |
| session.add( newEntry ); |
| |
| // lookup entry |
| ServerEntry entry = session.lookup( new LdapDN( "uid=foo.bar,ou=users,ou=system" ) ); |
| assertTrue( entry.hasObjectClass( "inetOrgPerson" ) ); |
| assertNotNull( entry.get( "cn" ) ); |
| assertEquals( "Foo Bar", entry.get( "cn" ).get().getString() ); |
| |
| // modify entry |
| List<Modification> modifications = new ArrayList<Modification>(); |
| modifications.add( new ClientModification( ModificationOperation.ADD_ATTRIBUTE, new DefaultClientAttribute( |
| "mail", "bar@example.com", "foo.bar@example.com" ) ) ); |
| modifications.add( new ClientModification( ModificationOperation.REMOVE_ATTRIBUTE, new DefaultClientAttribute( |
| "givenName" ) ) ); |
| modifications.add( new ClientModification( ModificationOperation.REPLACE_ATTRIBUTE, new DefaultClientAttribute( |
| "description", "This is Foo Bar." ) ) ); |
| session.modify( new LdapDN( "uid=foo.bar,ou=users,ou=system" ), modifications ); |
| |
| // search |
| EntryFilteringCursor cursor = session.search( new LdapDN( "ou=users,ou=system" ), SearchScope.ONELEVEL, |
| new EqualityNode<String>( "uid", new ClientStringValue( "foo.bar" ) ), AliasDerefMode.DEREF_ALWAYS, null ); |
| cursor.beforeFirst(); |
| assertTrue( cursor.next() ); |
| assertNotNull( cursor.get() ); |
| assertEquals( "uid=foo.bar,ou=users,ou=system", cursor.get().getDn().getUpName() ); |
| assertFalse( cursor.next() ); |
| cursor.close(); |
| |
| // delete entry |
| session.delete( new LdapDN( "uid=foo.bar,ou=users,ou=system" ) ); |
| } |
| |
| |
| /** |
| * Demonstrates how to use the JNDI API to access the embedded |
| * ApacheDS over the wire. |
| * |
| * @throws Exception |
| */ |
| @Test |
| public void demonstrateJndiAPI() throws Exception |
| { |
| // use the helper method to create a JNDI context from the LdapServer |
| LdapContext ctx = getWiredContext( ldapServer ); |
| |
| // this entry should exist |
| assertNotNull( ctx.lookup( "ou=users,ou=system" ) ); |
| |
| // this entry should not exist |
| try |
| { |
| ctx.lookup( "uid=foo.bar,ou=users,ou=system" ); |
| fail( "uid=foo.bar,ou=users,ou=system doesn't exist." ); |
| } |
| catch ( NameNotFoundException e ) |
| { |
| // expected |
| } |
| |
| // create an entry |
| Attributes newAttributes = new BasicAttributes(); |
| Attribute newOcAttribute = new BasicAttribute( "objectClass" ); |
| newOcAttribute.add( "top" ); |
| newOcAttribute.add( "person" ); |
| newOcAttribute.add( "organizationalPerson" ); |
| newOcAttribute.add( "inetOrgPerson" ); |
| newAttributes.put( newOcAttribute ); |
| newAttributes.put( "uid", "foo.bar" ); |
| newAttributes.put( "cn", "Foo Bar" ); |
| newAttributes.put( "sn", "Bar" ); |
| newAttributes.put( "givenName", "Foo" ); |
| ctx.bind( "uid=foo.bar,ou=users,ou=system", null, newAttributes ); |
| |
| // lookup entry |
| Attributes attributes = ctx.getAttributes( "uid=foo.bar,ou=users,ou=system" ); |
| assertNotNull( attributes.get( "objectClass" ) ); |
| assertTrue( attributes.get( "objectClass" ).contains( "inetOrgPerson" ) ); |
| assertNotNull( attributes.get( "cn" ) ); |
| assertEquals( "Foo Bar", attributes.get( "cn" ).get() ); |
| |
| // modify entry |
| ModificationItem[] modificatons = new ModificationItem[3]; |
| modificatons[0] = new ModificationItem( DirContext.ADD_ATTRIBUTE, new BasicAttribute( "mail", |
| "foo.bar@example.com" ) ); |
| modificatons[1] = new ModificationItem( DirContext.REMOVE_ATTRIBUTE, new BasicAttribute( "givenName" ) ); |
| modificatons[2] = new ModificationItem( DirContext.REPLACE_ATTRIBUTE, new BasicAttribute( "description", |
| "This is Foo Bar." ) ); |
| ctx.modifyAttributes( "uid=foo.bar,ou=users,ou=system", modificatons ); |
| |
| // search |
| SearchControls searchControls = new SearchControls(); |
| NamingEnumeration<SearchResult> results = ctx.search( "ou=users,ou=system", "(uid=foo.bar)", searchControls ); |
| assertTrue( results.hasMore() ); |
| SearchResult next = results.next(); |
| assertNotNull( next ); |
| assertEquals( "uid=foo.bar,ou=users,ou=system", next.getNameInNamespace() ); |
| assertFalse( results.hasMore() ); |
| results.close(); |
| |
| // delete entry |
| ctx.unbind( "uid=foo.bar,ou=users,ou=system" ); |
| |
| ctx.close(); |
| } |
| |
| } |