From 5f4f429bcbd2638da1b0548705371416a9fc0a94 Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 25 Nov 2015 15:09:54 +0000
Subject: [PATCH] Fix VLV index / server side control tests

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java            |    6 +
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java      |    2 
 opendj-server-legacy/src/main/java/org/opends/server/types/SortKey.java                          |   17 ++-
 opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/ControlsTestCase.java    |   16 +++
 opendj-server-legacy/src/test/java/org/opends/server/controls/ServerSideSortControlTestCase.java |  193 ++++++++++++++++-------------------------------
 5 files changed, 98 insertions(+), 136 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
index d67bf45..99dcdd0 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
@@ -279,6 +279,7 @@
     @Override
     public boolean isConfigurationAddAcceptable(BackendVLVIndexCfg cfg, List<LocalizableMessage> unacceptableReasons)
     {
+      // TODO JNR remove du-plication
       try
       {
         SearchFilter.createFilterFromString(cfg.getFilter());
@@ -316,6 +317,7 @@
           unacceptableReasons.add(ERR_CONFIG_VLV_INDEX_UNDEFINED_ATTR.get(sortAttrs[i], cfg.getName()));
           return false;
         }
+        // TODO Add ordering matching rule null check
         sortKeys[i] = new SortKey(attrType, ascending[i]);
       }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
index a1ff2a7..cc2a40e 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
@@ -178,6 +178,7 @@
   public synchronized boolean isConfigurationChangeAcceptable(final BackendVLVIndexCfg cfg,
       final List<LocalizableMessage> unacceptableReasons)
   {
+    // TODO JNR remove duplication
     try
     {
       SearchFilter.createFilterFromString(cfg.getFilter());
@@ -324,6 +325,7 @@
       {
         throw new ConfigException(ERR_CONFIG_VLV_INDEX_UNDEFINED_ATTR.get(sortAttrs[i], getName()));
       }
+      // TODO Add ordering matching rule null check
       sortKeys[i] = new SortKey(attrType, ascending);
     }
     return sortKeys;
@@ -606,7 +608,7 @@
        * include some escaped bytes as well. 10 extra bytes should accommodate most inputs.
        */
       final ByteStringBuilder encodedPrimaryKey = new ByteStringBuilder(assertion.length() + 10);
-      final MatchingRule matchingRule = primarySortKey.getAttributeType().getOrderingMatchingRule();
+      final MatchingRule matchingRule = primarySortKey.getEffectiveOrderingRule();
       final ByteString normalizedAttributeValue = matchingRule.normalizeAttributeValue(assertion);
       encodeVLVKeyValue(normalizedAttributeValue, encodedPrimaryKey, primarySortKey.ascending());
       return encodedPrimaryKey;
@@ -767,7 +769,7 @@
     for (final SortKey sortKey : sortOrder.getSortKeys())
     {
       final AttributeType attributeType = sortKey.getAttributeType();
-      final MatchingRule matchingRule = attributeType.getOrderingMatchingRule();
+      final MatchingRule matchingRule = sortKey.getEffectiveOrderingRule();
       final List<Attribute> attrList = entry.getAttribute(attributeType);
       ByteString sortValue = null;
       if (attrList != null)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/SortKey.java b/opendj-server-legacy/src/main/java/org/opends/server/types/SortKey.java
index 6c7fa35..780b3d6 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/SortKey.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/SortKey.java
@@ -51,10 +51,8 @@
 
   /** The attribute type for this sort key. */
   private AttributeType attributeType;
-
   /** The indication of whether the sort should be ascending. */
   private boolean ascending;
-
   /** The ordering matching rule to use with this sort key. */
   private MatchingRule orderingRule;
 
@@ -69,10 +67,7 @@
    */
   public SortKey(AttributeType attributeType, boolean ascending)
   {
-    this.attributeType = attributeType;
-    this.ascending     = ascending;
-
-    orderingRule = null;
+    this(attributeType, ascending, null);
   }
 
 
@@ -132,7 +127,15 @@
     return orderingRule;
   }
 
-
+  /**
+   * Retrieves the ordering matching rule to use with this sort key.
+   *
+   * @return The ordering matching rule to use with this sort key.
+   */
+  public MatchingRule getEffectiveOrderingRule()
+  {
+    return orderingRule != null ? orderingRule : attributeType.getOrderingMatchingRule();
+  }
 
   /**
    * Compares the provided values using this sort key.
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/ControlsTestCase.java b/opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/ControlsTestCase.java
index deb1563..cabff17 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/ControlsTestCase.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/ControlsTestCase.java
@@ -91,7 +91,7 @@
     user(givenNames("William", "Bill"),    surname("Beak"),        employeeNumber(4)),
     user(givenNames(),                     surname("Prince"),      employeeNumber(5)),
     user(givenNames("Charlie"),            surname("Chalk"),       employeeNumber(6)),
-    user(givenNames("Albert"),             surname("Einstein"),    employeeNumber(7)),
+    user(givenNames("Albert"),             surname("DEinstein"),   employeeNumber(7)),
     user(givenNames("Mini"),               surname("Mouse"),       employeeNumber(8)),
   };
   // @formatter:on
@@ -107,6 +107,9 @@
   /** Unindexed: ordered by ascending sn and ascending employee number then entryID */
   private static final String SORT_ORDER_3 = "sn employeeNumber";
 
+  /** Indexed: ordered by ascending givenName then entryID */
+  private static final String SORT_ORDER_4 = "surname:caseExactOrderingMatch";
+
   /** Ordered by {@link #SORT_ORDER_1} */
   private static final List<Integer> USERS_BY_ENTRY_ID = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8);
 
@@ -119,6 +122,9 @@
   /** Unindexed: ordered by {@link #SORT_ORDER_3} */
   private static final List<Integer> USERS_BY_SORT_ORDER_3 = Arrays.asList(4, 6, 1, 7, 3, 8, 5, 2, 0);
 
+  /** Unindexed: ordered by {@link #SORT_ORDER_4} */
+  private static final List<Integer> USERS_BY_SORT_ORDER_4 = Arrays.asList(4, 6, 7, 3, 8, 5, 2, 0, 1);
+
   private PDBBackend backend;
 
   @BeforeClass
@@ -443,6 +449,14 @@
         USERS_BY_SORT_ORDER_3.subList(9, 9),            // nothing
         expectedPosition(10)
       },
+      {
+        SORT_ORDER_4,
+        beforeCount(0),
+        afterCount(10),
+        assertion("A"),                                 // before all
+        USERS_BY_SORT_ORDER_4,                          // everything
+        expectedPosition(1)
+      },
     };
     // @formatter:on
   }
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/controls/ServerSideSortControlTestCase.java b/opendj-server-legacy/src/test/java/org/opends/server/controls/ServerSideSortControlTestCase.java
index 75bd8d6..52d156b 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/controls/ServerSideSortControlTestCase.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/controls/ServerSideSortControlTestCase.java
@@ -27,6 +27,7 @@
 package org.opends.server.controls;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -34,7 +35,6 @@
 import org.forgerock.opendj.ldap.SearchScope;
 import org.opends.server.TestCaseUtils;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
 import org.opends.server.protocols.ldap.LDAPControl;
@@ -289,29 +289,16 @@
   public void testInternalSearchGivenNameAscending()
          throws Exception
   {
-    populateDB();
-
-    InternalClientConnection conn = getRootConnection();
-
-    SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=person)")
-        .addControl(new ServerSideSortRequestControl("givenName"));
-    InternalSearchOperation internalSearch = conn.processSearch(request);
-    assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
-
-    ArrayList<DN> expectedDNOrder = new ArrayList<>();
-    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
-    expectedDNOrder.add(aaronZimmermanDN);  // Aaron
-    expectedDNOrder.add(albertZimmermanDN); // Albert, lower entry ID
-    expectedDNOrder.add(albertSmithDN);     // Albert, higher entry ID
-    expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
-    expectedDNOrder.add(margaretJonesDN);   // Maggie
-    expectedDNOrder.add(maryJonesDN);       // Mary
-    expectedDNOrder.add(samZweckDN);        // Sam
-    expectedDNOrder.add(zorroDN);           // No first name
-
-    assertEquals(getDNs(internalSearch.getSearchEntries()), expectedDNOrder);
-
-    assertNoAttributeTypeForSort(internalSearch);
+    testInternalSearchWithSort("givenName",
+        aaccfJohnsonDN,    // Aaccf
+        aaronZimmermanDN,  // Aaron
+        albertZimmermanDN, // Albert, lower entry ID
+        albertSmithDN,     // Albert, higher entry ID
+        lowercaseMcGeeDN,  // lowercase
+        margaretJonesDN,   // Maggie
+        maryJonesDN,       // Mary
+        samZweckDN,        // Sam
+        zorroDN);          // No first name
   }
 
   /**
@@ -324,27 +311,16 @@
   @Test
   public void testInternalSearchGivenNameAscendingCaseExact() throws Exception
   {
-    populateDB();
-
-    SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=person)")
-        .addControl(new ServerSideSortRequestControl("givenName:caseExactOrderingMatch"));
-    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
-    assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
-
-    ArrayList<DN> expectedDNOrder = new ArrayList<>();
-    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
-    expectedDNOrder.add(aaronZimmermanDN);  // Aaron
-    expectedDNOrder.add(albertZimmermanDN); // Albert, lower entry ID
-    expectedDNOrder.add(albertSmithDN);     // Albert, higher entry ID
-    expectedDNOrder.add(margaretJonesDN);   // Maggie
-    expectedDNOrder.add(maryJonesDN);       // Mary
-    expectedDNOrder.add(samZweckDN);        // Sam
-    expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
-    expectedDNOrder.add(zorroDN);           // No first name
-
-    assertEquals(getDNs(internalSearch.getSearchEntries()), expectedDNOrder);
-
-    assertNoAttributeTypeForSort(internalSearch);
+    testInternalSearchWithSort("givenName:caseExactOrderingMatch",
+        aaccfJohnsonDN,    // Aaccf
+        aaronZimmermanDN,  // Aaron
+        albertZimmermanDN, // Albert, lower entry ID
+        albertSmithDN,     // Albert, higher entry ID
+        margaretJonesDN,   // Maggie
+        maryJonesDN,       // Mary
+        samZweckDN,        // Sam
+        lowercaseMcGeeDN,  // lowercase
+        zorroDN);          // No first name
   }
 
   /**
@@ -356,31 +332,18 @@
   @Test
   public void testInternalSearchGivenNameDescending() throws Exception
   {
-    populateDB();
-
-    SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=person)")
-        .addControl(new ServerSideSortRequestControl("-givenName"));
-    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
-    assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
-
-    ArrayList<DN> expectedDNOrder = new ArrayList<>();
-    expectedDNOrder.add(aaronZimmermanDN);  // Zeke
-    expectedDNOrder.add(samZweckDN);        // Sam
-    expectedDNOrder.add(maryJonesDN);       // Mary
-    expectedDNOrder.add(margaretJonesDN);   // Margaret
-    expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
-    expectedDNOrder.add(albertZimmermanDN); // Albert, lower entry ID
-    expectedDNOrder.add(albertSmithDN);     // Albert, higher entry ID
-    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
-    expectedDNOrder.add(zorroDN);           // No first name
-
-    assertEquals(getDNs(internalSearch.getSearchEntries()), expectedDNOrder);
-
-    assertNoAttributeTypeForSort(internalSearch);
+    testInternalSearchWithSort("-givenName",
+        zorroDN,           // No first name
+        samZweckDN,        // Sam
+        maryJonesDN,       // Mary
+        margaretJonesDN,   // Margaret
+        lowercaseMcGeeDN,  // lowercase
+        albertZimmermanDN, // Albert, lower entry ID
+        albertSmithDN,     // Albert, higher entry ID
+        aaronZimmermanDN,  // Aaron
+        aaccfJohnsonDN);   // Aaccf
   }
 
-
-
   /**
    * Tests performing an internal search using the server-side sort control to
    * sort the entries in order of descending givenName values using a specific
@@ -391,32 +354,18 @@
   @Test
   public void testInternalSearchGivenNameDescendingCaseExact() throws Exception
   {
-    populateDB();
-
-    SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=person)")
-        .addControl(new ServerSideSortRequestControl("-givenName:caseExactOrderingMatch"));
-
-    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
-    assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
-
-    ArrayList<DN> expectedDNOrder = new ArrayList<>();
-    expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
-    expectedDNOrder.add(aaronZimmermanDN);  // Zeke
-    expectedDNOrder.add(samZweckDN);        // Sam
-    expectedDNOrder.add(maryJonesDN);       // Mary
-    expectedDNOrder.add(margaretJonesDN);   // Margaret
-    expectedDNOrder.add(albertZimmermanDN); // Albert, lower entry ID
-    expectedDNOrder.add(albertSmithDN);     // Albert, higher entry ID
-    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
-    expectedDNOrder.add(zorroDN);           // No first name
-
-    assertEquals(getDNs(internalSearch.getSearchEntries()), expectedDNOrder);
-
-    assertNoAttributeTypeForSort(internalSearch);
+    testInternalSearchWithSort("-givenName:caseExactOrderingMatch",
+        zorroDN,           // No first name
+        lowercaseMcGeeDN,  // lowercase
+        samZweckDN,        // Sam
+        maryJonesDN,       // Mary
+        margaretJonesDN,   // Margaret
+        albertZimmermanDN, // Albert, lower entry ID
+        albertSmithDN,     // Albert, higher entry ID
+        aaronZimmermanDN,  // Aaron
+        aaccfJohnsonDN);   // Aaccf
   }
 
-
-
   /**
    * Tests performing an internal search using the server-side sort control to
    * sort the entries in order of ascending givenName and ascending sn values.
@@ -426,27 +375,16 @@
   @Test
   public void testInternalSearchGivenNameAscendingSnAscending() throws Exception
   {
-    populateDB();
-
-    SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=person)")
-        .addControl(new ServerSideSortRequestControl("givenName,sn"));
-    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
-    assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
-
-    ArrayList<DN> expectedDNOrder = new ArrayList<>();
-    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
-    expectedDNOrder.add(aaronZimmermanDN);  // Aaron
-    expectedDNOrder.add(albertSmithDN);     // Albert, lower sn
-    expectedDNOrder.add(albertZimmermanDN); // Albert, higher sn
-    expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
-    expectedDNOrder.add(margaretJonesDN);   // Maggie
-    expectedDNOrder.add(maryJonesDN);       // Mary
-    expectedDNOrder.add(samZweckDN);        // Sam
-    expectedDNOrder.add(zorroDN);           // No first name
-
-    assertEquals(getDNs(internalSearch.getSearchEntries()), expectedDNOrder);
-
-    assertNoAttributeTypeForSort(internalSearch);
+    testInternalSearchWithSort("givenName,sn",
+        aaccfJohnsonDN,    // Aaccf
+        aaronZimmermanDN,  // Aaron
+        albertSmithDN,     // Albert, lower sn
+        albertZimmermanDN, // Albert, higher sn
+        lowercaseMcGeeDN,  // lowercase
+        margaretJonesDN,   // Maggie
+        maryJonesDN,       // Mary
+        samZweckDN,        // Sam
+        zorroDN);          // No first name
   }
 
   /**
@@ -459,25 +397,28 @@
   public void testInternalSearchGivenNameAscendingSnDescending()
          throws Exception
   {
+    testInternalSearchWithSort("givenName,-sn",
+        aaccfJohnsonDN,    // Aaccf
+        aaronZimmermanDN,  // Aaron
+        albertZimmermanDN, // Albert, higher sn
+        albertSmithDN,     // Albert, lower sn
+        lowercaseMcGeeDN,  // lowercase
+        margaretJonesDN,   // Maggie
+        maryJonesDN,       // Mary
+        samZweckDN,        // Sam
+        zorroDN);          // No first name
+  }
+
+  private void testInternalSearchWithSort(String sortOrderString, DN... expectedDNOrder) throws Exception
+  {
     populateDB();
 
     SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=person)")
-        .addControl(new ServerSideSortRequestControl("givenName,-sn"));
+        .addControl(new ServerSideSortRequestControl(sortOrderString));
     InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
     assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
 
-    ArrayList<DN> expectedDNOrder = new ArrayList<>();
-    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
-    expectedDNOrder.add(aaronZimmermanDN);  // Aaron
-    expectedDNOrder.add(albertZimmermanDN); // Albert, higher sn
-    expectedDNOrder.add(albertSmithDN);     // Albert, lower sn
-    expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
-    expectedDNOrder.add(margaretJonesDN);   // Maggie
-    expectedDNOrder.add(maryJonesDN);       // Mary
-    expectedDNOrder.add(samZweckDN);        // Sam
-    expectedDNOrder.add(zorroDN);           // No first name
-
-    assertEquals(getDNs(internalSearch.getSearchEntries()), expectedDNOrder);
+    assertEquals(getDNs(internalSearch.getSearchEntries()), Arrays.asList(expectedDNOrder));
 
     assertNoAttributeTypeForSort(internalSearch);
   }

--
Gitblit v1.10.0