You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2008/08/07 07:44:10 UTC
svn commit: r683514 [1/2] - in /directory/apacheds/branches/bigbang:
server-integ/
server-integ/src/test/java/org/apache/directory/server/operations/search/
server-integ/src/test/java/org/apache/directory/server/suites/
server-unit/src/test/java/org/ap...
Author: akarasulu
Date: Wed Aug 6 22:44:09 2008
New Revision: 683514
URL: http://svn.apache.org/viewvc?rev=683514&view=rev
Log:
converted a number of search tests to new integ framework in server-integ: PSearch still not operational.
Added:
directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/
directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/IndexedNegationSearchIT.java
directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/NegationSearchIT.java
directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/PersistentSearchTest.java
- copied, changed from r683480, directory/apacheds/branches/bigbang/server-unit/src/test/java/org/apache/directory/server/PersistentSearchTest.java
directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/SchemaSearchIT.java
directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java
Removed:
directory/apacheds/branches/bigbang/server-unit/src/test/java/org/apache/directory/server/BinarySearchTest.java
directory/apacheds/branches/bigbang/server-unit/src/test/java/org/apache/directory/server/DIRSERVER951ITest.java
directory/apacheds/branches/bigbang/server-unit/src/test/java/org/apache/directory/server/NegationOperatorITest.java
directory/apacheds/branches/bigbang/server-unit/src/test/java/org/apache/directory/server/PersistentSearchTest.java
directory/apacheds/branches/bigbang/server-unit/src/test/java/org/apache/directory/server/SchemaSearchITest.java
directory/apacheds/branches/bigbang/server-unit/src/test/java/org/apache/directory/server/SearchITest.java
Modified:
directory/apacheds/branches/bigbang/server-integ/pom.xml
directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/suites/StockServerISuite.java
Modified: directory/apacheds/branches/bigbang/server-integ/pom.xml
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/server-integ/pom.xml?rev=683514&r1=683513&r2=683514&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/server-integ/pom.xml (original)
+++ directory/apacheds/branches/bigbang/server-integ/pom.xml Wed Aug 6 22:44:09 2008
@@ -91,6 +91,7 @@
<configuration>
<includes>
<include>**/*ISuite.java</include>
+ <include>**/*IndexedNegationSearchIT.java</include>
</includes>
</configuration>
</plugin>
Added: directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/IndexedNegationSearchIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/IndexedNegationSearchIT.java?rev=683514&view=auto
==============================================================================
--- directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/IndexedNegationSearchIT.java (added)
+++ directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/IndexedNegationSearchIT.java Wed Aug 6 22:44:09 2008
@@ -0,0 +1,325 @@
+/*
+ * 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 org.apache.directory.server.operations.search;
+
+
+import org.apache.directory.server.core.DefaultDirectoryService;
+import org.apache.directory.server.core.DirectoryService;
+import org.apache.directory.server.core.entry.DefaultServerEntry;
+import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.integ.IntegrationUtils;
+import org.apache.directory.server.core.integ.Level;
+import org.apache.directory.server.core.integ.annotations.ApplyLdifs;
+import org.apache.directory.server.core.integ.annotations.CleanupLevel;
+import org.apache.directory.server.core.integ.annotations.Factory;
+import org.apache.directory.server.xdbm.Index;
+import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmIndex;
+import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmPartition;
+import org.apache.directory.server.integ.LdapServerFactory;
+import org.apache.directory.server.integ.SiRunner;
+import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext;
+
+import org.apache.directory.server.newldap.LdapServer;
+import org.apache.directory.server.newldap.handlers.bind.MechanismHandler;
+import org.apache.directory.server.newldap.handlers.bind.SimpleMechanismHandler;
+import org.apache.directory.server.newldap.handlers.bind.cramMD5.CramMd5MechanismHandler;
+import org.apache.directory.server.newldap.handlers.bind.digestMD5.DigestMd5MechanismHandler;
+import org.apache.directory.server.newldap.handlers.bind.gssapi.GssapiMechanismHandler;
+import org.apache.directory.server.newldap.handlers.bind.ntlm.NtlmMechanismHandler;
+import org.apache.directory.server.newldap.handlers.extended.StartTlsHandler;
+import org.apache.directory.server.newldap.handlers.extended.StoredProcedureExtendedOperationHandler;
+import org.apache.directory.server.protocol.shared.SocketAcceptor;
+import org.apache.directory.shared.ldap.constants.SchemaConstants;
+import org.apache.directory.shared.ldap.constants.SupportedSaslMechanisms;
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.util.DateUtils;
+import org.apache.mina.util.AvailablePortFinder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.naming.NamingEnumeration;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+
+/**
+ * A set of tests to make sure the negation operator is working
+ * properly when included in search filters on indexed attributes.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+@RunWith ( SiRunner.class )
+@CleanupLevel ( Level.SUITE )
+@Factory ( IndexedNegationSearchIT.Factory.class )
+@ApplyLdifs( {
+ "dn: ou=test,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: organizationalUnit\n" +
+ "ou: test\n\n" +
+
+ "dn: uid=test1,ou=test,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: account\n" +
+ "uid: test1\n" +
+ "ou: test1\n\n" +
+
+ "dn: uid=test2,ou=test,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: account\n" +
+ "uid: test2\n" +
+ "ou: test2\n\n" +
+
+ "dn: uid=testNoOU,ou=test,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: account\n" +
+ "uid: testNoOU\n\n" +
+
+ "dn: ou=actors,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: organizationalUnit\n" +
+ "ou: actors\n\n" +
+
+ "dn: uid=jblack,ou=actors,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: person\n" +
+ "objectClass: organizationalPerson\n" +
+ "objectClass: uidObject\n" +
+ "uid: jblack\n" +
+ "ou: comedy\n" +
+ "ou: adventure\n" +
+ "cn: Jack Black\n" +
+ "sn: Black\n\n" +
+
+ "dn: uid=bpitt,ou=actors,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: person\n" +
+ "objectClass: organizationalPerson\n" +
+ "objectClass: uidObject\n" +
+ "uid: bpitt\n" +
+ "ou: drama\n" +
+ "ou: adventure\n" +
+ "cn: Brad Pitt\n" +
+ "sn: Pitt\n\n" +
+
+ "dn: uid=gcloony,ou=actors,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: person\n" +
+ "objectClass: organizationalPerson\n" +
+ "objectClass: uidObject\n" +
+ "uid: gcloony\n" +
+ "ou: drama\n" +
+ "cn: Goerge Cloony\n" +
+ "sn: Cloony\n\n" +
+
+ "dn: uid=jnewbie,ou=actors,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: person\n" +
+ "objectClass: organizationalPerson\n" +
+ "objectClass: uidObject\n" +
+ "uid: jnewbie\n" +
+ "cn: Joe Newbie\n" +
+ "sn: Newbie\n\n"
+
+ }
+)
+public class IndexedNegationSearchIT
+{
+ public static LdapServer ldapServer;
+
+
+ public static class Factory implements LdapServerFactory
+ {
+ public LdapServer newInstance() throws Exception
+ {
+ DirectoryService service = new DefaultDirectoryService();
+ IntegrationUtils.doDelete( service.getWorkingDirectory() );
+ service.getChangeLog().setEnabled( true );
+ service.setShutdownHookEnabled( false );
+
+ JdbmPartition system = new JdbmPartition();
+ system.setId( "system" );
+
+ // @TODO need to make this configurable for the system partition
+ system.setCacheSize( 500 );
+
+ system.setSuffix( "ou=system" );
+
+ // Add indexed attributes for system partition
+ Set<Index<?,ServerEntry>> indexedAttrs = new HashSet<Index<?,ServerEntry>>();
+ indexedAttrs.add( new JdbmIndex<String,ServerEntry>( SchemaConstants.OBJECT_CLASS_AT ) );
+ indexedAttrs.add( new JdbmIndex<String,ServerEntry>( SchemaConstants.OU_AT ) );
+ system.setIndexedAttributes( indexedAttrs );
+
+ // Add context entry for system partition
+ LdapDN systemDn = new LdapDN( "ou=system" );
+ ServerEntry systemEntry = new DefaultServerEntry( service.getRegistries(), systemDn );
+ systemEntry.put( "objectClass", "top", "organizationalUnit", "extensibleObject", "account" );
+ systemEntry.put( SchemaConstants.CREATORS_NAME_AT, "uid=admin, ou=system" );
+ systemEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
+ systemEntry.put( "ou", "system" );
+ systemEntry.put( "uid", "testUid" );
+ system.setContextEntry( systemEntry );
+ service.setSystemPartition( system );
+
+ // change the working directory to something that is unique
+ // on the system and somewhere either under target directory
+ // or somewhere in a temp area of the machine.
+
+ LdapServer ldapServer = new LdapServer();
+ ldapServer.setDirectoryService( service );
+ ldapServer.setSocketAcceptor( new SocketAcceptor( null ) );
+ ldapServer.setIpPort( AvailablePortFinder.getNextAvailable( 1024 ) );
+ ldapServer.addExtendedOperationHandler( new StartTlsHandler() );
+ ldapServer.addExtendedOperationHandler( new StoredProcedureExtendedOperationHandler() );
+
+ // Setup SASL Mechanisms
+
+ Map<String, MechanismHandler> mechanismHandlerMap = new HashMap<String,MechanismHandler>();
+ mechanismHandlerMap.put( SupportedSaslMechanisms.PLAIN, new SimpleMechanismHandler() );
+
+ CramMd5MechanismHandler cramMd5MechanismHandler = new CramMd5MechanismHandler();
+ mechanismHandlerMap.put( SupportedSaslMechanisms.CRAM_MD5, cramMd5MechanismHandler );
+
+ DigestMd5MechanismHandler digestMd5MechanismHandler = new DigestMd5MechanismHandler();
+ mechanismHandlerMap.put( SupportedSaslMechanisms.DIGEST_MD5, digestMd5MechanismHandler );
+
+ GssapiMechanismHandler gssapiMechanismHandler = new GssapiMechanismHandler();
+ mechanismHandlerMap.put( SupportedSaslMechanisms.GSSAPI, gssapiMechanismHandler );
+
+ NtlmMechanismHandler ntlmMechanismHandler = new NtlmMechanismHandler();
+ mechanismHandlerMap.put( SupportedSaslMechanisms.NTLM, ntlmMechanismHandler );
+ mechanismHandlerMap.put( SupportedSaslMechanisms.GSS_SPNEGO, ntlmMechanismHandler );
+
+ ldapServer.setSaslMechanismHandlers( mechanismHandlerMap );
+
+ return ldapServer;
+ }
+ }
+
+
+ /**
+ * Tests to make sure a negated search for OU of "test1" returns
+ * those entries that do not have the OU attribute or do not have
+ * a "test1" value for OU if the attribute exists.
+ */
+ @Test
+ public void testSearchNotOUIndexed() throws Exception
+ {
+ Set<SearchResult> results = getResults( "(!(ou=test1))" );
+ assertFalse( contains( "uid=test1,ou=test,ou=system", results ) );
+ assertTrue( contains( "uid=test2,ou=test,ou=system", results ) );
+ assertTrue( contains( "uid=testNoOU,ou=test,ou=system", results ) );
+ }
+
+
+ /**
+ * Tests to make sure a negated search for actors without ou
+ * with value 'drama' returns those that do not have the attribute
+ * and do not have a 'drama' value for ou if the attribute still
+ * exists. This test DOES build an index on ou for the system
+ * partition and should have failed if the bug in DIRSERVER-951
+ * was present and reproducable.
+ */
+ @Test
+ public void testSearchNotDramaIndexed() throws Exception
+ {
+ // jack black has ou but not drama, and joe newbie has no ou what so ever
+ Set<SearchResult> results = getActorResults( "(!(ou=drama))" );
+ assertTrue( contains( "uid=jblack,ou=actors,ou=system", results ) );
+ assertTrue( contains( "uid=jnewbie,ou=actors,ou=system", results ) );
+ assertEquals( 2, results.size() );
+ }
+
+
+ boolean contains( String dn, Set<SearchResult> results )
+ {
+ for ( SearchResult result : results )
+ {
+ if ( result.getNameInNamespace().equals( dn ) )
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Tests to make sure a negated search for actors without ou
+ * with value 'drama' returns those that do not have the attribute
+ * and do not have a 'drama' value for ou if the attribute still
+ * exists. This test DOES build an index on ou for the system
+ * partition and should have failed if the bug in DIRSERVER-951
+ * was present and reproducable.
+ */
+ @Test
+ public void testSearchNotDramaNotNewbieIndexed() throws Exception
+ {
+ // jack black has ou but not drama, and joe newbie has no ou what so ever
+ Set<SearchResult> results = getActorResults( "(& (!(uid=jnewbie)) (!(ou=drama)) )" );
+ assertTrue( contains( "uid=jblack,ou=actors,ou=system", results ) );
+ assertFalse( contains( "uid=jnewbie,ou=actors,ou=system", results ) );
+ assertEquals( 1, results.size() );
+ }
+
+
+ Set<SearchResult> getActorResults( String filter ) throws Exception
+ {
+ DirContext ctx = getWiredContext( ldapServer );
+ Set<SearchResult> results = new HashSet<SearchResult>();
+ SearchControls controls = new SearchControls();
+ controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
+ NamingEnumeration<SearchResult> namingEnumeration = ctx.search( "ou=actors,ou=system", filter, controls );
+ while( namingEnumeration.hasMore() )
+ {
+ results.add( namingEnumeration.next() );
+ }
+
+ return results;
+ }
+
+
+ Set<SearchResult> getResults( String filter ) throws Exception
+ {
+ DirContext ctx = getWiredContext( ldapServer );
+ Set<SearchResult> results = new HashSet<SearchResult>();
+ SearchControls controls = new SearchControls();
+ controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
+ NamingEnumeration<SearchResult> namingEnumeration = ctx.search( "ou=system", filter, controls );
+ while( namingEnumeration.hasMore() )
+ {
+ results.add( namingEnumeration.next() );
+ }
+
+ return results;
+ }
+}
Added: directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/NegationSearchIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/NegationSearchIT.java?rev=683514&view=auto
==============================================================================
--- directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/NegationSearchIT.java (added)
+++ directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/NegationSearchIT.java Wed Aug 6 22:44:09 2008
@@ -0,0 +1,178 @@
+/*
+ * 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 org.apache.directory.server.operations.search;
+
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.naming.NamingEnumeration;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+
+import org.apache.directory.server.core.integ.Level;
+import org.apache.directory.server.core.integ.annotations.ApplyLdifs;
+import org.apache.directory.server.core.integ.annotations.CleanupLevel;
+import org.apache.directory.server.core.integ.annotations.Factory;
+import org.apache.directory.server.integ.SiRunner;
+import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext;
+
+import org.apache.directory.server.newldap.LdapServer;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.naming.directory.DirContext;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+
+/**
+ * A set of tests to make sure the negation operator is working
+ * properly when included in search filters. Created in response
+ * to JIRA issue
+ * <a href="https://issues.apache.org/jira/browse/DIRSERVER-951">DIRSERVER-951</a>.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: 519077 $
+ */
+@RunWith ( SiRunner.class )
+@CleanupLevel ( Level.SUITE )
+@Factory ( IndexedNegationSearchIT.Factory.class )
+@ApplyLdifs( {
+ "dn: ou=actors,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: organizationalUnit\n" +
+ "ou: actors\n\n" +
+
+ "dn: uid=jblack,ou=actors,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: person\n" +
+ "objectClass: organizationalPerson\n" +
+ "objectClass: uidObject\n" +
+ "uid: jblack\n" +
+ "ou: comedy\n" +
+ "ou: adventure\n" +
+ "cn: Jack Black\n" +
+ "sn: Black\n\n" +
+
+ "dn: uid=bpitt,ou=actors,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: person\n" +
+ "objectClass: organizationalPerson\n" +
+ "objectClass: uidObject\n" +
+ "uid: bpitt\n" +
+ "ou: drama\n" +
+ "ou: adventure\n" +
+ "cn: Brad Pitt\n" +
+ "sn: Pitt\n\n" +
+
+ "dn: uid=gcloony,ou=actors,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: person\n" +
+ "objectClass: organizationalPerson\n" +
+ "objectClass: uidObject\n" +
+ "uid: gcloony\n" +
+ "ou: drama\n" +
+ "cn: Goerge Cloony\n" +
+ "sn: Cloony\n\n" +
+
+ "dn: uid=jnewbie,ou=actors,ou=system\n" +
+ "objectClass: top\n" +
+ "objectClass: person\n" +
+ "objectClass: organizationalPerson\n" +
+ "objectClass: uidObject\n" +
+ "uid: jnewbie\n" +
+ "cn: Joe Newbie\n" +
+ "sn: Newbie\n\n"
+
+ }
+)
+public class NegationSearchIT
+{
+ public static LdapServer ldapServer;
+
+
+ /**
+ * Tests to make sure a negated search for actors without ou
+ * with value 'drama' returns those that do not have the attribute
+ * and do not have a 'drama' value for ou if the attribute still
+ * exists. This test does not build an index on ou for the system
+ * partition.
+ */
+ @Test
+ public void testSearchNotDrama() throws Exception
+ {
+ // jack black has ou but not drama, and joe newbie has no ou what so ever
+ Set<SearchResult> results = getResults( "(!(ou=drama))" );
+ assertTrue( contains( "uid=jblack,ou=actors,ou=system", results ) );
+ assertTrue( contains( "uid=jnewbie,ou=actors,ou=system", results ) );
+ assertEquals( 2, results.size() );
+ }
+
+
+ /**
+ * Tests to make sure a negated search for actors without ou
+ * with value 'drama' returns those that do not have the attribute
+ * and do not have a 'drama' value for ou if the attribute still
+ * exists. This test does not build an index on ou for the system
+ * partition.
+ */
+ @Test
+ public void testSearchNotDramaNotNewbie() throws Exception
+ {
+ // jack black has ou but not drama, and joe newbie has no ou what so ever
+ Set<SearchResult> results = getResults( "(& (!(uid=jnewbie)) (!(ou=drama)) )" );
+ assertTrue( contains( "uid=jblack,ou=actors,ou=system", results ) );
+ assertFalse( contains( "uid=jnewbie,ou=actors,ou=system", results ) );
+ assertEquals( 1, results.size() );
+ }
+
+
+ boolean contains( String dn, Set<SearchResult> results )
+ {
+ for ( SearchResult result : results )
+ {
+ if ( result.getNameInNamespace().equals( dn ) )
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+
+ Set<SearchResult> getResults( String filter ) throws Exception
+ {
+ DirContext ctx = getWiredContext( ldapServer );
+ Set<SearchResult> results = new HashSet<SearchResult>();
+ SearchControls controls = new SearchControls();
+ controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
+ NamingEnumeration<SearchResult> namingEnumeration = ctx.search( "ou=actors,ou=system", filter, controls );
+ while( namingEnumeration.hasMore() )
+ {
+ results.add( namingEnumeration.next() );
+ }
+
+ return results;
+ }
+}
Copied: directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/PersistentSearchTest.java (from r683480, directory/apacheds/branches/bigbang/server-unit/src/test/java/org/apache/directory/server/PersistentSearchTest.java)
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/PersistentSearchTest.java?p2=directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/PersistentSearchTest.java&p1=directory/apacheds/branches/bigbang/server-unit/src/test/java/org/apache/directory/server/PersistentSearchTest.java&r1=683480&r2=683514&rev=683514&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/server-unit/src/test/java/org/apache/directory/server/PersistentSearchTest.java (original)
+++ directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/PersistentSearchTest.java Wed Aug 6 22:44:09 2008
@@ -17,18 +17,16 @@
* under the License.
*
*/
-package org.apache.directory.server;
+package org.apache.directory.server.operations.search;
import java.util.ArrayList;
import java.util.EventObject;
-import java.util.Hashtable;
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
-import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchResult;
import javax.naming.event.EventContext;
import javax.naming.event.EventDirContext;
@@ -38,10 +36,14 @@
import javax.naming.event.ObjectChangeListener;
import javax.naming.ldap.Control;
import javax.naming.ldap.HasControls;
-import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
-import org.apache.directory.server.unit.AbstractServerTest;
+import org.apache.directory.server.core.integ.Level;
+import org.apache.directory.server.core.integ.annotations.ApplyLdifs;
+import org.apache.directory.server.core.integ.annotations.CleanupLevel;
+import org.apache.directory.server.integ.SiRunner;
+import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext;
+import org.apache.directory.server.newldap.LdapServer;
import org.apache.directory.shared.ldap.codec.search.controls.ChangeType;
import org.apache.directory.shared.ldap.codec.search.controls.EntryChangeControlCodec;
import org.apache.directory.shared.ldap.codec.search.controls.EntryChangeControlDecoder;
@@ -49,28 +51,41 @@
import org.apache.directory.shared.ldap.message.AttributesImpl;
import org.apache.directory.shared.ldap.message.PersistentSearchControl;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
+import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
/**
- * Testcase which tests the correct operation of the persistent search control.
+ * TODO - enable me - not executed (not in suite yet)
+ * Test case which tests the correct operation of the persistent search control.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$
*/
-public class PersistentSearchTest extends AbstractServerTest
+@RunWith ( SiRunner.class )
+@CleanupLevel ( Level.SUITE )
+@ApplyLdifs( {
+ // Entry # 2
+ "dn: cn=Tori Amos,ou=system\n" +
+ "objectClass: person\n" +
+ "objectClass: top\n" +
+ "cn: Tori Amos\n" +
+ "description: an American singer-songwriter\n" +
+ "sn: Amos\n\n"
+ }
+)
+public class PersistentSearchTest
{
- public static final Logger log = LoggerFactory.getLogger( PersistentSearchTest.class );
- public static final String PERSON_DESCRIPTION = "an American singer-songwriter";
- public static final String RDN = "cn=Tori Amos";
- private LdapContext ctx = null;
+ private static final String BASE = "ou=system";
+ private static final String PERSON_DESCRIPTION = "an American singer-songwriter";
+ private static final String RDN = "cn=Tori Amos";
+ public static LdapServer ldapServer;
+
/**
* Creation of required attributes of a person entry.
@@ -88,57 +103,14 @@
return attributes;
}
-
- /**
- * Create context and a person entry.
- */
- @Before
- public void setUp() throws Exception
- {
- super.setUp();
-
- Hashtable<String, Object> env = new Hashtable<String, Object>();
- env.put( "java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory" );
- env.put( "java.naming.provider.url", "ldap://localhost:" + port + "/ou=system" );
- env.put( "java.naming.security.principal", "uid=admin,ou=system" );
- env.put( "java.naming.security.credentials", "secret" );
- env.put( "java.naming.security.authentication", "simple" );
-
- ctx = new InitialLdapContext( env, null );
- assertNotNull( ctx );
-
- // Create a person with description
- Attributes attributes = this.getPersonAttributes( "Amos", "Tori Amos" );
- attributes.put( "description", PERSON_DESCRIPTION );
- ctx.createSubcontext( RDN, attributes );
- }
-
-
- /**
- * Remove person entry and close context.
- */
- @After
- public void tearDown() throws Exception
- {
- try
- {
- ctx.unbind( RDN );
- ctx.close();
- ctx = null;
- super.tearDown();
- }
- catch ( Throwable t )
- {
- }
- }
-
-
+
/**
* Shows correct notifications for modify(4) changes.
*/
@Test
public void testPsearchModify() throws Exception
{
+ EventDirContext ctx = ( EventDirContext ) getWiredContext( ldapServer).lookup( BASE );
PSearchListener listener = new PSearchListener();
Thread t = new Thread( listener, "PSearchListener" );
t.start();
@@ -174,6 +146,7 @@
@Test
public void testPsearchModifyDn() throws Exception
{
+ DirContext ctx = ( DirContext ) getWiredContext( ldapServer).lookup( BASE );
PSearchListener listener = new PSearchListener();
Thread t = new Thread( listener );
t.start();
@@ -207,6 +180,7 @@
@Test
public void testPsearchDelete() throws Exception
{
+ DirContext ctx = ( DirContext ) getWiredContext( ldapServer).lookup( BASE );
PSearchListener listener = new PSearchListener();
Thread t = new Thread( listener );
t.start();
@@ -240,6 +214,7 @@
@Test
public void testPsearchAdd() throws Exception
{
+ DirContext ctx = ( DirContext ) getWiredContext( ldapServer).lookup( BASE );
PSearchListener listener = new PSearchListener();
Thread t = new Thread( listener );
t.start();
@@ -274,6 +249,7 @@
@Test
public void testPsearchModifyWithEC() throws Exception
{
+ DirContext ctx = ( DirContext ) getWiredContext( ldapServer).lookup( BASE );
PersistentSearchControl control = new PersistentSearchControl();
control.setReturnECs( true );
PSearchListener listener = new PSearchListener( control );
@@ -311,6 +287,7 @@
@Test
public void testPsearchModifyDnWithEC() throws Exception
{
+ DirContext ctx = ( DirContext ) getWiredContext( ldapServer).lookup( BASE );
PersistentSearchControl control = new PersistentSearchControl();
control.setReturnECs( true );
PSearchListener listener = new PSearchListener( control );
@@ -349,6 +326,7 @@
@Test
public void testPsearchDeleteWithEC() throws Exception
{
+ DirContext ctx = ( DirContext ) getWiredContext( ldapServer).lookup( BASE );
PersistentSearchControl control = new PersistentSearchControl();
control.setReturnECs( true );
PSearchListener listener = new PSearchListener( control );
@@ -386,6 +364,7 @@
@Test
public void testPsearchAddWithEC() throws Exception
{
+ DirContext ctx = ( DirContext ) getWiredContext( ldapServer).lookup( BASE );
PersistentSearchControl control = new PersistentSearchControl();
control.setReturnECs( true );
PSearchListener listener = new PSearchListener( control );
@@ -423,6 +402,7 @@
@Test
public void testPsearchAddModifyEnabledWithEC() throws Exception
{
+ DirContext ctx = ( DirContext ) getWiredContext( ldapServer).lookup( BASE );
PersistentSearchControl control = new PersistentSearchControl();
control.setReturnECs( true );
control.setChangeTypes( ChangeType.ADD_VALUE );
@@ -536,16 +516,9 @@
@Test
public void testPsearchUsingJndiNotifications() throws Exception
{
- Hashtable<String, Object> env = new Hashtable<String, Object>();
- env.put( "java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory" );
- env.put( "java.naming.provider.url", "ldap://localhost:" + port + "/ou=system" );
- env.put( "java.naming.security.principal", "uid=admin,ou=system" );
- env.put( "java.naming.security.credentials", "secret" );
- env.put( "java.naming.security.authentication", "simple" );
-
+ DirContext ctx = ( DirContext ) getWiredContext( ldapServer).lookup( BASE );
JndiNotificationListener listener = new JndiNotificationListener();
- InitialDirContext idc = new InitialDirContext( env );
- EventDirContext edc = ( EventDirContext ) ( idc.lookup( "" ) );
+ EventDirContext edc = ( EventDirContext ) getWiredContext( ldapServer).lookup( BASE );
edc.addNamingListener( "", EventContext.ONELEVEL_SCOPE, listener );
while ( listener.list.isEmpty() )
@@ -649,7 +622,7 @@
class JndiNotificationListener implements NamespaceChangeListener, ObjectChangeListener
{
boolean hasError = false;
- ArrayList<EventObject> list = new ArrayList();
+ ArrayList<EventObject> list = new ArrayList<EventObject>();
NamingExceptionEvent exceptionEvent = null;
public void objectAdded( NamingEvent evt )
@@ -706,13 +679,14 @@
public void run()
{
- NamingEnumeration list = null;
+ NamingEnumeration<SearchResult> list = null;
control.setCritical( true );
Control[] ctxCtls = new Control[]
{ control };
try
{
+ LdapContext ctx = ( LdapContext ) getWiredContext( ldapServer).lookup( BASE );
ctx.setRequestControls( ctxCtls );
isReady = true;
list = ctx.search( "", "objectClass=*", null );
@@ -721,7 +695,7 @@
while ( list.hasMore() )
{
Control[] controls = null;
- SearchResult sresult = ( SearchResult ) list.next();
+ SearchResult sresult = list.next();
count++;
if ( sresult instanceof HasControls )
{
Added: directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/SchemaSearchIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/SchemaSearchIT.java?rev=683514&view=auto
==============================================================================
--- directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/SchemaSearchIT.java (added)
+++ directory/apacheds/branches/bigbang/server-integ/src/test/java/org/apache/directory/server/operations/search/SchemaSearchIT.java Wed Aug 6 22:44:09 2008
@@ -0,0 +1,291 @@
+/*
+ * 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 org.apache.directory.server.operations.search;
+
+
+import javax.naming.NamingEnumeration;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+
+import org.apache.directory.server.core.integ.Level;
+import org.apache.directory.server.core.integ.annotations.ApplyLdifs;
+import org.apache.directory.server.core.integ.annotations.CleanupLevel;
+import org.apache.directory.server.integ.SiRunner;
+import org.apache.directory.server.newldap.LdapServer;
+import org.apache.directory.shared.ldap.message.AttributesImpl;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext;
+
+import static org.junit.Assert.fail;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+
+/**
+ * Test case with different search operations on the cn=schema entry.
+ * Created to demonstrate DIRSERVER-1055
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: 569048 $
+ */
+@RunWith ( SiRunner.class )
+@CleanupLevel ( Level.SUITE )
+@ApplyLdifs( {
+
+ // Bogus AD schema (not real)
+
+ "dn: cn=active-directory, ou=schema\n" +
+ "objectclass: metaSchema\n" +
+ "objectclass: top\n" +
+ "cn: active-directory\n" +
+ "m-dependencies: core\n\n" +
+
+ "dn: ou=attributeTypes, cn=active-directory, ou=schema\n" +
+ "objectclass: organizationalUnit\n" +
+ "objectclass: top\n" +
+ "ou: attributeTypes\n\n" +
+
+ "dn: m-oid=1.1, ou=attributeTypes, cn=active-directory, ou=schema\n" +
+ "objectclass: metaAttributeType\n" +
+ "objectclass: metaTop\n" +
+ "objectclass: top\n" +
+ "m-oid: 1.1\n" +
+ "m-name: sAMAccountName\n" +
+ "m-syntax: 1.3.6.1.4.1.1466.115.121.1.15\n\n" +
+
+ "dn: m-oid=1.2, ou=attributeTypes, cn=active-directory, ou=schema\n" +
+ "objectclass: metaAttributeType\n" +
+ "objectclass: metaTop\n" +
+ "objectclass: top\n" +
+ "m-oid: 1.2\n" +
+ "m-name: pwdLastSet\n" +
+ "m-equality: integerMatch\n" +
+ "m-ordering: integerMatch\n" +
+ "m-syntax: 1.3.6.1.4.1.1466.115.121.1.27\n\n" +
+
+ "dn: m-oid=1.4, ou=attributeTypes, cn=active-directory, ou=schema\n" +
+ "objectclass: metaAttributeType\n" +
+ "objectclass: metaTop\n" +
+ "objectclass: top\n" +
+ "m-oid: 1.4\n" +
+ "m-name: useraccountcontrol\n" +
+ "m-syntax: 1.3.6.1.4.1.1466.115.121.1.27\n\n" +
+
+ "dn: m-oid=1.5, ou=attributeTypes, cn=active-directory, ou=schema\n" +
+ "objectclass: metaAttributeType\n" +
+ "objectclass: metaTop\n" +
+ "objectclass: top\n" +
+ "m-oid: 1.5\n" +
+ "m-name: SourceAD\n" +
+ "m-syntax: 1.3.6.1.4.1.1466.115.121.1.15\n" +
+ "m-length: 0\n\n" +
+
+ "dn: ou=comparators, cn=active-directory, ou=schema\n" +
+ "objectclass: organizationalUnit\n" +
+ "objectclass: top\n" +
+ "ou: comparators\n\n" +
+
+ "dn: ou=ditContentRules, cn=active-directory, ou=schema\n" +
+ "objectclass: organizationalUnit\n" +
+ "objectclass: top\n" +
+ "ou: ditContentRules\n\n" +
+
+ "dn: ou=ditStructureRules, cn=active-directory, ou=schema\n" +
+ "objectclass: organizationalUnit\n" +
+ "objectclass: top\n" +
+ "ou: ditStructureRules\n\n" +
+
+ "dn: ou=matchingRules, cn=active-directory, ou=schema\n" +
+ "objectclass: organizationalUnit\n" +
+ "objectclass: top\n" +
+ "ou: matchingRules\n\n" +
+
+ "dn: ou=nameForms, cn=active-directory, ou=schema\n" +
+ "objectclass: organizationalUnit\n" +
+ "objectclass: top\n" +
+ "ou: nameForms\n\n" +
+
+ "dn: ou=normalizers, cn=active-directory, ou=schema\n" +
+ "objectclass: organizationalUnit\n" +
+ "objectclass: top\n" +
+ "ou: normalizers\n\n" +
+
+ "dn: ou=objectClasses, cn=active-directory, ou=schema\n" +
+ "objectclass: organizationalUnit\n" +
+ "objectclass: top\n" +
+ "ou: objectClasses\n\n" +
+
+ "dn: m-oid=1.3, ou=objectClasses, cn=active-directory, ou=schema\n" +
+ "objectclass: metaObjectClass\n" +
+ "objectclass: metaTop\n" +
+ "objectclass: top\n" +
+ "m-oid: 1.3\n" +
+ "m-name: personActiveDirectory\n" +
+ "m-supObjectClass: person\n" +
+ "m-must: pwdLastSet\n" +
+ "m-must: sAMAccountName\n" +
+ "m-must: useraccountcontrol\n" +
+ "m-must: SourceAD\n\n" +
+
+ "dn: ou=syntaxCheckers, cn=active-directory, ou=schema\n" +
+ "objectclass: organizationalUnit\n" +
+ "objectclass: top\n" +
+ "ou: syntaxCheckers\n\n" +
+
+ "dn: ou=syntaxes, cn=active-directory, ou=schema\n" +
+ "objectclass: organizationalUnit\n" +
+ "objectclass: top\n" +
+ "ou: syntaxes\n\n"
+ }
+)
+public class SchemaSearchIT
+{
+ private static final String DN = "cn=schema";
+ private static final String FILTER = "(objectclass=subschema)";
+
+
+ public static LdapServer ldapServer;
+
+
+ protected void checkForAttributes( Attributes attrs, String[] attrNames )
+ {
+ for ( int i = 0; i < attrNames.length; i++ )
+ {
+ String attrName = attrNames[i];
+
+ assertNotNull( "Check if attr " + attrName + " is present", attrs.get( attrNames[i] ) );
+ }
+ }
+
+
+ /**
+ * Check if modifyTimestamp and createTimestamp are present in the search result,
+ * if they are requested.
+ */
+ @Test
+ public void testRequestOperationalAttributes() throws Exception
+ {
+ DirContext ctx = getWiredContext( ldapServer );
+ SearchControls ctls = new SearchControls();
+
+ String[] attrNames =
+ { "creatorsName", "createTimestamp", "modifiersName", "modifyTimestamp" };
+
+ ctls.setSearchScope( SearchControls.OBJECT_SCOPE );
+ ctls.setReturningAttributes( attrNames );
+
+ NamingEnumeration<SearchResult> result = ctx.search( DN, FILTER, ctls );
+
+ if ( result.hasMore() )
+ {
+ SearchResult entry = result.next();
+ checkForAttributes( entry.getAttributes(), attrNames );
+ }
+ else
+ {
+ fail( "entry " + DN + " not found" );
+ }
+
+ result.close();
+ }
+
+
+ /**
+ * Check if modifyTimestamp and createTimestamp are present in the search result,
+ * if + is requested.
+ */
+ @Test
+ public void testRequestAllOperationalAttributes() throws Exception
+ {
+ DirContext ctx = getWiredContext( ldapServer );
+ SearchControls ctls = new SearchControls();
+
+ ctls.setSearchScope( SearchControls.OBJECT_SCOPE );
+ ctls.setReturningAttributes( new String[]
+ { "+" } );
+
+ NamingEnumeration<SearchResult> result = ctx.search( DN, FILTER, ctls );
+
+ if ( result.hasMore() )
+ {
+ SearchResult entry = result.next();
+ String[] attrNames =
+ { "creatorsName", "createTimestamp", "modifiersName", "modifyTimestamp" };
+ checkForAttributes( entry.getAttributes(), attrNames );
+ }
+ else
+ {
+ fail( "entry " + DN + " not found" );
+ }
+
+ result.close();
+ }
+
+
+ /**
+ * Test case for DIRSERVER-1083: Search on an custom attribute added to
+ * the dynamic schema fails when no result is found.
+ */
+ @Test
+ public void testSearchingNewSchemaElements() throws Exception
+ {
+ DirContext ctx = getWiredContext( ldapServer );
+
+ // create an entry with the schema objectClass personActiveDirectory
+ AttributesImpl person = new AttributesImpl( "objectClass", "top", true );
+ person.get( "objectClass" ).add( "person" );
+ person.get( "objectClass" ).add( "personActiveDirectory" );
+ person.put( "cn", "foobar" );
+ person.put( "sn", "bar" );
+ person.put( "pwdLastSet", "3" );
+ person.put( "SourceAD", "blah" );
+ person.put( "useraccountcontrol", "7" );
+ person.put( "sAMAccountName", "foobar" );
+ ctx.createSubcontext( "cn=foobar,ou=system", person );
+
+ // Confirm creation with a lookup
+ Attributes read = ctx.getAttributes( "cn=foobar,ou=system" );
+ assertNotNull( read );
+ assertEquals( "3", read.get( "pwdLastSet" ).get() );
+
+ // Now search for foobar with pwdLastSet value of 3
+ SearchControls searchControls = new SearchControls();
+ searchControls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
+ NamingEnumeration<SearchResult> results = ctx.search( "ou=system", "(pwdLastSet=3)", searchControls );
+ assertTrue( results.hasMore() );
+ SearchResult result = results.next();
+ assertNotNull( result );
+ assertEquals( "cn=foobar", result.getName() );
+ Attributes attributes = result.getAttributes();
+ assertEquals( "3", attributes.get( "pwdLastSet" ).get() );
+ results.close();
+
+ // Now search with bogus value for pwdLastSet
+ results = ctx.search( "ou=system", "(pwdLastSet=300)", searchControls );
+ assertFalse( results.hasMore() );
+ results.close();
+ }
+}