From e63a6c5198279a4426472682e50e694b0bcd814c Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 23 Sep 2013 11:31:04 +0000
Subject: [PATCH] LDAPURLTest.java: ADDED
---
opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/LDAPURLTest.java | 302 ++++++++++++++++++++++++++++++++++++++++++++++++++
opendj-sdk/opends/src/server/org/opends/server/types/LDAPURL.java | 3
2 files changed, 303 insertions(+), 2 deletions(-)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/types/LDAPURL.java b/opendj-sdk/opends/src/server/org/opends/server/types/LDAPURL.java
index 27f7054..a1e9d5b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/types/LDAPURL.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/types/LDAPURL.java
@@ -661,8 +661,7 @@
* to decode the contents of the
* provided string.
*/
- private static String urlDecode(String s)
- throws DirectoryException
+ static String urlDecode(String s) throws DirectoryException
{
if (s == null)
{
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/LDAPURLTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/LDAPURLTest.java
new file mode 100644
index 0000000..d5e68e2
--- /dev/null
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/types/LDAPURLTest.java
@@ -0,0 +1,302 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Copyright 2013 ForgeRock AS
+ */
+package org.opends.server.types;
+
+import org.opends.server.TestCaseUtils;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.testng.Assert.*;
+
+@SuppressWarnings("javadoc")
+@Test(groups = { "precommit", "types" }, sequential = true)
+public class LDAPURLTest extends TypesTestCase
+{
+
+ private static final String DEFAULT_SEARCH_FILTER = "(objectClass=*)";
+ private static final String DEFAULT_END_URL = "??base?" + DEFAULT_SEARCH_FILTER;
+
+ @BeforeClass
+ public void setup() throws Exception
+ {
+ TestCaseUtils.startServer();
+ }
+
+ @Test(expectedExceptions = DirectoryException.class)
+ public void decodeWithNoSchemeSeparator() throws Exception
+ {
+ final String sample = "";
+ LDAPURL.decode(sample, true);
+ }
+
+ @Test(expectedExceptions = DirectoryException.class)
+ public void decodeNoSchemeWithSchemeSeparator() throws Exception
+ {
+ final String sample = "://localhost:389/??sub?objectclass=person";
+ LDAPURL.decode(sample, true);
+ }
+
+ @Test(expectedExceptions = DirectoryException.class)
+ public void decodeNoHost() throws Exception
+ {
+ final String sample = "ldap://:389";
+ LDAPURL.decode(sample, true);
+ }
+
+ @Test(expectedExceptions = DirectoryException.class)
+ public void decodeNoPort() throws Exception
+ {
+ final String sample = "ldap://localhost:";
+ LDAPURL.decode(sample, true);
+ }
+
+ @Test(expectedExceptions = DirectoryException.class)
+ public void decodeNotAPortNumber() throws Exception
+ {
+ final String sample = "ldap://localhost:port";
+ LDAPURL.decode(sample, true);
+ }
+
+ public void decodeSampleLDAP() throws Exception
+ {
+ final String sample = "ldap://";
+ final LDAPURL ldapURL = LDAPURL.decode(sample, true);
+ assertThat(ldapURL.getScheme()).isEqualTo("ldap");
+ assertThat(ldapURL.getHost()).isNull();
+ assertDefaultValues(ldapURL);
+ assertThat(ldapURL.toString()).isEqualTo(sample + "/" + DEFAULT_END_URL);
+ }
+
+ public void decodeSampleLDAPS() throws Exception
+ {
+ final String sample = "ldaps://";
+ final LDAPURL ldapURL = LDAPURL.decode(sample, true);
+ assertThat(ldapURL.getScheme()).isEqualTo("ldaps");
+ assertThat(ldapURL.getHost()).isNull();
+ assertDefaultValues(ldapURL);
+ assertThat(ldapURL.toString()).isEqualTo(sample + "/" + DEFAULT_END_URL);
+ }
+
+ public void decodeSampleLDAPWithUselessSlash() throws Exception
+ {
+ final String sample = "ldap:///";
+ final LDAPURL ldapURL = LDAPURL.decode(sample, true);
+ assertThat(ldapURL.getScheme()).isEqualTo("ldap");
+ assertThat(ldapURL.getHost()).isNull();
+ assertDefaultValues(ldapURL);
+ assertThat(ldapURL.toString()).isEqualTo(sample + DEFAULT_END_URL);
+ }
+
+ @DataProvider
+ public Object[][] numberQuestionsMarks()
+ {
+ return new Object[][] { { 0 }, { 1 }, { 2 }, { 3 }, { 4 }, };
+ }
+
+ @Test(dataProvider = "numberQuestionsMarks")
+ public void decodeSampleLDAPWithUselessQuestionMarks(int nbQuestionMarks)
+ throws Exception
+ {
+ StringBuilder sb = new StringBuilder("ldap://localhost/");
+ for (int i = 0; i < nbQuestionMarks; i++)
+ {
+ sb.append("?");
+ }
+ final String sample = sb.toString();
+ final LDAPURL ldapURL = LDAPURL.decode(sample, true);
+ assertThat(ldapURL.getScheme()).isEqualTo("ldap");
+ assertThat(ldapURL.getHost()).isEqualTo("localhost");
+ assertDefaultValues(ldapURL);
+ assertThat(ldapURL.toString()).isEqualTo("ldap://localhost:389/" + DEFAULT_END_URL);
+ }
+
+ private void assertDefaultValues(final LDAPURL ldapURL) throws Exception
+ {
+ assertThat(ldapURL.getPort()).isEqualTo(389);
+ assertThat(ldapURL.getRawBaseDN()).isNullOrEmpty();
+ assertThat(ldapURL.getAttributes()).isEmpty();
+ assertThat(ldapURL.getScope()).isEqualTo(SearchScope.BASE_OBJECT);
+ assertThat(ldapURL.getRawFilter()).isEqualToIgnoringCase(DEFAULT_SEARCH_FILTER);
+ assertThat(ldapURL.getFilter()).isEqualTo(LDAPURL.DEFAULT_SEARCH_FILTER);
+ assertThat(ldapURL.getExtensions()).isEmpty();
+ }
+
+ public void decodeSampleLDAPWithAttributes() throws Exception
+ {
+ final String sample = "ldap://localhost/?cn,tel,mail";
+ final LDAPURL ldapURL = LDAPURL.decode(sample, true);
+ assertThat(ldapURL.getScheme()).isEqualTo("ldap");
+ assertThat(ldapURL.getHost()).isEqualTo("localhost");
+ assertThat(ldapURL.getPort()).isEqualTo(389);
+ assertThat(ldapURL.getRawBaseDN()).isNullOrEmpty();
+ assertThat(ldapURL.getAttributes()).containsOnly("cn", "tel", "mail");
+ assertThat(ldapURL.getScope()).isEqualTo(SearchScope.BASE_OBJECT);
+ assertThat(ldapURL.getRawFilter()).isEqualToIgnoringCase("(objectClass=*)");
+ assertThat(ldapURL.getExtensions()).isEmpty();
+ assertThat(ldapURL.toString()).isEqualTo("ldap://localhost:389/?cn,tel,mail?base?" + DEFAULT_SEARCH_FILTER);
+ }
+
+ public void decodeSampleLDAPWithExtensions() throws Exception
+ {
+ final String sample = "ldap://localhost/????ext1,ext2,ext3";
+ final LDAPURL ldapURL = LDAPURL.decode(sample, true);
+ assertThat(ldapURL.getScheme()).isEqualTo("ldap");
+ assertThat(ldapURL.getHost()).isEqualTo("localhost");
+ assertThat(ldapURL.getPort()).isEqualTo(389);
+ assertThat(ldapURL.getRawBaseDN()).isNullOrEmpty();
+ assertThat(ldapURL.getAttributes()).isEmpty();
+ assertThat(ldapURL.getScope()).isEqualTo(SearchScope.BASE_OBJECT);
+ assertThat(ldapURL.getRawFilter()).isEqualToIgnoringCase(DEFAULT_SEARCH_FILTER);
+ assertThat(ldapURL.getFilter()).isEqualTo(LDAPURL.DEFAULT_SEARCH_FILTER);
+ assertThat(ldapURL.getExtensions()).containsOnly("ext1", "ext2", "ext3");
+ assertThat(ldapURL.toString()).isEqualTo("ldap://localhost:389/" + DEFAULT_END_URL + "?ext1,ext2,ext3");
+ }
+
+ @DataProvider
+ public Object[][] allSearchScopes()
+ {
+ return new Object[][] {
+ { "", SearchScope.BASE_OBJECT }, // this is the default
+ { "base", SearchScope.BASE_OBJECT },
+ { "one", SearchScope.SINGLE_LEVEL },
+ { "sub", SearchScope.WHOLE_SUBTREE },
+ { "subord", SearchScope.SUBORDINATE_SUBTREE },
+ { "subordinate", SearchScope.SUBORDINATE_SUBTREE },
+ };
+ }
+
+ @Test(dataProvider = "allSearchScopes")
+ public void decodeSimpleSample(String actualSearchScope,
+ SearchScope expectedSearchScope) throws Exception
+ {
+ final String sample = "ldap://localhost/??" + actualSearchScope;
+ final LDAPURL ldapURL = LDAPURL.decode(sample, true);
+ assertThat(ldapURL.getScheme()).isEqualTo("ldap");
+ assertThat(ldapURL.getHost()).isEqualTo("localhost");
+ assertThat(ldapURL.getPort()).isEqualTo(389);
+ assertThat(ldapURL.getRawBaseDN()).isEqualTo("");
+ assertThat(ldapURL.getAttributes()).isEmpty();
+ assertThat(ldapURL.getScope()).isEqualTo(expectedSearchScope);
+ assertThat(ldapURL.getRawFilter()).isEqualToIgnoringCase(DEFAULT_SEARCH_FILTER);
+ assertThat(ldapURL.getFilter()).isEqualTo(LDAPURL.DEFAULT_SEARCH_FILTER);
+ assertThat(ldapURL.getExtensions()).isEmpty();
+
+ // tweaks for the next assert
+ if ("".equals(actualSearchScope))
+ {
+ actualSearchScope = "base";
+ }
+ else if ("subord".equals(actualSearchScope))
+ {
+ actualSearchScope = "subordinate";
+ }
+ assertThat(ldapURL.toString()).isEqualTo(
+ "ldap://localhost:389/??" + actualSearchScope + "?" + DEFAULT_SEARCH_FILTER);
+ }
+
+ @Test(expectedExceptions = DirectoryException.class)
+ public void decodeInvalidSearchScope() throws Exception
+ {
+ final String sample = "ldap://localhost/??unheardOf";
+ LDAPURL.decode(sample, true);
+ }
+
+ public void decodeComplexSample() throws Exception
+ {
+ final String sample =
+ "ldap://ldap.netscape.com:1389/ou=Sales,o=Netscape,c=US?cn,tel,mail?sub?(objectclass=person)?ext1,ext2,ext3";
+ final LDAPURL ldapURL = LDAPURL.decode(sample, true);
+ assertThat(ldapURL.getScheme()).isEqualTo("ldap");
+ assertThat(ldapURL.getHost()).isEqualTo("ldap.netscape.com");
+ assertThat(ldapURL.getPort()).isEqualTo(1389);
+ assertThat(ldapURL.getRawBaseDN()).isEqualTo("ou=Sales,o=Netscape,c=US");
+ assertThat(ldapURL.getAttributes()).containsOnly("cn", "tel", "mail");
+ assertThat(ldapURL.getScope()).isEqualTo(SearchScope.WHOLE_SUBTREE);
+ assertThat(ldapURL.getRawFilter()).isEqualToIgnoringCase("(objectClass=person)");
+ assertThat(ldapURL.getExtensions()).containsOnly("ext1", "ext2", "ext3");
+ assertThat(ldapURL.toString()).isEqualToIgnoringCase(sample);
+ }
+
+ public void decodeComplexSampleWithUrlDecode() throws Exception
+ {
+ final String sample =
+ "ld%2Fap://ldap.netsca%2Fpe.com:1389/ou=Sa%2Fles,o=Netscape,c=US?c%2Fn,tel,mail?sub?(objectclass=per%2Fson)?ext%2F1,ext%2F2,ext%2F3";
+ final LDAPURL ldapURL = LDAPURL.decode(sample, true);
+ assertThat(ldapURL.getScheme()).isEqualTo("ld/ap");
+ assertThat(ldapURL.getHost()).isEqualTo("ldap.netsca/pe.com");
+ assertThat(ldapURL.getPort()).isEqualTo(1389);
+ assertThat(ldapURL.getRawBaseDN()).isEqualTo("ou=Sa/les,o=Netscape,c=US");
+ assertThat(ldapURL.getAttributes()).containsOnly("c/n", "tel", "mail");
+ assertThat(ldapURL.getScope()).isEqualTo(SearchScope.WHOLE_SUBTREE);
+ assertThat(ldapURL.getRawFilter()).isEqualToIgnoringCase("(objectClass=per/son)");
+ assertThat(ldapURL.getExtensions()).containsOnly("ext/1", "ext/2", "ext/3");
+
+ // FIXME, why does toString() do not URL encode the "/"?
+ assertThat(ldapURL.toString()).isEqualToIgnoringCase(
+ sample.replaceAll("%2F", "/"));
+ }
+
+
+ public void urlDecodeNull() throws Exception
+ {
+ assertEquals(LDAPURL.urlDecode(null), "");
+ }
+
+ @Test(expectedExceptions = DirectoryException.class)
+ public void urlDecodeNeedMoreBytesAfterPercentSign() throws Exception
+ {
+ assertNull(LDAPURL.urlDecode("%"));
+ }
+
+ @Test(expectedExceptions = DirectoryException.class)
+ public void urlDecodeNotHexOneAfterPercentSign() throws Exception
+ {
+ assertNull(LDAPURL.urlDecode("%z1"));
+ }
+
+ @Test(expectedExceptions = DirectoryException.class)
+ public void urlDecodeNotHexTwoAfterPercentSign() throws Exception
+ {
+ assertNull(LDAPURL.urlDecode("%1z"));
+ }
+
+ public void urlDecodeAllPercentSigns() throws Exception
+ {
+ String decoded1 = LDAPURL.urlDecode("%21%23%24%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D");
+ assertThat(decoded1).isEqualTo("!#$&'()*+,/:;=?@[]");
+
+ String decoded2 = LDAPURL.urlDecode("%20%22%25%2D%2E%3C%3E%5C%5E%5F%60%7B%7C%7D%7E");
+ assertThat(decoded2).isEqualTo(" \"%-.<>\\^_`{|}~");
+
+ // unix, then MacOS, then windows style newlines
+ String decoded3 = LDAPURL.urlDecode("%0A %0D %0D%0A");
+ assertThat(decoded3).isEqualTo("\n \r \r\n");
+ }
+
+}
--
Gitblit v1.10.0