From 060013ad7b5e6d9f4ca1e2db098ad6d762109588 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Thu, 17 Oct 2013 12:50:31 +0000
Subject: [PATCH] Fix OPENDJ-701: Implement paged results support

---
 opendj3/opendj-rest2ldap/src/test/java/org/forgerock/opendj/rest2ldap/BasicRequestsTest.java |  112 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 111 insertions(+), 1 deletions(-)

diff --git a/opendj3/opendj-rest2ldap/src/test/java/org/forgerock/opendj/rest2ldap/BasicRequestsTest.java b/opendj3/opendj-rest2ldap/src/test/java/org/forgerock/opendj/rest2ldap/BasicRequestsTest.java
index c195206..d459ffe 100644
--- a/opendj3/opendj-rest2ldap/src/test/java/org/forgerock/opendj/rest2ldap/BasicRequestsTest.java
+++ b/opendj3/opendj-rest2ldap/src/test/java/org/forgerock/opendj/rest2ldap/BasicRequestsTest.java
@@ -28,6 +28,7 @@
 import static org.forgerock.json.resource.PatchOperation.replace;
 import static org.forgerock.json.resource.Requests.newDeleteRequest;
 import static org.forgerock.json.resource.Requests.newPatchRequest;
+import static org.forgerock.json.resource.Requests.newQueryRequest;
 import static org.forgerock.json.resource.Requests.newReadRequest;
 import static org.forgerock.json.resource.Requests.newUpdateRequest;
 import static org.forgerock.json.resource.Resources.newCollection;
@@ -42,6 +43,7 @@
 import static org.forgerock.opendj.rest2ldap.TestUtils.ctx;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -51,6 +53,9 @@
 import org.forgerock.json.resource.NotFoundException;
 import org.forgerock.json.resource.NotSupportedException;
 import org.forgerock.json.resource.PreconditionFailedException;
+import org.forgerock.json.resource.QueryFilter;
+import org.forgerock.json.resource.QueryResult;
+import org.forgerock.json.resource.Requests;
 import org.forgerock.json.resource.Resource;
 import org.forgerock.opendj.ldap.ConnectionFactory;
 import org.forgerock.opendj.ldap.IntermediateResponseHandler;
@@ -88,6 +93,84 @@
     // FIXME: factor out test for re-use as common test suite (e.g. for InMemoryBackend).
 
     @Test
+    public void testQueryAll() throws Exception {
+        final Connection connection = newConnection();
+        final List<Resource> resources = new LinkedList<Resource>();
+        final QueryResult result =
+                connection.query(ctx(), Requests.newQueryRequest("").setQueryFilter(
+                        QueryFilter.alwaysTrue()), resources);
+        assertThat(resources).hasSize(5);
+        assertThat(result.getPagedResultsCookie()).isNull();
+        assertThat(result.getRemainingPagedResults()).isEqualTo(-1);
+    }
+
+    @Test
+    public void testQueryNone() throws Exception {
+        final Connection connection = newConnection();
+        final List<Resource> resources = new LinkedList<Resource>();
+        final QueryResult result =
+                connection.query(ctx(), Requests.newQueryRequest("").setQueryFilter(
+                        QueryFilter.alwaysFalse()), resources);
+        assertThat(resources).hasSize(0);
+        assertThat(result.getPagedResultsCookie()).isNull();
+        assertThat(result.getRemainingPagedResults()).isEqualTo(-1);
+    }
+
+    @Test
+    public void testQueryPageResultsCookie() throws Exception {
+        final Connection connection = newConnection();
+        final List<Resource> resources = new ArrayList<Resource>();
+
+        // Read first page.
+        QueryResult result =
+                connection.query(ctx(), newQueryRequest("")
+                        .setQueryFilter(QueryFilter.alwaysTrue()).setPageSize(2), resources);
+        assertThat(result.getPagedResultsCookie()).isNotNull();
+        assertThat(resources).hasSize(2);
+        assertThat(resources.get(0).getId()).isEqualTo("test1");
+        assertThat(resources.get(1).getId()).isEqualTo("test2");
+
+        String cookie = result.getPagedResultsCookie();
+        resources.clear();
+
+        // Read second page.
+        result =
+                connection.query(ctx(), newQueryRequest("")
+                        .setQueryFilter(QueryFilter.alwaysTrue()).setPageSize(2)
+                        .setPagedResultsCookie(cookie), resources);
+        assertThat(result.getPagedResultsCookie()).isNotNull();
+        assertThat(resources).hasSize(2);
+        assertThat(resources.get(0).getId()).isEqualTo("test3");
+        assertThat(resources.get(1).getId()).isEqualTo("test4");
+
+        cookie = result.getPagedResultsCookie();
+        resources.clear();
+
+        // Read third page.
+        result =
+                connection.query(ctx(), newQueryRequest("")
+                        .setQueryFilter(QueryFilter.alwaysTrue()).setPageSize(2)
+                        .setPagedResultsCookie(cookie), resources);
+        assertThat(result.getPagedResultsCookie()).isNull();
+        assertThat(resources).hasSize(1);
+        assertThat(resources.get(0).getId()).isEqualTo("test5");
+    }
+
+    @Test
+    public void testQueryPageResultsIndexed() throws Exception {
+        final Connection connection = newConnection();
+        final List<Resource> resources = new ArrayList<Resource>();
+        QueryResult result =
+                connection.query(ctx(), newQueryRequest("")
+                        .setQueryFilter(QueryFilter.alwaysTrue()).setPageSize(2)
+                        .setPagedResultsOffset(1), resources);
+        assertThat(result.getPagedResultsCookie()).isNotNull();
+        assertThat(resources).hasSize(2);
+        assertThat(resources.get(0).getId()).isEqualTo("test3");
+        assertThat(resources.get(1).getId()).isEqualTo("test4");
+    }
+
+    @Test
     public void testDelete() throws Exception {
         final Connection connection = newConnection();
         final Resource resource = connection.delete(ctx(), newDeleteRequest("/test1"));
@@ -601,7 +684,34 @@
                         "userpassword: password",
                         "cn: test user 2",
                         "sn: user 2",
-                        "etag: 67890"
+                        "etag: 67890",
+                        "",
+                        "dn: uid=test3,dc=test",
+                        "objectClass: top",
+                        "objectClass: person",
+                        "uid: test3",
+                        "userpassword: password",
+                        "cn: test user 3",
+                        "sn: user 3",
+                        "etag: 33333",
+                        "",
+                        "dn: uid=test4,dc=test",
+                        "objectClass: top",
+                        "objectClass: person",
+                        "uid: test4",
+                        "userpassword: password",
+                        "cn: test user 4",
+                        "sn: user 4",
+                        "etag: 44444",
+                        "",
+                        "dn: uid=test5,dc=test",
+                        "objectClass: top",
+                        "objectClass: person",
+                        "uid: test5",
+                        "userpassword: password",
+                        "cn: test user 5",
+                        "sn: user 5",
+                        "etag: 55555"
                 ));
         // @formatter:on
 

--
Gitblit v1.10.0