You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by sz...@apache.org on 2005/10/07 22:27:30 UTC

svn commit: r307188 [2/2] - in /directory/testsuite/trunk/ldaptests: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/ldap/ src/main/java/org/apache/ldap/testsuite/ src/main/java/org/apache/ldap/tes...

Added: directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modify/BasicModifyReplaceTests.java
URL: http://svn.apache.org/viewcvs/directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modify/BasicModifyReplaceTests.java?rev=307188&view=auto
==============================================================================
--- directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modify/BasicModifyReplaceTests.java (added)
+++ directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modify/BasicModifyReplaceTests.java Fri Oct  7 13:27:08 2005
@@ -0,0 +1,134 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.apache.ldap.testsuite.ldaptests.jndi.ops.modify;
+
+import javax.naming.NamingException;
+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 org.apache.ldap.testsuite.ldaptests.jndi.BaseProtocolTest;
+
+/**
+ * Tests for the modify operations with JNDI, which only include replace
+ * modifications.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: $
+ */
+public class BasicModifyReplaceTests extends BaseProtocolTest
+{
+
+    DirContext ctx;
+
+    DirContext target;
+
+    public static final String RDN = "cn=Tori Amos";
+
+    protected Attributes getPersonAttributes(String sn, String cn)
+    {
+        Attributes attributes = new BasicAttributes();
+        Attribute attribute = new BasicAttribute("objectClass");
+        attribute.add("top");
+        attribute.add("person");
+        attributes.put(attribute);
+        attributes.put("cn", cn);
+        attributes.put("sn", sn);
+
+        return attributes;
+    }
+
+    public void setUp() throws NamingException
+    {
+        super.setUp();
+
+        ctx = this.createContext();
+        target = (DirContext) ctx.lookup(this.getTestContainerRdn());
+
+        // Create a person with description
+        Attributes attributes = this.getPersonAttributes("Amos", "Tori Amos");
+        attributes.put("description", "an American singer-songwriter");
+
+        target.createSubcontext(RDN, attributes);
+    }
+
+    public void tearDown() throws NamingException
+    {
+        target.unbind(RDN);
+        target.close();
+
+        ctx.close();
+        ctx = null;
+
+        super.tearDown();
+    }
+
+    /**
+     * Replace a not required attribute.
+     * 
+     * Expected result: After successful deletion, attribute is not present in
+     * entry
+     * 
+     * @throws NamingException
+     */
+    public void testReplaceNotRequiredAttribute() throws NamingException
+    {
+
+        // Change description attribute
+        String newValue = "A new description for this person";
+        Attribute attr = new BasicAttribute("description", newValue);
+        Attributes attrs = new BasicAttributes();
+        attrs.put(attr);
+        target.modifyAttributes(RDN, DirContext.REPLACE_ATTRIBUTE, attrs);
+
+        // Verify, that attribute value changed
+        attrs = target.getAttributes(RDN);
+        attr = attrs.get("description");
+        assertTrue(attr.contains(newValue));
+        assertEquals(1, attr.size());
+
+    }
+
+    /**
+     * Try to Replace RDN.
+     * 
+     * @throws NamingException
+     */
+    public void testTryToReplaceRdn() throws NamingException
+    {
+
+        // Change RDN attribute cn
+        String newValue = "New Value";
+        Attribute attr = new BasicAttribute("cn", newValue);
+        Attributes attrs = new BasicAttributes();
+        attrs.put(attr);
+        try {
+            target.modifyAttributes(RDN, DirContext.REPLACE_ATTRIBUTE, attrs);
+        } catch (NamingException e) {
+            // expected behaviour
+            // TODO: refine Exception
+        }
+
+        // Verify, that attribute value has not changed
+        attrs = target.getAttributes(RDN);
+        attr = attrs.get("cn");
+        assertEquals(1, attr.size());
+        assertFalse(attr.contains(newValue));
+    }
+}
\ No newline at end of file

Added: directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modify/MixedModifyFailureTests.java
URL: http://svn.apache.org/viewcvs/directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modify/MixedModifyFailureTests.java?rev=307188&view=auto
==============================================================================
--- directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modify/MixedModifyFailureTests.java (added)
+++ directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modify/MixedModifyFailureTests.java Fri Oct  7 13:27:08 2005
@@ -0,0 +1,181 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.apache.ldap.testsuite.ldaptests.jndi.ops.modify;
+
+import javax.naming.InvalidNameException;
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.AttributeInUseException;
+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.SchemaViolationException;
+
+import org.apache.ldap.testsuite.ldaptests.jndi.BaseProtocolTest;
+
+/**
+ * Tests with several modification items within one modify operation, which
+ * cause an error. Goal is to chcek whether the modify operation is atomic.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: $
+ */
+public class MixedModifyFailureTests extends BaseProtocolTest
+{
+
+    DirContext start;
+
+    DirContext ctx;
+
+    public static final String RDN = "cn=Tori Amos";
+
+    public static final String PERSON_DESCRIPTION = "an American singer-songwriter";
+
+    protected Attributes getPersonAttributes(String sn, String cn)
+    {
+        Attributes attributes = new BasicAttributes();
+        Attribute attribute = new BasicAttribute("objectClass");
+        attribute.add("top");
+        attribute.add("person");
+        attributes.put(attribute);
+        attributes.put("cn", cn);
+        attributes.put("sn", sn);
+
+        return attributes;
+    }
+
+    public void setUp() throws NamingException
+    {
+        super.setUp();
+
+        start = this.createContext();
+        ctx = (DirContext) start.lookup(this.getTestContainerRdn());
+
+        // Create a person with description
+        Attributes attributes = this.getPersonAttributes("Amos", "Tori Amos");
+        attributes.put("description", PERSON_DESCRIPTION);
+
+        ctx.createSubcontext(RDN, attributes);
+    }
+
+    public void tearDown() throws NamingException
+    {
+        ctx.unbind(RDN);
+        ctx.close();
+
+        start.close();
+        start = null;
+
+        super.tearDown();
+    }
+
+    /**
+     * Try to add a new attribute (allowed) and to replace the RDN attribute
+     * (forbidden).
+     * 
+     * @throws NamingException
+     */
+    public void testAddAndIllegalReplace() throws NamingException
+    {
+
+        // Add telephoneNumber attribute
+        String newValue = "1234567890";
+        Attribute telephoneNumber = new BasicAttribute("telephoneNumber", newValue);
+        ModificationItem modAdd = new ModificationItem(DirContext.ADD_ATTRIBUTE, telephoneNumber);
+
+        // Try to replace a desciption value, which does not exist
+        Attribute cn = new BasicAttribute("cn", "XXX");
+        ModificationItem modReplace = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, cn);
+
+        // execute modify: 1. add, 2. replace
+        ModificationItem[] mods = new ModificationItem[] { modAdd, modReplace };
+        try {
+            ctx.modifyAttributes(RDN, mods);
+            fail("mofify operation should fail.");
+        } catch (SchemaViolationException e) {
+            // Expected behaviour
+        } catch (InvalidNameException e) {
+            // Expected behaviour
+        }
+
+        // Verify, that no telephone attribute was created, and cn has bot been
+        // changed
+        Attributes attrs = ctx.getAttributes(RDN);
+        assertNull(attrs.get("telephoneNumber"));
+        cn = attrs.get("cn");
+        assertNotNull(cn);
+        assertTrue(cn.contains("Tori Amos"));
+
+        // Mix the sequence of modification items: 1. replace, 2. add
+        mods = new ModificationItem[] { modReplace, modAdd };
+        try {
+            ctx.modifyAttributes(RDN, mods);
+            fail("modify operation should fail.");
+        } catch (SchemaViolationException e) {
+            // Expected behaviour
+        } catch (InvalidNameException e) {
+            // Expected behaviour
+        }
+
+        // Verify again, that no telephone attribute was created, and cn has bot
+        // been changed
+        attrs = ctx.getAttributes(RDN);
+        assertNull(attrs.get("telephoneNumber"));
+        cn = attrs.get("cn");
+        assertNotNull(cn);
+        assertTrue(cn.contains("Tori Amos"));
+    }
+
+    /**
+     * Try to remove an attribute (allowed) and add an attribute value twice
+     * (forbidden) within one modify op. Expected behaviour is that the modify
+     * op fails and the entry is not changed.
+     * 
+     * @throws NamingException
+     */
+    public void testRemoveAndDuplicateAdd() throws NamingException
+    {
+
+        // Remove description attribute
+        Attribute description = new BasicAttribute("description");
+        ModificationItem modRemove = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, description);
+
+        // Try to add a new desciption value
+        Attribute telephoneNumber = new BasicAttribute("telephoneNumber", "01234567890");
+        ModificationItem modAdd = new ModificationItem(DirContext.ADD_ATTRIBUTE, telephoneNumber);
+
+        // execute modify: 1. remove, 2. add, 3. same add
+        ModificationItem[] mods = new ModificationItem[] { modRemove, modAdd, modAdd };
+        try {
+            ctx.modifyAttributes(RDN, mods);
+            fail("modify operation should fail.");
+        } catch (AttributeInUseException e) {
+            // Expected behaviour
+        }
+
+        // Verify, that description has not been removed, and telephoneNumber
+        // has not been added
+        Attributes attrs = ctx.getAttributes(RDN);
+        System.err.println(attrs);
+        description = attrs.get("description");
+        assertNotNull(description);
+        assertTrue(description.contains(PERSON_DESCRIPTION));
+        assertNull(attrs.get("telephoneNumber"));
+    }
+}
\ No newline at end of file

Added: directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modifydn/AllTests.java
URL: http://svn.apache.org/viewcvs/directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modifydn/AllTests.java?rev=307188&view=auto
==============================================================================
--- directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modifydn/AllTests.java (added)
+++ directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modifydn/AllTests.java Fri Oct  7 13:27:08 2005
@@ -0,0 +1,37 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.apache.ldap.testsuite.ldaptests.jndi.ops.modifydn;
+
+import junit.framework.TestSuite;
+
+/**
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: $
+ */
+public class AllTests extends TestSuite
+{
+
+    public static TestSuite suite()
+    {
+        TestSuite suite = new TestSuite("Modify DN");
+
+        suite.addTestSuite(BasicModifyDnTests.class);
+        suite.addTestSuite(ModifyDnSameAttributeTests.class);
+
+        return suite;
+    }
+}

Added: directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modifydn/BasicModifyDnTests.java
URL: http://svn.apache.org/viewcvs/directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modifydn/BasicModifyDnTests.java?rev=307188&view=auto
==============================================================================
--- directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modifydn/BasicModifyDnTests.java (added)
+++ directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modifydn/BasicModifyDnTests.java Fri Oct  7 13:27:08 2005
@@ -0,0 +1,188 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.apache.ldap.testsuite.ldaptests.jndi.ops.modifydn;
+
+import javax.naming.NameAlreadyBoundException;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+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.SchemaViolationException;
+
+import org.apache.ldap.testsuite.ldaptests.jndi.BaseProtocolTest;
+
+/**
+ * Basic Tests for the Modify DN operation.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: $
+ */
+public class BasicModifyDnTests extends BaseProtocolTest
+{
+
+    /**
+     * Creates attributes for a inetOrgPerson with minimum required attributes.
+     * 
+     * @param sn
+     *            sn value of the person (surname)
+     * @param cn
+     *            cn value of the person (common name)
+     * @return attributes object for this person
+     */
+    protected Attributes getInetOrgPersonAttributes(String sn, String cn)
+    {
+        Attributes attributes = new BasicAttributes();
+        Attribute attribute = new BasicAttribute("objectClass");
+        attribute.add("top");
+        attribute.add("person");
+        attribute.add("organizationalPerson");
+        attribute.add("inetOrgPerson");
+        attributes.put(attribute);
+        attributes.put("cn", cn);
+        attributes.put("sn", sn);
+
+        return attributes;
+    }
+
+    /**
+     * Modify DN of an entry, changing RDN from cn to uid.
+     * 
+     * @throws NamingException
+     */
+    public void testModifyRdnAndKeepOld() throws NamingException
+    {
+        DirContext ctx = this.createContext();
+        DirContext target = (DirContext) ctx.lookup(this.getTestContainerRdn());
+
+        // Create a person, cn value is rdn
+        String cnVal = "Tori Amos";
+        String snVal = "Amos";
+        String uidVal = "tamos";
+        String oldRdn = "cn=" + cnVal;
+        Attributes attributes = this.getInetOrgPersonAttributes(snVal, cnVal);
+        attributes.put("uid", uidVal);
+        target.createSubcontext(oldRdn, attributes);
+
+        // modify Rdn
+        String newRdn = "uid=" + uidVal;
+        target.addToEnvironment("java.naming.ldap.deleteRDN", "false");
+        target.rename(oldRdn, newRdn);
+
+        // Check, whether old Entry does not exists
+        try {
+            target.lookup(oldRdn);
+            fail("Entry must not exist");
+        } catch (NameNotFoundException ignored) {
+            // expected behaviour
+        }
+
+        // Check, whether new Entry exists
+        DirContext tori = (DirContext) target.lookup(newRdn);
+        assertNotNull(tori);
+
+        // Check values of cn and uid
+        Attribute cn = tori.getAttributes("").get("cn");
+        assertTrue(cn.contains(cnVal));
+        assertEquals(1, cn.size());
+        Attribute uid = tori.getAttributes("").get("uid");
+        assertTrue(uid.contains(uidVal));
+        assertEquals(1, uid.size());
+
+        ctx.close();
+    }
+
+    /**
+     * Modify Rdn of an entry, changing it from cn to uid, but try delete old
+     * rdn. This should cause a schema violation.
+     * 
+     * @throws NamingException
+     */
+    public void testModifyRdnAndTryToDeleteOld() throws NamingException
+    {
+
+        DirContext ctx = this.createContext();
+        DirContext target = (DirContext) ctx.lookup(this.getTestContainerRdn());
+
+        // Create a person, cn value is rdn
+        String cnVal = "Tori Amos";
+        String snVal = "Amos";
+        String uidVal = "tamos";
+        String oldRdn = "cn=" + cnVal;
+        Attributes attributes = this.getInetOrgPersonAttributes(snVal, cnVal);
+        target.createSubcontext(oldRdn, attributes);
+
+        // modify Rdn, but try delete old val
+        try {
+            String newRdn = "uid=" + uidVal;
+            target.addToEnvironment("java.naming.ldap.deleteRDN", "true");
+            target.rename(oldRdn, newRdn);
+            fail("modify DN should cause a schema violation");
+        } catch (SchemaViolationException sve) {
+            // expected behaviour
+        }
+
+        // Check that old entry still exists
+        DirContext tori = (DirContext) target.lookup(oldRdn);
+        assertNotNull(tori);
+
+        ctx.close();
+    }
+
+    /**
+     * Modify Rdn of an entry, changing it from cn to uid. But an entry with
+     * corresponding RDN already exists. This should cause an exception.
+     * 
+     * @throws NamingException
+     */
+    public void testModifyRdnToExistingValue() throws NamingException
+    {
+
+        DirContext ctx = this.createContext();
+        DirContext target = (DirContext) ctx.lookup(this.getTestContainerRdn());
+
+        // Create a person, cn value is rdn
+        String cnVal = "Tori Amos";
+        String snVal = "Amos";
+        String oldRdn = "cn=" + cnVal;
+        String uidVal = "tamos";
+        Attributes attributes = this.getInetOrgPersonAttributes(snVal, cnVal);
+        target.createSubcontext(oldRdn, attributes);
+
+        // create same person with sn as RDN
+        String newRdn = "uid=" + uidVal;
+        attributes.put("uid", uidVal);
+        target.createSubcontext(newRdn, attributes);
+
+        // modify DN, use existing value
+        target.addToEnvironment("java.naming.ldap.deleteRDN", "false");
+        try {
+            target.rename(oldRdn, newRdn);
+            fail("modify DN should cause an exception");
+        } catch (NameAlreadyBoundException nbe) {
+            // expected behaviour
+        }
+
+        // Check that old entry still exists
+        DirContext tori = (DirContext) target.lookup(oldRdn);
+        assertNotNull(tori);
+
+        ctx.close();
+    }
+}
\ No newline at end of file

Added: directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modifydn/ModifyDnSameAttributeTests.java
URL: http://svn.apache.org/viewcvs/directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modifydn/ModifyDnSameAttributeTests.java?rev=307188&view=auto
==============================================================================
--- directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modifydn/ModifyDnSameAttributeTests.java (added)
+++ directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/modifydn/ModifyDnSameAttributeTests.java Fri Oct  7 13:27:08 2005
@@ -0,0 +1,203 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.apache.ldap.testsuite.ldaptests.jndi.ops.modifydn;
+
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+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 org.apache.ldap.testsuite.ldaptests.jndi.BaseProtocolTest;
+
+/**
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: $
+ */
+public class ModifyDnSameAttributeTests extends BaseProtocolTest
+{
+
+    protected Attributes getPersonAttributes(String sn, String cn)
+    {
+        Attributes attributes = new BasicAttributes();
+        Attribute attribute = new BasicAttribute("objectClass");
+        attribute.add("top");
+        attribute.add("person");
+        attributes.put(attribute);
+        attributes.put("cn", cn);
+        attributes.put("sn", sn);
+        attributes.put("description", cn + " is a person.");
+
+        return attributes;
+    }
+
+    protected Attributes getOrganizationalUnitAttributes(String ou)
+    {
+        Attributes attributes = new BasicAttributes();
+        Attribute attribute = new BasicAttribute("objectClass");
+        attribute.add("top");
+        attribute.add("organizationalUnit");
+        attributes.put(attribute);
+        attributes.put("ou", ou);
+
+        return attributes;
+    }
+
+    /**
+     * Modify Rdn of an entry, delete its old rdn value.
+     * 
+     * @throws NamingException
+     */
+    public void testModifyRdnAndDeleteOld() throws NamingException
+    {
+        DirContext ctx = this.createContext();
+        DirContext target = (DirContext) ctx.lookup(this.getTestContainerRdn());
+
+        // Create an organizational unit, ou value is rdn
+        String oldOu = "Judean People's Front";
+        String oldRdn = "ou=" + oldOu;
+        Attributes attributes = this.getOrganizationalUnitAttributes(oldOu);
+        target.createSubcontext(oldRdn, attributes);
+
+        // modify Rdn
+        String newOu = "People's Front of Judea";
+        String newRdn = "ou=" + newOu;
+        target.addToEnvironment("java.naming.ldap.deleteRDN", "true");
+        target.rename(oldRdn, newRdn);
+
+        // Check, whether old Entry does not exists
+        try {
+            target.lookup(oldRdn);
+            fail("Entry must not exist");
+        } catch (NameNotFoundException ignored) {
+            // expected behaviour
+            assertTrue(true);
+        }
+
+        // Check, whether new Entry exists
+        DirContext ouEntry = (DirContext) target.lookup(newRdn);
+        assertNotNull(ouEntry);
+
+        // Check values of ou
+        Attribute ou = ouEntry.getAttributes("").get("ou");
+        assertTrue(ou.contains(newOu));
+        assertTrue(!ou.contains(oldOu)); // old vaue is gone
+        assertEquals(1, ou.size());
+
+        ctx.close();
+    }
+
+    /**
+     * Modify Rdn of an entry, keep its old rdn value.
+     * 
+     * @throws NamingException
+     */
+    public void testModifyRdnAndKeepOld() throws NamingException
+    {
+
+        DirContext ctx = this.createContext();
+        DirContext target = (DirContext) ctx.lookup(this.getTestContainerRdn());
+
+        // Create an organizational unit, ou value is rdn
+        String oldOu = "Judean People's Front";
+        String oldRdn = "ou=" + oldOu;
+        Attributes attributes = this.getOrganizationalUnitAttributes(oldOu);
+        target.createSubcontext(oldRdn, attributes);
+
+        // modify Rdn
+        String newOu = "People's Front of Judea";
+        String newRdn = "ou=" + newOu;
+        target.addToEnvironment("java.naming.ldap.deleteRDN", "false");
+        target.rename(oldRdn, newRdn);
+
+        // Check, whether old entry does not exist
+        try {
+            target.lookup(oldRdn);
+            fail("Entry must not exist");
+        } catch (NameNotFoundException ignored) {
+            // expected behaviour
+            assertTrue(true);
+        }
+
+        // Check, whether new entry exists
+        DirContext ouEntry = (DirContext) target.lookup(newRdn);
+        assertNotNull(ouEntry);
+
+        // Check values of cn
+        Attribute ou = ouEntry.getAttributes("").get("ou");
+        assertTrue(ou.contains(newOu));
+        assertTrue(ou.contains(oldOu)); // old value is still present
+        assertEquals(2, ou.size());
+
+        ouEntry.close();
+        target.close();
+        ctx.close();
+    }
+
+    /**
+     * Modify Rdn of an entry, delete its old rdn value. Here, the rdn attribute
+     * cn has another value as well.
+     * 
+     * @throws NamingException
+     */
+    public void testModifyRdnAndDeleteOldVariant() throws NamingException
+    {
+        DirContext ctx = this.createContext();
+        DirContext target = (DirContext) ctx.lookup(this.getTestContainerRdn());
+
+        // Create an organizational unit, ou value is rdn
+        String oldOu = "Judean People's Front";
+        String oldRdn = "ou=" + oldOu;
+        Attributes attributes = this.getOrganizationalUnitAttributes(oldOu);
+
+        // add a second ou value
+        String alternateOu = "J.P.F.";
+        Attribute ou = attributes.get("ou");
+        ou.add(alternateOu);
+        assertEquals(2, ou.size());
+
+        target.createSubcontext(oldRdn, attributes);
+
+        // modify Rdn
+        String newOu = "People's Front of Judea";
+        String newRdn = "ou=" + newOu;
+        target.addToEnvironment("java.naming.ldap.deleteRDN", "true");
+        target.rename(oldRdn, newRdn);
+
+        // Check, whether old Entry does not exist anymore
+        try {
+            target.lookup(oldRdn);
+            fail("Entry must not exist");
+        } catch (NameNotFoundException ignored) {
+            // expected behaviour
+            assertTrue(true);
+        }
+
+        // Check, whether new Entry exists
+        DirContext ouEntry = (DirContext) target.lookup(newRdn);
+        assertNotNull(ouEntry);
+
+        // Check values of cn
+        ou = ouEntry.getAttributes("").get("ou");
+        assertTrue(ou.contains(newOu));
+        assertTrue(!ou.contains(oldOu)); // old value is gone
+        assertTrue(ou.contains(alternateOu)); // alternate value is still
+        assertEquals(2, ou.size());
+    }
+}

Added: directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/AllTests.java
URL: http://svn.apache.org/viewcvs/directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/AllTests.java?rev=307188&view=auto
==============================================================================
--- directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/AllTests.java (added)
+++ directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/AllTests.java Fri Oct  7 13:27:08 2005
@@ -0,0 +1,37 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.apache.ldap.testsuite.ldaptests.jndi.ops.search;
+
+import junit.framework.TestSuite;
+
+/**
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: $
+ */
+public class AllTests extends TestSuite
+{
+
+    public static TestSuite suite()
+    {
+        TestSuite suite = new TestSuite("Search");
+
+        suite.addTestSuite(SearchScopeTest.class);
+        suite.addTestSuite(IllegalSearchFilterTest.class);
+
+        return suite;
+    }
+}

Added: directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/IllegalSearchFilterTest.java
URL: http://svn.apache.org/viewcvs/directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/IllegalSearchFilterTest.java?rev=307188&view=auto
==============================================================================
--- directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/IllegalSearchFilterTest.java (added)
+++ directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/IllegalSearchFilterTest.java Fri Oct  7 13:27:08 2005
@@ -0,0 +1,94 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.apache.ldap.testsuite.ldaptests.jndi.ops.search;
+
+import javax.naming.NamingException;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.InvalidSearchFilterException;
+import javax.naming.directory.SearchControls;
+
+import org.apache.ldap.testsuite.ldaptests.jndi.BaseProtocolTest;
+
+/**
+ * Tests for the search operations with JNDI which use illegal search filters.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: $
+ */
+public class IllegalSearchFilterTest extends BaseProtocolTest
+{
+
+    private DirContext ctx;
+
+    public void setUp() throws NamingException
+    {
+        super.setUp();
+
+        ctx = this.createContext();
+        ctx = (DirContext) ctx.lookup(this.getTestContainerRdn());
+    }
+
+    public void tearDown() throws NamingException
+    {
+        ctx.close();
+        ctx = null;
+
+        super.tearDown();
+    }
+
+    public void testFiltersWithSyntaxErrors() throws NamingException
+    {
+
+        SearchControls ctls = new SearchControls();
+        ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
+
+        String[] filters = { null, "", ",", "&", "1", "This is no filter" };
+
+        for (int i = 0; i < filters.length; i++) {
+            String filter = filters[i];
+
+            // Search
+            try {
+                ctx.search("", filter, ctls);
+                fail("Filter [" + filter + "] has syntax errors and should cause an error.");
+            } catch (InvalidSearchFilterException e) {
+                // Expected behaviour
+            }
+        }
+    }
+
+    public void testFilterWithUnbalancedParenthesis() throws NamingException
+    {
+
+        SearchControls ctls = new SearchControls();
+        ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
+
+        String[] filters = { "((sn=Amos)", "(&(sn=Amos)(cn=Tori Amos)", "(!(sn=Amos)" };
+
+        for (int i = 0; i < filters.length; i++) {
+            String filter = filters[i];
+
+            // Search
+            try {
+                ctx.search("", filter, ctls);
+                fail("Filter [" + filter + "] has unbalanced parenthesis and should cause an error.");
+            } catch (InvalidSearchFilterException e) {
+                // Expected behaviour
+            }
+        }
+    }
+}
\ No newline at end of file

Added: directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/SearchFilterSimpleTest.java
URL: http://svn.apache.org/viewcvs/directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/SearchFilterSimpleTest.java?rev=307188&view=auto
==============================================================================
--- directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/SearchFilterSimpleTest.java (added)
+++ directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/SearchFilterSimpleTest.java Fri Oct  7 13:27:08 2005
@@ -0,0 +1,174 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.apache.ldap.testsuite.ldaptests.jndi.ops.search;
+
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+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.SearchControls;
+import javax.naming.directory.SearchResult;
+
+import org.apache.ldap.testsuite.ldaptests.jndi.BaseProtocolTest;
+
+/**
+ * Tests for the search operations with JNDI.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: $
+ */
+public class SearchFilterSimpleTest extends BaseProtocolTest
+{
+
+    private DirContext ctx;
+
+    static final String[] firstNames = { "Tori", "Heather", "Alanis", "Kate", "Fiona" };
+
+    static final String[] lastNames = { "Amos", "Nova", "Morisette", "Bush", "Apple" };
+
+    protected Attributes getPersonAttributes(Person p)
+    {
+        Attributes attributes = new BasicAttributes();
+        Attribute attribute = new BasicAttribute("objectClass");
+        attribute.add("top");
+        attribute.add("person");
+        attributes.put(attribute);
+        attributes.put("sn", p.sn);
+        attributes.put("cn", p.cn);
+
+        return attributes;
+    }
+
+    public void setUp() throws NamingException
+    {
+        super.setUp();
+
+        ctx = this.createContext();
+        ctx = (DirContext) ctx.lookup(this.getTestContainerRdn());
+
+        for (int i = 0; i < lastNames.length; ++i) {
+            Person p = new Person(firstNames[i], lastNames[i]);
+            ctx.createSubcontext("cn=" + p.cn, getPersonAttributes(p));
+        }
+    }
+
+    public void tearDown() throws NamingException
+    {
+        ctx.close();
+        ctx = null;
+
+        super.tearDown();
+    }
+
+    public void testSimpleFilter() throws NamingException
+    {
+
+        SearchControls ctls = new SearchControls();
+        ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
+
+        NamingEnumeration enm = ctx.search("", "sn=Amos", ctls);
+        assertTrue(enm.hasMore());
+        int numberOfEntries = 0;
+        while (enm.hasMore()) {
+            SearchResult entry = (SearchResult) enm.next();
+            Attributes attrs = entry.getAttributes();
+            Attribute sn = attrs.get("sn");
+
+            assertEquals(1, sn.size());
+            assertTrue(sn.contains("Amos"));
+
+            numberOfEntries++;
+        }
+
+        assertEquals("number of entries in result", 1, numberOfEntries);
+    }
+
+    public void testFilterWithNot() throws NamingException
+    {
+
+        SearchControls ctls = new SearchControls();
+        ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
+
+        NamingEnumeration enm = ctx.search("", "(!(sn=Amos))", ctls);
+        assertTrue(enm.hasMore());
+        int numberOfEntries = 0;
+        while (enm.hasMore()) {
+            SearchResult entry = (SearchResult) enm.next();
+            Attributes attrs = entry.getAttributes();
+            Attribute sn = attrs.get("sn");
+
+            assertFalse(sn.contains("Amos"));
+
+            numberOfEntries++;
+        }
+        assertEquals("number of entries in result", firstNames.length - 1, numberOfEntries);
+    }
+
+    public void testFilterWithAnd() throws NamingException
+    {
+
+        SearchControls ctls = new SearchControls();
+        ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+
+        NamingEnumeration enm = ctx.search("", "(&(objectClass=person)(sn=Amos))", ctls);
+        assertTrue(enm.hasMore());
+        int numberOfEntries = 0;
+        while (enm.hasMore()) {
+            SearchResult entry = (SearchResult) enm.next();
+            Attributes attrs = entry.getAttributes();
+            Attribute sn = attrs.get("sn");
+            assertTrue(sn.contains("Amos"));
+            numberOfEntries++;
+        }
+        assertEquals("number of entries in result", 1, numberOfEntries);
+    }
+
+    public void testFilterWithOr() throws NamingException
+    {
+
+        SearchControls ctls = new SearchControls();
+        ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+
+        NamingEnumeration enm = ctx.search("", "(|(cn=Kate Bush)(sn=Amos))", ctls);
+        assertTrue(enm.hasMore());
+        int numberOfEntries = 0;
+        while (enm.hasMore()) {
+            SearchResult entry = (SearchResult) enm.next();
+            Attributes attrs = entry.getAttributes();
+            Attribute sn = attrs.get("sn");
+            assertTrue(sn.contains("Amos") || sn.contains("Bush"));
+            numberOfEntries++;
+        }
+        assertEquals("number of entries in result", 2, numberOfEntries);
+    }
+
+    class Person
+    {
+
+        Person(String firstName, String lastName) {
+            this.sn = lastName;
+            this.cn = firstName + " " + lastName;
+        }
+
+        String sn;
+
+        String cn;
+    }
+}
\ No newline at end of file

Added: directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/SearchScopeTest.java
URL: http://svn.apache.org/viewcvs/directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/SearchScopeTest.java?rev=307188&view=auto
==============================================================================
--- directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/SearchScopeTest.java (added)
+++ directory/testsuite/trunk/ldaptests/src/main/java/org/apache/ldap/testsuite/ldaptests/jndi/ops/search/SearchScopeTest.java Fri Oct  7 13:27:08 2005
@@ -0,0 +1,163 @@
+/*
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.apache.ldap.testsuite.ldaptests.jndi.ops.search;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+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.SearchControls;
+import javax.naming.directory.SearchResult;
+
+import org.apache.ldap.testsuite.ldaptests.jndi.BaseProtocolTest;
+
+/**
+ * Tests for the search operations with JNDI.
+ * 
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev: $
+ */
+public class SearchScopeTest extends BaseProtocolTest
+{
+
+    private DirContext ctx;
+
+    private static final String MATCH_ALL_FILTER = "(objectClass=*)";
+
+    private static final String UNITS_NAME = "units";
+
+    private static final String UNITS_RDN = "ou=" + UNITS_NAME;
+
+    private static final int SUBTREE_LEVEL_DEPTH = 2;
+
+    private static final int ENTRIES_PER_LEVEL = 3;
+
+    protected Attributes getOrganizationalUnitAttributes(String ou)
+    {
+        Attributes attributes = new BasicAttributes();
+        Attribute attribute = new BasicAttribute("objectClass");
+        attribute.add("top");
+        attribute.add("organizationalUnit");
+        attributes.put(attribute);
+        attributes.put("ou", ou);
+
+        return attributes;
+    }
+
+    protected void createSubtrees(DirContext target, int depth, int maxDepth, int count) throws NamingException
+    {
+        if (depth < maxDepth) {
+            for (int i = 0; i < count; ++i) {
+                String ou = "unit_" + depth + "_" + (i);
+                Attributes attr = this.getOrganizationalUnitAttributes(ou);
+                DirContext entry = target.createSubcontext("ou=" + ou, attr);
+                createSubtrees(entry, depth + 1, maxDepth, count);
+            }
+        }
+
+    }
+
+    public void setUp() throws NamingException
+    {
+        super.setUp();
+
+        ctx = this.createContext();
+        ctx = (DirContext) ctx.lookup(this.getTestContainerRdn());
+
+        DirContext units = ctx.createSubcontext(UNITS_RDN, getOrganizationalUnitAttributes(UNITS_NAME));
+        createSubtrees(units, 0, SUBTREE_LEVEL_DEPTH, ENTRIES_PER_LEVEL);
+
+    }
+
+    public void tearDown() throws NamingException
+    {
+        ctx.close();
+        ctx = null;
+
+        super.tearDown();
+    }
+
+    public void testBaseScopeExisting() throws NamingException
+    {
+
+        SearchControls ctls = new SearchControls();
+        ctls.setSearchScope(SearchControls.OBJECT_SCOPE);
+        ctls.setReturningAttributes(new String[] { "ou" });
+
+        // Search
+        NamingEnumeration enm = ctx.search(UNITS_RDN, MATCH_ALL_FILTER, ctls);
+
+        // Exactly one entry in result
+        assertTrue(enm.hasMore());
+        SearchResult sr = (SearchResult) enm.next();
+        assertFalse(enm.hasMore());
+
+        // The right entry in result
+        Attributes attrs = sr.getAttributes();
+        Attribute ou = attrs.get("ou");
+        assertTrue(ou.contains(UNITS_NAME));
+    }
+
+    public void testBaseScopeNotExistingBase() throws NamingException
+    {
+
+        SearchControls ctls = new SearchControls();
+        ctls.setSearchScope(SearchControls.OBJECT_SCOPE);
+        ctls.setReturningAttributes(new String[] { "ou" });
+
+        try {
+            ctx.search(UNITS_RDN + "_", MATCH_ALL_FILTER, ctls);
+            fail("Search on a not existing base should fail");
+        } catch (NameNotFoundException nnfe) {
+            // expected behaviour
+        }
+    }
+
+    public void testOneLevelScope() throws NamingException
+    {
+
+        SearchControls ctls = new SearchControls();
+        ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
+        ctls.setReturningAttributes(new String[] { "ou" });
+
+        // Search op
+        //
+        NamingEnumeration enm = ctx.search(UNITS_RDN, MATCH_ALL_FILTER, ctls);
+
+        // Analyse result data
+        assertTrue(enm.hasMore());
+        Set entries = new HashSet();
+        int count = 0;
+        while (enm.hasMore()) {
+            count++;
+            SearchResult sr = (SearchResult) enm.next();
+            Attribute ou = sr.getAttributes().get("ou");
+            entries.add(ou.get());
+        }
+        assertEquals("number of entries in result", ENTRIES_PER_LEVEL, count);
+        assertEquals("number of different entries in result", ENTRIES_PER_LEVEL, entries.size());
+        assertFalse("base included in result", entries.contains(UNITS_NAME));
+    }
+}
\ No newline at end of file