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