From f3e544abf49814f83190b769f5f7f8c859aa4157 Mon Sep 17 00:00:00 2001
From: Chris Ridd <chris.ridd@forgerock.com>
Date: Fri, 05 Oct 2012 12:17:56 +0000
Subject: [PATCH] Fix OPENDJ-620 Referrals returned when not in scope.

---
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java |   97 ++++++++++++++++++++++++++++++++++++++++++++++--
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/DN2URI.java                                  |    3 +
 2 files changed, 95 insertions(+), 5 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/DN2URI.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/DN2URI.java
index 5f32559..9a26544 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/DN2URI.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/DN2URI.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
+ *      Portions Copyright 2012 ForgeRock AS
  */
 package org.opends.server.backends.jeb;
 
@@ -669,7 +670,7 @@
           if (searchOp.getScope() == SearchScope.SINGLE_LEVEL)
           {
             if(JebFormat.findDNKeyParent(key.getData(), 0,
-                                       key.getSize()) == baseDN.length)
+                                       key.getSize()) != baseDN.length)
             {
               continue;
             }
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java
index fe17ab2..87f1e64 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java
@@ -23,7 +23,7 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
- *      Portions copyright 2011 ForgeRock AS
+ *      Portions copyright 2011-2012 ForgeRock AS
  */
 
 package org.opends.server.core;
@@ -193,6 +193,47 @@
                                referralEntry.getOperationalAttributes());
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
     assertNotNull(DirectoryServer.getEntry(referralEntry.getDN()));
+
+    Entry level1Entry = TestCaseUtils.makeEntry(
+        "dn: ou=level1," + BASE,
+        "objectclass: top",
+        "objectclass: organizationalunit",
+        "ou: level1");
+    addOperation =
+        connection.processAdd(level1Entry.getDN(),
+                              level1Entry.getObjectClasses(),
+                              level1Entry.getUserAttributes(),
+                              level1Entry.getOperationalAttributes());
+    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
+    assertNotNull(DirectoryServer.getEntry(level1Entry.getDN()));
+
+    Entry level2Entry = TestCaseUtils.makeEntry(
+        "dn: ou=level2,ou=level1," + BASE,
+        "objectclass: top",
+        "objectclass: organizationalunit",
+        "ou: level2");
+    addOperation =
+        connection.processAdd(level2Entry.getDN(),
+                              level2Entry.getObjectClasses(),
+                              level2Entry.getUserAttributes(),
+                              level2Entry.getOperationalAttributes());
+    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
+    assertNotNull(DirectoryServer.getEntry(level2Entry.getDN()));
+
+    Entry referral2Entry = TestCaseUtils.makeEntry(
+        "dn: ou=level3,ou=level2,ou=level1," + BASE,
+        "objectclass: extensibleobject",
+        "objectclass: referral",
+        "ref: ldap://hostb/OU=People,O=MNN,C=US",
+        "ref: ldap://hostc/OU=People,O=MNN,C=US",
+        "ref: ldap://hostd/OU=People,O=MNN,C=US");
+   addOperation =
+        connection.processAdd(referral2Entry.getDN(),
+                              referral2Entry.getObjectClasses(),
+                              referral2Entry.getUserAttributes(),
+                              referral2Entry.getOperationalAttributes());
+   assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
+   assertNotNull(DirectoryServer.getEntry(referral2Entry.getDN()));
   }
 
 
@@ -376,8 +417,8 @@
 
     searchOperation.run();
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
-    assertEquals(searchOperation.getEntriesSent(), 2);
-    assertEquals(searchOperation.getReferencesSent(), 1);
+    assertEquals(searchOperation.getEntriesSent(), 4);
+    assertEquals(searchOperation.getReferencesSent(), 2);
     assertEquals(searchOperation.getErrorMessage().length(), 0);
 
     examineCompletedOperation(searchOperation);
@@ -874,6 +915,54 @@
     searchOperation.run();
 
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
+    assertEquals(searchOperation.getReferencesSent(), 2);
+    assertEquals(searchOperation.getErrorMessage().length(), 0);
+    examineCompletedOperation(searchOperation);
+
+    List<SearchResultReference> references =
+         searchOperation.getSearchReferences();
+    assertEquals(references.size(), 2);
+
+    // One contains 2 URLs, the other contains 3. Cannot guarantee
+    // ordering of the returned references, so just check the total is correct.
+    int urls = references.get(0).getReferralURLs().size() +
+        references.get(1).getReferralURLs().size();
+
+    assertEquals(urls, 5);
+  }
+
+  /**
+   * This does a single-level search that finds one referral object, but
+   * not the one in a deeper subtree.
+   *
+   * @throws Exception
+   */
+  @Test
+  public void testSearchSingleDeepReferences() throws Exception
+  {
+    InvocationCounterPlugin.resetAllCounters();
+
+    InternalClientConnection conn =
+         InternalClientConnection.getRootConnection();
+
+    InternalSearchOperation searchOperation =
+         new InternalSearchOperation(
+              conn,
+              InternalClientConnection.nextOperationID(),
+              InternalClientConnection.nextMessageID(),
+              new ArrayList<Control>(),
+              ByteString.valueOf(BASE),
+              SearchScope.SINGLE_LEVEL,
+              DereferencePolicy.NEVER_DEREF_ALIASES,
+              Integer.MAX_VALUE,
+              Integer.MAX_VALUE,
+              false,
+              LDAPFilter.decode("(ou=*)"),
+              null, null);
+
+    searchOperation.run();
+
+    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
     assertEquals(searchOperation.getReferencesSent(), 1);
     assertEquals(searchOperation.getErrorMessage().length(), 0);
     examineCompletedOperation(searchOperation);
@@ -1047,7 +1136,7 @@
     searchOperation.run();
 
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
-    assertEquals(searchOperation.getEntriesSent(), 3);
+    assertEquals(searchOperation.getEntriesSent(), 5);
     assertEquals(searchOperation.getErrorMessage().length(), 0);
   }
 

--
Gitblit v1.10.0