diff --git a/spring-ldap/src/test/java/org/springframework/ldap/core/DirContextAdapterBugTest.java b/spring-ldap/src/test/java/org/springframework/ldap/core/DirContextAdapterBugTest.java new file mode 100644 index 00000000..a12b7d5d --- /dev/null +++ b/spring-ldap/src/test/java/org/springframework/ldap/core/DirContextAdapterBugTest.java @@ -0,0 +1,90 @@ +/* + * Copyright 2002-2005 the original author or authors. + * + * 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.springframework.ldap.core; + +import javax.naming.Name; +import javax.naming.directory.Attributes; +import javax.naming.directory.BasicAttributes; + +import junit.framework.TestCase; + + +/** + * Unit tests that serve as regression tests for bugs that have been fixed. + * + * @author Luke Taylor + */ +public class DirContextAdapterBugTest extends TestCase { + + public void testResetAttributeValuesNotReportedAsModifications() { + BasicAttributes attrs = new BasicAttributes("myattr", "a"); + attrs.get("myattr").add("b"); + attrs.get("myattr").add("c"); + UpdateAdapter ctx = new UpdateAdapter(attrs, new DistinguishedName()); + + ctx.setAttributeValues("myattr", new String[] { "a", "b" }); + ctx.setAttributeValues("myattr", new String[] { "a", "b", "c" }); + + assertEquals(0, ctx.getModificationItems().length); + } + + public void testResetAttributeValuesSameLengthNotReportedAsModifications() { + BasicAttributes attrs = new BasicAttributes("myattr", "a"); + attrs.get("myattr").add("b"); + attrs.get("myattr").add("c"); + UpdateAdapter ctx = new UpdateAdapter(attrs, new DistinguishedName()); + + ctx.setAttributeValues("myattr", new String[] { "a", "b", "d" }); + ctx.setAttributeValues("myattr", new String[] { "a", "b", "c" }); + + assertEquals(0, ctx.getModificationItems().length); + } + + /** + * This test starts with an array with a null value in it (because that's + * how BasicAttributes will do it), changes to [a], and then + * changes to null. The current code interprets this as a + * change and will replace the original array with an empty array. + * + * TODO Is this correct behaviour? + */ + public void testResetNullAttributeValuesReportedAsModifications() { + BasicAttributes attrs = new BasicAttributes("myattr", null); + UpdateAdapter ctx = new UpdateAdapter(attrs, new DistinguishedName()); + + ctx.setAttributeValues("myattr", new String[] { "a" }); + ctx.setAttributeValues("myattr", null); + + assertEquals(1, ctx.getModificationItems().length); + } + + public void testResetNullAttributeValueNotReportedAsModification() throws Exception { + BasicAttributes attrs = new BasicAttributes("myattr", "b"); + UpdateAdapter ctx = new UpdateAdapter(attrs, new DistinguishedName()); + + ctx.setAttributeValue("myattr", "a"); + ctx.setAttributeValue("myattr", "b"); + + assertEquals(0, ctx.getModificationItems().length); + } + + private static class UpdateAdapter extends DirContextAdapter { + public UpdateAdapter(Attributes attrs, Name dn) { + super(attrs, dn); + setUpdateMode(true); + } + } +} diff --git a/spring-ldap/src/test/java/org/springframework/ldap/core/DirContextAdapterTest.java b/spring-ldap/src/test/java/org/springframework/ldap/core/DirContextAdapterTest.java new file mode 100644 index 00000000..ed9e5c43 --- /dev/null +++ b/spring-ldap/src/test/java/org/springframework/ldap/core/DirContextAdapterTest.java @@ -0,0 +1,692 @@ +/* + * Copyright 2002-2005 the original author or authors. + * + * 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.springframework.ldap.core; + +import javax.naming.Name; +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.ModificationItem; + +import junit.framework.TestCase; + + +/** + * Tests the DirContextAdapter class. + * + * @author Andreas Ronge + * @author Mattias Arthursson + */ +public class DirContextAdapterTest extends TestCase { + private static final DistinguishedName BASE_NAME = new DistinguishedName( + "dc=jayway, dc=se"); + + private static final DistinguishedName DUMMY_NAME = new DistinguishedName( + "c=SE, dc=jayway, dc=se"); + + private DirContextAdapter classUnderTest; + + protected void setUp() throws Exception { + super.setUp(); + classUnderTest = new DirContextAdapter(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } + + public void testSetUpdateMode() throws Exception { + assertFalse(classUnderTest.isUpdateMode()); + classUnderTest.setUpdateMode(true); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setUpdateMode(false); + assertFalse(classUnderTest.isUpdateMode()); + } + + public void testGetModificationItems() throws Exception { + ModificationItem[] items = classUnderTest.getModificationItems(); + assertEquals(0, items.length); + classUnderTest.setUpdateMode(true); + assertEquals(0, items.length); + } + + public void testAlwaysReplace() throws Exception { + ModificationItem[] items = classUnderTest.getModificationItems(); + assertEquals(0, items.length); + classUnderTest.setUpdateMode(true); + assertEquals(0, items.length); + } + + public void testGetStringAttributeNotExists() throws Exception { + String s = classUnderTest.getStringAttribute("does not exist"); + assertNull(s); + } + + public void testGetStringAttributeExists() throws Exception { + final Attributes attrs = new BasicAttributes(); + attrs.put(new BasicAttribute("abc", "def")); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(attrs, null); + } + } + classUnderTest = new TestableDirContextAdapter(); + String s = classUnderTest.getStringAttribute("abc"); + assertEquals("def", s); + } + + public void testGetStringAttributesExists() throws Exception { + final Attributes attrs = new BasicAttributes(); + Attribute multi = new BasicAttribute("abc"); + multi.add("123"); + multi.add("234"); + attrs.put(multi); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(attrs, null); + } + } + classUnderTest = new TestableDirContextAdapter(); + String s[] = classUnderTest.getStringAttributes("abc"); + assertEquals("123", s[0]); + assertEquals("234", s[1]); + assertEquals(2, s.length); + } + + public void testGetStringAttributesNotExists() throws Exception { + String s[] = classUnderTest.getStringAttributes("abc"); + assertNull(s); + } + + public void testSetStringAttribute() throws Exception { + assertFalse(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValue("abc", "123"); + Attributes attrs = classUnderTest.getAttributes(); + Attribute attr = attrs.get("abc"); + assertEquals("123", (String) attr.get()); + } + + public void testSetStringAttributeNull() throws Exception { + assertFalse(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValue("abc", null); + Attributes attrs = classUnderTest.getAttributes(); + Attribute attr = attrs.get("abc"); + assertNull(attr); + } + + public void testAddAttribute() throws Exception { + classUnderTest.setUpdateMode(true); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValue("abc", "123"); + Attributes attrs = classUnderTest.getAttributes(); + Attribute attr = attrs.get("abc"); + assertNull(attr); + + ModificationItem[] mods = classUnderTest.getModificationItems(); + assertEquals(1, mods.length); + assertEquals(DirContext.ADD_ATTRIBUTE, mods[0].getModificationOp()); + attr = mods[0].getAttribute(); + assertEquals("123", (String) attr.get()); + + String[] modNames = classUnderTest.getNamesOfModifiedAttributes(); + assertEquals(1, modNames.length); + assertEquals("abc", modNames[0]); + + classUnderTest.update(); + mods = classUnderTest.getModificationItems(); + assertEquals(0, mods.length); + modNames = classUnderTest.getNamesOfModifiedAttributes(); + assertEquals(0, modNames.length); + attrs = classUnderTest.getAttributes(); + attr = attrs.get("abc"); + assertEquals("123", (String) attr.get()); + } + + public void testGetDn() throws Exception { + DirContextAdapter tested = new DirContextAdapter(DUMMY_NAME); + Name result = tested.getDn(); + assertEquals(DUMMY_NAME, result); + } + + public void testGetDn_BasePath() { + DirContextAdapter tested = new DirContextAdapter(null, DUMMY_NAME, + BASE_NAME); + Name result = tested.getDn(); + assertEquals(DUMMY_NAME, result); + } + + public void testGetNameInNamespace() { + DirContextAdapter tested = new DirContextAdapter(DUMMY_NAME); + String result = tested.getNameInNamespace(); + assertEquals(DUMMY_NAME.toString(), result); + } + + public void testGetNameInNamespace_BasePath() { + DirContextAdapter tested = new DirContextAdapter(null, + new DistinguishedName("c=SE"), BASE_NAME); + String result = tested.getNameInNamespace(); + assertEquals(DUMMY_NAME.toString(), result); + } + + public void testAddMultiAttributes() throws Exception { + classUnderTest.setUpdateMode(true); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValues("abc", new String[] { "123", "456" }); + Attributes attrs = classUnderTest.getAttributes(); + Attribute attr = attrs.get("abc"); + assertNull(attr); + ModificationItem[] mods = classUnderTest.getModificationItems(); + assertEquals(1, mods.length); + assertEquals(DirContext.ADD_ATTRIBUTE, mods[0].getModificationOp()); + attr = mods[0].getAttribute(); + assertEquals(2, attr.size()); + assertEquals("123", (String) attr.get(0)); + assertEquals("456", (String) attr.get(1)); + + String[] modNames = classUnderTest.getNamesOfModifiedAttributes(); + assertEquals(1, modNames.length); + assertEquals("abc", modNames[0]); + + classUnderTest.update(); + mods = classUnderTest.getModificationItems(); + assertEquals(0, mods.length); + modNames = classUnderTest.getNamesOfModifiedAttributes(); + assertEquals(0, modNames.length); + attrs = classUnderTest.getAttributes(); + attr = attrs.get("abc"); + assertEquals("123", (String) attr.get(0)); + assertEquals("456", (String) attr.get(1)); + } + + public void testRemoveAttribute() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + fixtureAttrs.put(new BasicAttribute("abc", "123")); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + + classUnderTest.setUpdateMode(true); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValue("abc", null); + Attributes attrs = classUnderTest.getAttributes(); + Attribute attr = attrs.get("abc"); + assertEquals("123", (String) attr.get()); + + ModificationItem[] mods = classUnderTest.getModificationItems(); + assertEquals(1, mods.length); + assertEquals(DirContext.REMOVE_ATTRIBUTE, mods[0].getModificationOp()); + attr = mods[0].getAttribute(); + assertEquals("abc", (String) attr.getID()); + String[] modNames = classUnderTest.getNamesOfModifiedAttributes(); + assertEquals(1, modNames.length); + assertEquals("abc", modNames[0]); + + classUnderTest.update(); + mods = classUnderTest.getModificationItems(); + assertEquals(0, mods.length); + modNames = classUnderTest.getNamesOfModifiedAttributes(); + assertEquals(0, modNames.length); + attrs = classUnderTest.getAttributes(); + attr = attrs.get("abc"); + assertNull(attr); + } + + public void testRemoveMultiAttribute() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + Attribute abc = new BasicAttribute("abc"); + abc.add("123"); + abc.add("456"); + fixtureAttrs.put(abc); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + + classUnderTest.setUpdateMode(true); + classUnderTest.setAttributeValues("abc", new String[] {}); + + ModificationItem[] mods = classUnderTest.getModificationItems(); + assertEquals(1, mods.length); + assertEquals(DirContext.REMOVE_ATTRIBUTE, mods[0].getModificationOp()); + Attribute attr = mods[0].getAttribute(); + assertEquals("abc", (String) attr.getID()); + assertEquals(0, attr.size()); + } + + public void testChangeAttribute() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + fixtureAttrs.put(new BasicAttribute("abc", "123")); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + classUnderTest.setAttributeValue("abc", "234"); // change + + ModificationItem[] mods = classUnderTest.getModificationItems(); + assertEquals(1, mods.length); + assertEquals(DirContext.REPLACE_ATTRIBUTE, mods[0].getModificationOp()); + Attribute attr = mods[0].getAttribute(); + assertEquals("abc", (String) attr.getID()); + assertEquals("234", (String) attr.get()); + } + + public void testNoChangeAttribute() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + fixtureAttrs.put(new BasicAttribute("abc", "123")); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValue("abc", "123"); // change + + ModificationItem[] mods = classUnderTest.getModificationItems(); + assertEquals(0, mods.length); + } + + public void testNoChangeMultiAttribute() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + Attribute multi = new BasicAttribute("abc"); + multi.add("123"); + multi.add("qwe"); + fixtureAttrs.put(multi); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValues("abc", new String[] { "123", "qwe" }); + + ModificationItem[] mods = classUnderTest.getModificationItems(); + assertEquals(0, mods.length); + String[] modNames = classUnderTest.getNamesOfModifiedAttributes(); + assertEquals(0, modNames.length); + } + + public void testNoChangeMultiAttributeOrderDoesNotMatter() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + Attribute multi = new BasicAttribute("abc"); + multi.add("123"); + multi.add("qwe"); + fixtureAttrs.put(multi); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + classUnderTest.setAttributeValues("abc", new String[] { "qwe", "123" }); + + ModificationItem[] mods = classUnderTest.getModificationItems(); + assertEquals(0, mods.length); + String[] modNames = classUnderTest.getNamesOfModifiedAttributes(); + assertEquals(0, modNames.length); + } + + public void testChangeMultiAttributeOrderDoesMatter() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + Attribute multi = new BasicAttribute("abc"); + multi.add("123"); + multi.add("qwe"); + fixtureAttrs.put(multi); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValues("abc", new String[] { "qwe", "123" }, + true); + + // change + ModificationItem[] mods = classUnderTest.getModificationItems(); + assertEquals(1, mods.length); + assertEquals(DirContext.REPLACE_ATTRIBUTE, mods[0].getModificationOp()); + Attribute attr = mods[0].getAttribute(); + assertEquals("qwe", attr.get(0)); + assertEquals("123", attr.get(1)); + } + + public void testChangeMultiAttribute_AddValue() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + Attribute multi = new BasicAttribute("abc"); + multi.add("123"); + multi.add("qwe"); + fixtureAttrs.put(multi); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValues("abc", new String[] { "123", "qwe", + "klytt" }); + + ModificationItem[] modificationItems = classUnderTest + .getModificationItems(); + assertEquals(1, modificationItems.length); + assertEquals(DirContext.ADD_ATTRIBUTE, modificationItems[0] + .getModificationOp()); + assertEquals("klytt", modificationItems[0].getAttribute().get()); + } + + public void testChangeMultiAttribute_RemoveValue() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + Attribute multi = new BasicAttribute("abc"); + multi.add("123"); + multi.add("qwe"); + fixtureAttrs.put(multi); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValues("abc", new String[] { "123" }); + + ModificationItem[] modificationItems = classUnderTest + .getModificationItems(); + assertEquals(1, modificationItems.length); + assertEquals(DirContext.REMOVE_ATTRIBUTE, modificationItems[0] + .getModificationOp()); + assertEquals("qwe", modificationItems[0].getAttribute().get()); + } + + public void testChangeMultiAttribute_RemoveTwoValues() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + Attribute multi = new BasicAttribute("abc"); + multi.add("123"); + multi.add("qwe"); + multi.add("rty"); + fixtureAttrs.put(multi); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValues("abc", new String[] { "123" }); + + ModificationItem[] modificationItems = classUnderTest + .getModificationItems(); + assertEquals(1, modificationItems.length); + assertEquals(DirContext.REMOVE_ATTRIBUTE, modificationItems[0] + .getModificationOp()); + assertEquals("qwe", modificationItems[0].getAttribute().get(0)); + assertEquals("rty", modificationItems[0].getAttribute().get(1)); + } + + public void testChangeMultiAttribute_RemoveAllValues() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + Attribute multi = new BasicAttribute("abc"); + multi.add("123"); + multi.add("qwe"); + fixtureAttrs.put(multi); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValues("abc", null); + + ModificationItem[] modificationItems = classUnderTest + .getModificationItems(); + assertEquals(1, modificationItems.length); + assertEquals(DirContext.REMOVE_ATTRIBUTE, modificationItems[0] + .getModificationOp()); + } + + public void testChangeMultiAttribute_SameValue() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + Attribute multi = new BasicAttribute("abc"); + multi.add("123"); + multi.add("qwe"); + fixtureAttrs.put(multi); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValues("abc", new String[] { "123", "qwe" }); + + ModificationItem[] modificationItems = classUnderTest + .getModificationItems(); + assertEquals(0, modificationItems.length); + } + + public void testChangeMultiAttribute_AddAndRemoveValue() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + Attribute multi = new BasicAttribute("abc"); + multi.add("123"); + multi.add("qwe"); + multi.add("rty"); + multi.add("uio"); + fixtureAttrs.put(multi); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValues("abc", new String[] { "123", "qwe", + "klytt", "kalle" }); + + ModificationItem[] modificationItems = classUnderTest + .getModificationItems(); + assertEquals(2, modificationItems.length); + + assertEquals(DirContext.ADD_ATTRIBUTE, modificationItems[0] + .getModificationOp()); + Attribute modifiedAttribute = modificationItems[0].getAttribute(); + assertEquals("abc", modifiedAttribute.getID()); + assertEquals(2, modifiedAttribute.size()); + assertEquals("klytt", modifiedAttribute.get(0)); + assertEquals("kalle", modifiedAttribute.get(1)); + + modifiedAttribute = modificationItems[1].getAttribute(); + assertEquals(DirContext.REMOVE_ATTRIBUTE, modificationItems[1] + .getModificationOp()); + assertEquals("abc", modifiedAttribute.getID()); + assertEquals(2, modifiedAttribute.size()); + assertEquals("rty", modifiedAttribute.get(0)); + assertEquals("uio", modifiedAttribute.get(1)); + } + + public void testAddAttribute_Multivalue() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + Attribute multi = new BasicAttribute("abc"); + multi.add("123"); + multi.add("qwe"); + fixtureAttrs.put(multi); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValues("def", new String[] { "kalle", + "klytt" }); + + ModificationItem[] modificationItems = classUnderTest + .getModificationItems(); + assertEquals(1, modificationItems.length); + assertEquals("def", modificationItems[0].getAttribute().getID()); + } + + public void testChangeAttributeTwice() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + fixtureAttrs.put(new BasicAttribute("abc", "123")); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValue("abc", "234"); // change + classUnderTest.setAttributeValue("abc", "987"); + // change a second time + ModificationItem[] mods = classUnderTest.getModificationItems(); + assertEquals(1, mods.length); + assertEquals(DirContext.REPLACE_ATTRIBUTE, mods[0].getModificationOp()); + Attribute attr = mods[0].getAttribute(); + assertEquals("abc", (String) attr.getID()); + assertEquals("987", (String) attr.get()); + + classUnderTest.update(); + mods = classUnderTest.getModificationItems(); + assertEquals(0, mods.length); + String[] modNames = classUnderTest.getNamesOfModifiedAttributes(); + assertEquals(0, modNames.length); + Attributes attrs = classUnderTest.getAttributes(); + attr = attrs.get("abc"); + assertEquals("987", (String) attr.get()); + assertEquals("987", classUnderTest.getStringAttribute("abc")); + } + + public void testAddReplaceAndChangeAttribute() throws Exception { + final Attributes fixtureAttrs = new BasicAttributes(); + fixtureAttrs.put(new BasicAttribute("abc", "123")); + fixtureAttrs.put(new BasicAttribute("qwe", "42")); + class TestableDirContextAdapter extends DirContextAdapter { + public TestableDirContextAdapter() { + super(fixtureAttrs, null); + setUpdateMode(true); + } + } + classUnderTest = new TestableDirContextAdapter(); + assertTrue(classUnderTest.isUpdateMode()); + classUnderTest.setAttributeValue("abc", "234"); // change + classUnderTest.setAttributeValue("qwe", null); // remove + classUnderTest.setAttributeValue("zzz", "new"); // new + Attributes attrs = classUnderTest.getAttributes(); + Attribute attr = attrs.get("abc"); + assertEquals("123", (String) attr.get()); + assertEquals(2, attrs.size()); + + ModificationItem[] mods = classUnderTest.getModificationItems(); + assertEquals(3, mods.length); + String[] modNames = classUnderTest.getNamesOfModifiedAttributes(); + assertEquals(3, modNames.length); + + ModificationItem mod = getModificationItem(mods, + DirContext.REPLACE_ATTRIBUTE); + assertNotNull(mod); + attr = mod.getAttribute(); + assertEquals("abc", (String) attr.getID()); + assertEquals("234", (String) attr.get()); + + mod = getModificationItem(mods, DirContext.REMOVE_ATTRIBUTE); + assertNotNull(mod); + attr = mod.getAttribute(); + assertEquals("qwe", (String) attr.getID()); + + mod = getModificationItem(mods, DirContext.ADD_ATTRIBUTE); + assertNotNull(mod); + attr = mod.getAttribute(); + assertEquals("zzz", (String) attr.getID()); + assertEquals("new", (String) attr.get()); + + classUnderTest.update(); + mods = classUnderTest.getModificationItems(); + assertEquals(0, mods.length); + modNames = classUnderTest.getNamesOfModifiedAttributes(); + assertEquals(0, modNames.length); + + attrs = classUnderTest.getAttributes(); + assertEquals(2, attrs.size()); + attr = attrs.get("abc"); + assertEquals("234", (String) attr.get()); + assertEquals("new", classUnderTest.getStringAttribute("zzz")); + } + + /** + * Test for LDAP-15: DirContextAdapter.setAttribute(). Verifies that setting + * an Attribute should modify updatedAttrs if in update mode. + * + * @throws NamingException + */ + public void testSetAttribute_UpdateMode() throws NamingException { + // Set original attribute value + Attribute attribute = new BasicAttribute("cn", "john doe"); + classUnderTest.setAttribute(attribute); + + // Set to update mode + classUnderTest.setUpdateMode(true); + + // Perform test - update the attribute + Attribute updatedAttribute = new BasicAttribute("cn", "nisse hult"); + classUnderTest.setAttribute(updatedAttribute); + + // Verify result + ModificationItem[] mods = classUnderTest.getModificationItems(); + assertEquals(1, mods.length); + assertEquals(DirContext.REPLACE_ATTRIBUTE, mods[0].getModificationOp()); + + Attribute modificationAttribute = mods[0].getAttribute(); + assertEquals("cn", modificationAttribute.getID()); + assertEquals("nisse hult", modificationAttribute.get()); + } + + private ModificationItem getModificationItem(ModificationItem[] mods, + int operation) { + for (int i = 0; i < mods.length; i++) { + if (mods[i].getModificationOp() == operation) + return mods[i]; + } + return null; + } +} diff --git a/spring-ldap/src/test/java/org/springframework/ldap/core/DistinguishedNameTest.java b/spring-ldap/src/test/java/org/springframework/ldap/core/DistinguishedNameTest.java new file mode 100644 index 00000000..40f557b4 --- /dev/null +++ b/spring-ldap/src/test/java/org/springframework/ldap/core/DistinguishedNameTest.java @@ -0,0 +1,450 @@ +/* + * Copyright 2002-2005 the original author or authors. + * + * 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.springframework.ldap.core; + +import java.util.Enumeration; + +import javax.naming.CompositeName; +import javax.naming.InvalidNameException; +import javax.naming.Name; + +import org.springframework.ldap.core.DistinguishedName; + +import junit.framework.TestCase; + +import com.gargoylesoftware.base.testing.EqualsTester; + +/** + * Unit tests for the {@link DistinguishedName} class. + * + * @author Adam Skogman + * @author Mattias Arthursson + */ +public class DistinguishedNameTest extends TestCase { + + public void testDistinguishedName_CompositeWithSlash() throws Exception { + Name testPath = new CompositeName("cn=foo\\/bar"); + DistinguishedName path = new DistinguishedName(testPath.toString()); + assertEquals("cn=foo/bar", path.toString()); + } + + public void testEmptyPathImmutable() throws Exception { + DistinguishedName emptyPath = DistinguishedName.EMPTY_PATH; + try { + emptyPath.add("cn=John Doe"); + fail("UnsupportedOperationException expected"); + } catch (UnsupportedOperationException expected) { + assertTrue(true); + } + } + + public void testDistinguishedName() { + + String testPath = "cn=foo\\,bar,OU=FOO\\,bar , OU=foo\\;bar;OU=foo\\;bar" + + " ; ou=foo\\,,ou=foo\\,;ou=foo\\;;ou=foo\\,;ou=bar\\,"; + System.out.println(testPath); + + DistinguishedName path = new DistinguishedName(testPath); + + assertEquals("cn", path.getLdapRdn(8).getComponent().getKey()); + assertEquals("foo,bar", path.getLdapRdn(8).getComponent().getValue()); + assertEquals("ou", path.getLdapRdn(7).getComponent().getKey()); + assertEquals("FOO,bar", path.getLdapRdn(7).getComponent().getValue()); + assertEquals("ou", path.getLdapRdn(6).getComponent().getKey()); + assertEquals("foo;bar", path.getLdapRdn(6).getComponent().getValue()); + assertEquals("ou", path.getLdapRdn(5).getComponent().getKey()); + assertEquals("foo;bar", path.getLdapRdn(5).getComponent().getValue()); + assertEquals("ou", path.getLdapRdn(4).getComponent().getKey()); + assertEquals("foo,", path.getLdapRdn(4).getComponent().getValue()); + assertEquals("ou", path.getLdapRdn(3).getComponent().getKey()); + assertEquals("foo,", path.getLdapRdn(3).getComponent().getValue()); + assertEquals("ou", path.getLdapRdn(2).getComponent().getKey()); + assertEquals("foo;", path.getLdapRdn(2).getComponent().getValue()); + assertEquals("ou", path.getLdapRdn(1).getComponent().getKey()); + assertEquals("foo,", path.getLdapRdn(1).getComponent().getValue()); + assertEquals("ou", path.getLdapRdn(0).getComponent().getKey()); + assertEquals("bar,", path.getLdapRdn(0).getComponent().getValue()); + } + + public void testRemove() throws InvalidNameException { + + String testPath = "cn=john.doe, OU=Users,OU=Some Company,OU=G,OU=I,OU=M"; + DistinguishedName path = new DistinguishedName(testPath); + + path.remove(1); + path.remove(3); + + assertEquals("cn=john.doe, ou=Some Company, ou=G, ou=M", path + .toString()); + } + + /** + * Tests parsing and toString. + */ + public void testContains() { + + DistinguishedName migpath = new DistinguishedName("OU=G,OU=I,OU=M"); + DistinguishedName path1 = new DistinguishedName( + "cn=john.doe, OU=Users,OU=SE,OU=G,OU=I,OU=M"); + DistinguishedName path2 = new DistinguishedName( + "cn=john.doe, OU=Users,OU=SE,ou=G,OU=i,OU=M, ou=foo"); + DistinguishedName path3 = new DistinguishedName( + "ou=G,OU=i,OU=M, ou=foo"); + DistinguishedName path4 = new DistinguishedName("ou=G,OU=i,ou=m"); + + DistinguishedName pathE1 = new DistinguishedName( + "cn=john.doe, OU=Users,OU=SE,ou=G,OU=L,OU=M, ou=foo"); + DistinguishedName pathE2 = new DistinguishedName( + "cn=john.doe, OU=Users,OU=SE"); + + assertTrue("Contains MIG", path1.contains(migpath)); + assertTrue("Contains MIG", path2.contains(migpath)); + assertTrue("Contains MIG", path3.contains(migpath)); + assertTrue("Contains MIG", path4.contains(migpath)); + + assertFalse("Does not contain MIG", pathE1.contains(migpath)); + assertFalse("Does not contain MIG", pathE2.contains(migpath)); + } + + public void testAppend() { + DistinguishedName path1 = new DistinguishedName("ou=foo, OU=bar"); + DistinguishedName path2 = new DistinguishedName("OU=baz"); + + path1.append(path2); + + assertEquals("Append failed", "ou=baz, ou=foo, ou=bar", path1 + .toString()); + } + + public void testPrepend() { + DistinguishedName path1 = new DistinguishedName("ou=foo, OU=bar"); + DistinguishedName path2 = new DistinguishedName("cn=fie, OU=baz"); + + path1.prepend(path2); + + assertEquals("Append failed", "ou=foo, ou=bar, cn=fie, ou=baz", path1 + .toString()); + } + + public void testEquals() throws Exception { + + // original object + final Object originalObject = new DistinguishedName( + "cn=john.doe, OU=Users,OU=Some company,C=SE"); + + // another object that has the same values as the original + final Object identicalObject = new DistinguishedName( + "cn=john.doe, OU=Users,OU=Some company,C=SE"); + + // another object with different values + final Object differentObject = new DistinguishedName( + "cn=john.doe, OU=Users,OU=Some other company,C=SE"); + + // a subclass with the same values as the original + final Object subclassObject = new DistinguishedName( + "cn=john.doe, OU=Users,OU=Some company,C=SE") { + private static final long serialVersionUID = 1L; + }; + + new EqualsTester(originalObject, identicalObject, differentObject, + subclassObject); + } + + public void testClone() { + + DistinguishedName path1 = new DistinguishedName( + "cn=john.doe, OU=Users,OU=Some company,C=SE"); + + DistinguishedName path2 = (DistinguishedName) path1.clone(); + + assertEquals("Should be equal", path1, path2); + + path2.removeFirst(); + assertFalse("Should not be equal", path1.equals(path2)); + + } + + public void testEndsWith_true() { + DistinguishedName path1 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + DistinguishedName ending1 = new DistinguishedName("uid=mtah.test"); + + DistinguishedName path2 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + DistinguishedName ending2 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU"); + + assertTrue(path1.endsWith(ending1)); + assertTrue(path2.endsWith(ending2)); + } + + public void testEndsWith_false() { + DistinguishedName path1 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + DistinguishedName ending1 = new DistinguishedName("ou=people"); + + DistinguishedName path2 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + DistinguishedName ending2 = new DistinguishedName( + "ou=EU, o=example.com"); + + assertFalse(path1.endsWith(ending1)); + assertFalse(path2.endsWith(ending2)); + } + + public void testGetAll() throws Exception { + DistinguishedName path = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + + Enumeration elements = path.getAll(); + + String element = (String) elements.nextElement(); + assertEquals("o=example.com", element); + + element = (String) elements.nextElement(); + assertEquals("ou=EU", element); + + element = (String) elements.nextElement(); + assertEquals("ou=people", element); + + element = (String) elements.nextElement(); + assertEquals("uid=mtah.test", element); + } + + public void testGet() throws Exception { + DistinguishedName path = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + + String string = path.get(1); + + assertEquals("ou=EU", string); + } + + public void testSize() { + DistinguishedName path1 = new DistinguishedName(); + assertEquals(0, path1.size()); + + DistinguishedName path2 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + assertEquals(4, path2.size()); + } + + public void testGetPrefix() { + DistinguishedName path = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + + Name prefix = path.getPrefix(0); + assertEquals(0, prefix.size()); + + prefix = path.getPrefix(1); + assertEquals(1, prefix.size()); + assertEquals("o=example.com", prefix.get(0)); + + prefix = path.getPrefix(2); + assertEquals(2, prefix.size()); + assertEquals("o=example.com", prefix.get(0)); + assertEquals("ou=EU", prefix.get(1)); + } + + public void testGetSuffix() { + DistinguishedName path = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + + Name suffix = path.getSuffix(0); + assertEquals(4, suffix.size()); + + suffix = path.getSuffix(2); + assertEquals(2, suffix.size()); + assertEquals("ou=people", suffix.get(0)); + + suffix = path.getSuffix(4); + assertEquals(0, suffix.size()); + + try { + path.getSuffix(5); + fail("ArrayIndexOutOfBoundsException expected"); + } catch (ArrayIndexOutOfBoundsException expected) { + assertTrue(true); + } + } + + public void testStartsWith_true() { + DistinguishedName path1 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + DistinguishedName start1 = new DistinguishedName("o=example.com"); + + DistinguishedName path2 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + DistinguishedName start2 = new DistinguishedName( + "ou=people, ou=EU, o=example.com"); + + assertTrue(path1.startsWith(start1)); + assertTrue(path2.startsWith(start2)); + } + + public void testStartsWith_false() { + DistinguishedName path1 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + DistinguishedName start1 = new DistinguishedName("ou=people"); + + DistinguishedName path2 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + DistinguishedName start2 = new DistinguishedName( + "uid=mtah.test, ou=EU, ou=people"); + + assertFalse(path1.startsWith(start1)); + assertFalse(path2.startsWith(start2)); + } + + public void testStartsWith_Longer() { + DistinguishedName path1 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + + DistinguishedName path2 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com, o=a.com"); + + assertFalse(path1.startsWith(path2)); + } + + public void testStartsWith_EmptyPath() { + DistinguishedName path1 = new DistinguishedName( + "uid=mtah.test, ou=people, ou=EU, o=example.com"); + + DistinguishedName path2 = new DistinguishedName(); + + assertFalse(path1.startsWith(path2)); + } + + public void testIsEmpty_True() { + DistinguishedName path = new DistinguishedName(); + assertTrue(path.isEmpty()); + } + + public void testIsEmpty_False() { + DistinguishedName path = new DistinguishedName("o=example.com"); + assertFalse(path.isEmpty()); + } + + public void testAddAll() throws Exception { + DistinguishedName path1 = new DistinguishedName("ou=foo, OU=bar"); + DistinguishedName path2 = new DistinguishedName("OU=baz"); + + path1.addAll(path2); + + assertEquals("AddAll failed", "ou=baz, ou=foo, ou=bar", path1 + .toString()); + } + + public void testAddAll_Index() throws InvalidNameException { + DistinguishedName path1 = new DistinguishedName("ou=foo, OU=bar"); + DistinguishedName path2 = new DistinguishedName("OU=baz"); + + path1.addAll(1, path2); + + assertEquals("AddAll failed", "ou=foo, ou=baz, ou=bar", path1 + .toString()); + } + + public void testAdd() throws InvalidNameException { + DistinguishedName path1 = new DistinguishedName("ou=foo, ou=bar"); + path1.add("ou=baz"); + + assertEquals("Add failed", "ou=baz, ou=foo, ou=bar", path1.toString()); + } + + public void testAdd_Index() throws InvalidNameException { + DistinguishedName path1 = new DistinguishedName("ou=foo, ou=bar"); + path1.add(1, "ou=baz"); + + assertEquals("Add failed", "ou=foo, ou=baz, ou=bar", path1.toString()); + } + + public void testToUrl() { + DistinguishedName path = new DistinguishedName("dc=jayway, dc=se"); + String url = path.toUrl(); + + assertEquals("dc=jayway,dc=se", url); + } + + public void testMultiValueRdn() throws Exception { + DistinguishedName path = new DistinguishedName( + "firstName=Rod+lastName=Johnson,ou=UK,dc=interface21,dc=com"); + assertEquals(4, path.size()); + assertEquals("firstname=Rod+lastname=Johnson", path.get(3)); + } + + public void testCompareTo_Equals() throws Exception { + DistinguishedName name1 = new DistinguishedName( + "cn=john doe, ou=Some company, c=SE"); + DistinguishedName name2 = new DistinguishedName( + "cn=john doe, ou=Some company, c=SE"); + + int result = name1.compareTo(name2); + assertEquals(0, result); + } + + public void testCompareTo_Less() throws Exception { + DistinguishedName name1 = new DistinguishedName( + "cn=john doe, ou=Some company, c=DK"); + DistinguishedName name2 = new DistinguishedName( + "cn=john doe, ou=Some company, c=SE"); + + int result = name1.compareTo(name2); + assertTrue(result < 0); + } + + public void testCompareTo_Less_MoreSignificant() throws Exception { + DistinguishedName name1 = new DistinguishedName( + "an=john doe, ou=Some company, c=DK"); + DistinguishedName name2 = new DistinguishedName( + "cn=john doe, ou=Some company, c=SE"); + + int result = name1.compareTo(name2); + assertTrue(result < 0); + } + + public void testCompareTo_Greater() throws Exception { + DistinguishedName name1 = new DistinguishedName( + "cn=john doe, ou=Some company, c=SE"); + DistinguishedName name2 = new DistinguishedName( + "cn=john doe, ou=Some company, c=DK"); + + int result = name1.compareTo(name2); + assertTrue(result > 0); + } + + public void testCompareTo_Longer() throws Exception { + DistinguishedName name1 = new DistinguishedName( + "leaf=someleaf, cn=john doe, ou=Some company, c=SE"); + DistinguishedName name2 = new DistinguishedName( + "cn=john doe, ou=Some company, c=SE"); + + int result = name1.compareTo(name2); + assertTrue(result > 0); + } + + public void testCompareTo_Shorter() throws Exception { + DistinguishedName name1 = new DistinguishedName( + "cn=john doe, ou=Some company, c=SE"); + DistinguishedName name2 = new DistinguishedName( + "leaf=someleaf, cn=john doe, ou=Some company, c=SE"); + + int result = name1.compareTo(name2); + assertTrue(result < 0); + } + +} \ No newline at end of file diff --git a/spring-ldap/src/test/java/org/springframework/ldap/core/LdapRdnComponentTest.java b/spring-ldap/src/test/java/org/springframework/ldap/core/LdapRdnComponentTest.java new file mode 100644 index 00000000..003677d9 --- /dev/null +++ b/spring-ldap/src/test/java/org/springframework/ldap/core/LdapRdnComponentTest.java @@ -0,0 +1,57 @@ +/* + * Copyright 2002-2005 the original author or authors. + * + * 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.springframework.ldap.core; + +import org.springframework.ldap.core.LdapRdnComponent; + +import junit.framework.TestCase; + +/** + * Tests for LdapRdnComponent. + * + * @author Mattias Arthursson + */ +public class LdapRdnComponentTest extends TestCase { + + protected void setUp() throws Exception { + super.setUp(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } + + public void testCompareTo_Less() { + LdapRdnComponent component1 = new LdapRdnComponent("cn", "john doe"); + LdapRdnComponent component2 = new LdapRdnComponent("sn", "doe"); + int result = component1.compareTo(component2); + assertTrue(result < 0); + } + + public void testCompareTo_Greater() { + LdapRdnComponent component1 = new LdapRdnComponent("sn", "doe"); + LdapRdnComponent component2 = new LdapRdnComponent("cn", "john doe"); + int result = component1.compareTo(component2); + assertTrue(result > 0); + } + + public void testCompareTo_Equal() { + LdapRdnComponent component1 = new LdapRdnComponent("cn", "john doe"); + LdapRdnComponent component2 = new LdapRdnComponent("cn", "john doe"); + int result = component1.compareTo(component2); + assertEquals(0, result); + } +} \ No newline at end of file diff --git a/spring-ldap/src/test/java/org/springframework/ldap/core/LdapRdnTest.java b/spring-ldap/src/test/java/org/springframework/ldap/core/LdapRdnTest.java new file mode 100644 index 00000000..f9c31348 --- /dev/null +++ b/spring-ldap/src/test/java/org/springframework/ldap/core/LdapRdnTest.java @@ -0,0 +1,215 @@ +/* + * Copyright 2002-2005 the original author or authors. + * + * 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.springframework.ldap.core; + +import junit.framework.TestCase; + +import org.springframework.ldap.BadLdapGrammarException; +import org.springframework.ldap.core.LdapRdn; + +import com.gargoylesoftware.base.testing.EqualsTester; + +/** + * Unit test for the LdapRdn class. + * + * @author Adam Skogman + */ +public class LdapRdnTest extends TestCase { + + public void testLdapRdn_parse_simple() { + + LdapRdn rdn = new LdapRdn("foo=bar"); + + assertEquals("foo", rdn.getComponent().getKey()); + assertEquals("bar", rdn.getComponent().getValue()); + assertEquals("foo=bar", rdn.getComponent().getLdapEncoded()); + } + + public void testLdapRdn_parse_spaces() { + + LdapRdn rdn = new LdapRdn(" foo = bar "); + + assertEquals("foo", rdn.getComponent().getKey()); + assertEquals("bar", rdn.getComponent().getValue()); + assertEquals("foo=bar", rdn.getComponent().getLdapEncoded()); + } + + public void testLdapRdn_parse_escape() { + + LdapRdn rdn = new LdapRdn("foo=bar\\=fum"); + + assertEquals("foo", rdn.getComponent().getKey()); + assertEquals("bar=fum", rdn.getComponent().getValue()); + assertEquals("foo=bar\\=fum", rdn.getComponent().getLdapEncoded()); + } + + public void testLdapRdn_parse_hexEscape() { + + LdapRdn rdn = new LdapRdn("foo=bar\\0dfum"); + + assertEquals("foo", rdn.getComponent().getKey()); + assertEquals("bar\rfum", rdn.getComponent().getValue()); + assertEquals("foo=bar\\0Dfum", rdn.getComponent().getLdapEncoded()); + } + + public void testLdapRdn_parse_trailingBackslash() { + + try { + new LdapRdn("foo=bar\\"); + fail("Should throw BadLdapGrammarException"); + } catch (BadLdapGrammarException e) { + assertTrue(true); + } + } + + public void testLdapRdn_parse_spaces_escape() { + + LdapRdn rdn = new LdapRdn(" foo = \\ bar\\20 \\ "); + + assertEquals("foo", rdn.getComponent().getKey()); + assertEquals(" bar ", rdn.getComponent().getValue()); + assertEquals("foo=\\ bar \\ ", rdn.getComponent().getLdapEncoded()); + } + + public void testLdapRdn_parse_tooMuchTrim() { + try { + new LdapRdn("foo=bar\\"); + fail("Should throw BadLdapGrammarException"); + } catch (BadLdapGrammarException e) { + assertTrue(true); + } + } + + public void testLdapRdn_parse_slash() { + LdapRdn rdn = new LdapRdn("ou=Clerical / Secretarial Staff"); + + assertEquals("ou", rdn.getComponent().getKey()); + assertEquals("Clerical / Secretarial Staff", rdn.getComponent() + .getValue()); + assertEquals("ou=Clerical / Secretarial Staff", rdn.getComponent() + .getLdapEncoded()); + } + + public void testLdapRdn_parse_quoteInKey() { + try { + new LdapRdn("\"umanroleid=2583"); + fail("Should throw BadLdapGrammarException"); + } catch (BadLdapGrammarException e) { + assertTrue(true); + } + } + + public void testLdapRdn_KeyValue_simple() { + LdapRdn rdn = new LdapRdn("foo", "bar"); + + assertEquals("foo", rdn.getComponent().getKey()); + assertEquals("bar", rdn.getComponent().getValue()); + assertEquals("foo=bar", rdn.getComponent().getLdapEncoded()); + } + + public void testLdapRdn_KeyValue_valueNeedsEscape() { + LdapRdn rdn = new LdapRdn("foo", "bar\\"); + + assertEquals("foo", rdn.getComponent().getKey()); + assertEquals("bar\\", rdn.getComponent().getValue()); + assertEquals("foo=bar\\\\", rdn.getComponent().getLdapEncoded()); + } + + public void testEncodeUrl() { + LdapRdn rdn = new LdapRdn("o = example.com "); + assertEquals("o=example.com", rdn.encodeUrl()); + } + + public void testEncodeUrl_SpacesInValue() { + LdapRdn rdn = new LdapRdn("o = my organization "); + assertEquals("o=my%20organization", rdn.encodeUrl()); + } + + public void testLdapRdn_Parse_MultipleComponents() { + LdapRdn rdn = new LdapRdn("cn=John Doe+sn=Doe"); + assertEquals("cn=John Doe", rdn.getComponent(0).encodeLdap()); + assertEquals("sn=Doe", rdn.getComponent(1).encodeLdap()); + assertEquals("cn=John Doe+sn=Doe", rdn.getLdapEncoded()); + } + + public void testEquals() throws Exception { + // original object + final Object originalObject = new LdapRdn("cn", "john.doe"); + + // another object that has the same values as the original + final Object identicalObject = new LdapRdn("cn", "john.doe"); + + // another object with different values + final Object differentObject = new LdapRdn("cn", "john.svensson"); + + // a subclass with the same values as the original + final Object subclassObject = new LdapRdn("cn", "john.doe") { + private static final long serialVersionUID = 1L; + }; + + new EqualsTester(originalObject, identicalObject, differentObject, + subclassObject); + } + + public void testCompareTo_Equals() throws Exception { + LdapRdn rdn1 = new LdapRdn("cn=john doe"); + LdapRdn rdn2 = new LdapRdn("cn=john doe"); + + int result = rdn1.compareTo(rdn2); + assertEquals(0, result); + } + + public void testCompareTo_EqualsComplex() throws Exception { + LdapRdn rdn1 = new LdapRdn("cn=john doe+sn=doe"); + LdapRdn rdn2 = new LdapRdn("cn=john doe+sn=doe"); + + int result = rdn1.compareTo(rdn2); + assertEquals(0, result); + } + + public void testCompareTo_Less() { + LdapRdn rdn1 = new LdapRdn("cn=john doe+sn=doe"); + LdapRdn rdn2 = new LdapRdn("cn=john doe+tn=doe"); + + int result = rdn1.compareTo(rdn2); + assertTrue(result < 0); + } + + public void testCompareTo_Greater() { + LdapRdn rdn1 = new LdapRdn("cn=john doe+sn=doe"); + LdapRdn rdn2 = new LdapRdn("cn=john doe+an=doe"); + + int result = rdn1.compareTo(rdn2); + assertTrue(result > 0); + } + + public void testCompareTo_Shorter() { + LdapRdn rdn1 = new LdapRdn("cn=john doe+sn=doe"); + LdapRdn rdn2 = new LdapRdn("cn=john doe+sn=doe+description=tjo"); + + int result = rdn1.compareTo(rdn2); + assertTrue(result < 0); + } + + public void testCompareTo_Longer() { + LdapRdn rdn1 = new LdapRdn("cn=john doe+sn=doe+description=tjo"); + LdapRdn rdn2 = new LdapRdn("cn=john doe+sn=doe"); + + int result = rdn1.compareTo(rdn2); + assertTrue(result > 0); + } +}