From 76c87042a9fb3ac7f1a25cc9d836da521eb8547f Mon Sep 17 00:00:00 2001
From: sin <sin@localhost>
Date: Tue, 17 Feb 2009 16:11:27 +0000
Subject: [PATCH] issue# 3774: Sort control doesn't work for collation matching rules

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/schema/CollationMatchingRuleTest.java |  170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 169 insertions(+), 1 deletions(-)

diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/CollationMatchingRuleTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/CollationMatchingRuleTest.java
index ba958db..daf2750 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/CollationMatchingRuleTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/schema/CollationMatchingRuleTest.java
@@ -22,24 +22,31 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 
 package org.opends.server.schema;
 
+import java.util.ArrayList;
 import static org.testng.Assert.*;
 
 import java.util.List;
 
 import org.opends.server.TestCaseUtils;
+import org.opends.server.controls.ServerSideSortRequestControl;
+import org.opends.server.controls.VLVRequestControl;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.ldap.LDAPFilter;
 import org.opends.server.tools.LDAPModify;
 import org.opends.server.types.ByteString;
+import org.opends.server.types.Control;
+import org.opends.server.types.DN;
 import org.opends.server.types.DereferencePolicy;
+import org.opends.server.types.Entry;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.SearchFilter;
 import org.opends.server.types.SearchResultEntry;
 import org.opends.server.types.SearchScope;
 import org.testng.annotations.BeforeClass;
@@ -65,6 +72,10 @@
   {
     TestCaseUtils.startServer();
     TestCaseUtils.initializeTestBackend(true);
+    user1 = DN.decode("cn=user1,dc=example,dc=com");
+    user2 = DN.decode("cn=user2,dc=example,dc=com");
+    user3 = DN.decode("cn=user3,dc=example,dc=com");
+    user4 = DN.decode("cn=user4,dc=example,dc=com");
   }
 
 
@@ -363,4 +374,161 @@
     //An entry must be returned for sn=quebec.
     assertNotNull(e);
   }
+
+  private DN user1;
+  private DN user2 ;
+  private DN user3;
+  private DN user4;
+
+
+  /**
+   * Test to verify the Sort control works well with the Collation
+   * Less-than-equal-to matching rule and French Locale.
+   */
+  @Test()
+  public void testSortControlLTERule() throws Exception
+  {
+    ArrayList<DN> expectedDNOrder = new ArrayList<DN>();
+    expectedDNOrder.add(user4);
+    expectedDNOrder.add(user3);
+    expectedDNOrder.add(user2);
+    expectedDNOrder.add(user1);
+    ArrayList<Control> requestControls = new ArrayList<Control>();
+    requestControls.add(new ServerSideSortRequestControl("displayname:fr"));
+    ValidateSortControl(expectedDNOrder,
+            requestControls,
+            "displayname:fr-FR.6:=A*");
+  }
+
+
+  /**
+   * Test to verify the Sort control works with Collation equality
+   * matching rule and Spanish locale.
+   */
+  @Test()
+  public void testSortControlEQRule() throws Exception
+  {
+    ArrayList<DN> expectedDNOrder = new ArrayList<DN>();
+    expectedDNOrder.add(user4);
+    expectedDNOrder.add(user3);
+    expectedDNOrder.add(user2);
+    expectedDNOrder.add(user1);
+    ArrayList<Control> requestControls = new ArrayList<Control>();
+    requestControls.add(new ServerSideSortRequestControl("displayname:es"));
+    ValidateSortControl(expectedDNOrder,
+            requestControls,
+            "displayname:es.6:=A*");
+  }
+
+
+  /**
+   * Test to verify the Sort control works with Collation greater
+   * than matching rule and English locale in a descending order.
+   */
+  @Test()
+  public void testSortControlGTRule() throws Exception
+  {
+    ArrayList<DN> expectedDNOrder = new ArrayList<DN>();
+    expectedDNOrder.add(user1);
+    expectedDNOrder.add(user2);
+    expectedDNOrder.add(user3);
+    expectedDNOrder.add(user4);
+    ArrayList<Control> requestControls = new ArrayList<Control>();
+    requestControls.add(new ServerSideSortRequestControl("-displayname:en"));
+    ValidateSortControl(expectedDNOrder,
+            requestControls,
+            "displayname:en-US.6:=A*");
+  }
+
+
+
+  /**
+   * Tests the Sort control with the VLV control using a collation equality
+   * matching rule.
+   */
+  @Test()
+  public void testVLVSortControl() throws Exception
+  {
+    ArrayList<DN> expectedDNOrder = new ArrayList<DN>();
+    expectedDNOrder.add(user4);
+    expectedDNOrder.add(user3);
+    expectedDNOrder.add(user2);
+    expectedDNOrder.add(user1);
+    ArrayList<Control> requestControls = new ArrayList<Control>();
+    requestControls.add(new ServerSideSortRequestControl("displayname:fr"));
+    requestControls.add(new VLVRequestControl(0, 4, 1, 0));
+    ValidateSortControl(expectedDNOrder,
+            requestControls,
+            "objectclass=inetOrgPerson");
+  }
+
+
+
+  private void ValidateSortControl(ArrayList<DN> expectedDNOrder,
+          ArrayList<Control> requestControls,
+          String searchFilter) throws Exception
+  {
+    try
+    {
+      populateEntriesForControl();
+      InternalClientConnection conn =
+         InternalClientConnection.getRootConnection();
+
+      InternalSearchOperation internalSearch =
+         new InternalSearchOperation(conn, InternalClientConnection.nextOperationID(),
+                  InternalClientConnection.nextMessageID(), requestControls,
+                  DN.decode("dc=example,dc=com"), SearchScope.WHOLE_SUBTREE,
+                  DereferencePolicy.NEVER_DEREF_ALIASES, 0, 0, false,
+                  SearchFilter.createFilterFromString(searchFilter),
+                  null, null);
+
+      internalSearch.run();
+      assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
+      ArrayList<DN> returnedDNOrder = new ArrayList<DN>();
+      for (Entry e : internalSearch.getSearchEntries())
+      {
+        returnedDNOrder.add(e.getDN());
+      }
+     assertEquals(returnedDNOrder, expectedDNOrder);
+    }
+    finally
+    {
+      TestCaseUtils.clearJEBackend(false, "userRoot", "dc=example,dc=com");
+    }
+  }
+
+
+  private void populateEntriesForControl() throws Exception
+  {
+    TestCaseUtils.clearJEBackend(true, "userRoot", "dc=example,dc=com");
+    TestCaseUtils.addEntries(
+      "dn: cn=user1,dc=example,dc=com",
+      "objectclass: inetorgperson",
+      "cn: user1",
+      "sn: user1",
+      "uid: user1",
+      "displayname:: QXVy4oiawqlsaWVuNA==",
+      "",
+      "dn: cn=user2,dc=example,dc=com",
+      "objectclass: inetorgperson",
+      "cn: user2",
+      "sn: user2",
+      "uid: user2",
+      "displayname:: QXVy4oiawqlsaWVuMw==",
+      "",
+      "dn: cn=user3,dc=example,dc=com",
+      "objectclass: inetorgperson",
+      "cn: user3",
+      "sn: user3",
+      "uid: user3",
+      "displayname:: QXVy4oiawqlsaWVuMg==",
+      "",
+      "dn: cn=user4,dc=example,dc=com",
+      "objectclass: inetorgperson",
+      "cn: user4",
+      "sn: user4",
+      "uid: user4",
+      "displayname:: QXVy4oiawqlsaWVuMQ=="
+    );
+  }
 }

--
Gitblit v1.10.0