package protocoltests.jndi.ops.compare; 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.InitialDirContext; import javax.naming.directory.NoSuchAttributeException; import javax.naming.directory.SearchControls; import junit.framework.TestCase; /** * Tests for the Compare operation. To illustrate DIREVE-226 "Compare operation * on non existing or invalid attributes causes wrong return codes" * * @author szoerner */ public class BasicCompareTests extends TestCase { DirContext ctx; 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 { ctx = new InitialDirContext(); // Create a person Attributes attributes = this.getPersonAttributes("Amos", "Tori Amos"); ctx.createSubcontext(RDN, attributes); } public void tearDown() throws NamingException { ctx.unbind(RDN); ctx.close(); ctx = null; } /** * Compare an existing attribute. * * @throws NamingException */ public void testCompareExisting() throws NamingException { // Setting up search controls SearchControls ctls = new SearchControls(); ctls.setReturningAttributes(new String[0]); // no attributes ctls.setSearchScope(SearchControls.OBJECT_SCOPE); // search operation, which leads to a compare // value is correct NamingEnumeration enumeration = ctx.search(RDN, "sn={0}", new String[] { "Amos" }, ctls); // Check, that result contains exactly one entry boolean result = enumeration.hasMore(); assertTrue(result); if (result) { enumeration.next(); assertFalse(enumeration.hasMore()); } // search operation, which leads to a compare // value is wrong enumeration = ctx.search(RDN, "sn={0}", new String[] { "Bush" }, ctls); // Check, that result contains no entry result = enumeration.hasMore(); assertFalse(result); } /** * Compare an nonexisting attribute. * * @throws NamingException */ public void testCompareNonExisting() throws NamingException { // Setting up search controls SearchControls ctls = new SearchControls(); ctls.setReturningAttributes(new String[0]); // no attributes ctls.setSearchScope(SearchControls.OBJECT_SCOPE); // search operation, which leads to a compare // entry has no value for attribute try { NamingEnumeration enumeration = ctx.search(RDN, "description={0}", new String[] { "a description" }, ctls); fail("operation should cause an error"); } catch (NoSuchAttributeException nsae) { // expected behaviour } } /** * Compare an invalid attribute. * * @throws NamingException */ public void testCompareInvalidAttribute() throws NamingException { // Setting up search controls SearchControls ctls = new SearchControls(); ctls.setReturningAttributes(new String[0]); // no attributes ctls.setSearchScope(SearchControls.OBJECT_SCOPE); // search operation, which leads to a compare // attribute does not exist try { NamingEnumeration enumeration = ctx.search(RDN, "XXX={0}", new String[] { "a value" }, ctls); fail("operation should cause an error"); } catch (NamingException iaie) { // expected behaviour // I am uncertain, whether Return code 16 or 17 is appropriate here. // both values occur, depending on the server you use // 16: noSuchAttribute // 17: undefinedAttributeType } } }