From df310fa66969c2058dbb1f8f23e90a4d717df44c Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Thu, 02 Apr 2015 10:16:45 +0000
Subject: [PATCH] OPENDJ-1711 - re-implement VLV support for pluggable backends

---
 opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/ControlsTestCase.java |   71 +++++++++++++++++++++++++++++++++++
 1 files changed, 71 insertions(+), 0 deletions(-)

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 85060d2..061a550 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
@@ -43,6 +43,7 @@
 
 import org.forgerock.opendj.config.server.ConfigException;
 import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.ByteStringBuilder;
 import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.opendj.ldap.SearchScope;
 import org.opends.server.DirectoryServerTestCase;
@@ -169,6 +170,76 @@
   }
 
   @DataProvider
+  private Object[][] encodedKeyDataProvider()
+  {
+    // @formatter:off
+    return new Object[][] {
+      // Null keys sort after everything else.
+      { null,           null,           0 },
+      { "",             null,          -1 },
+      { null,           "",             1 },
+      { "00",           null,          -1 },
+      { null,           "00",           1 },
+      { "ff",           null,          -1 },
+      { null,           "ff",           1 },
+
+      // Empty keys sort before everything else.
+      { "",             "",             0 },
+      { "00",           "",             1 },
+      { "",             "00",          -1 },
+      { "ff",           "",             1 },
+      { "",             "ff",          -1 },
+
+      // Bytes comparisons are unsigned.
+      { "00",           "00",           0 },
+      { "00",           "ff",          -1 },
+      { "ff",           "00",           1 },
+      { "ff",           "ff",           0 },
+
+      // Short keys sort before long keys.
+      { "0000",         "00",           1 },
+      { "00",           "0000",        -1 },
+      { "ffff",         "ff",           1 },
+      { "ff",           "ffff",        -1 },
+      { "0000",         "0000",         0 },
+      { "ffff",         "ffff",         0 },
+      { "0000",         "ffff",        -1 },
+      { "ffff",         "0000",         1 },
+    };
+    // @formatter:on
+  }
+
+  @Test(dataProvider = "encodedKeyDataProvider")
+  public void vlvKeyEncodingGenerateCorrectAscendingSortOrder(String key1, String key2, int expectedCompareResult)
+  {
+    ByteString bytes1 = key1 != null ? ByteString.valueOfHex(key1) : null;
+    ByteStringBuilder encodedBytes1 = new ByteStringBuilder();
+    VLVIndex.encodeVLVKeyValue(bytes1, encodedBytes1, true);
+
+    ByteString bytes2 = key2 != null ? ByteString.valueOfHex(key2) : null;
+    ByteStringBuilder encodedBytes2 = new ByteStringBuilder();
+    VLVIndex.encodeVLVKeyValue(bytes2, encodedBytes2, true);
+
+    int actualResult = Math.min(Math.max(encodedBytes1.compareTo(encodedBytes2), -1), 1);
+    assertThat(actualResult).isEqualTo(expectedCompareResult);
+  }
+
+  @Test(dataProvider = "encodedKeyDataProvider")
+  public void vlvKeyEncodingGenerateCorrectDescendingSortOrder(String key1, String key2, int expectedCompareResult)
+  {
+    ByteString bytes1 = key1 != null ? ByteString.valueOfHex(key1) : null;
+    ByteStringBuilder encodedBytes1 = new ByteStringBuilder();
+    VLVIndex.encodeVLVKeyValue(bytes1, encodedBytes1, false);
+
+    ByteString bytes2 = key2 != null ? ByteString.valueOfHex(key2) : null;
+    ByteStringBuilder encodedBytes2 = new ByteStringBuilder();
+    VLVIndex.encodeVLVKeyValue(bytes2, encodedBytes2, false);
+
+    int actualResult = Math.min(Math.max(encodedBytes1.compareTo(encodedBytes2), -1), 1);
+    assertThat(actualResult).isEqualTo(-expectedCompareResult);
+  }
+
+  @DataProvider
   private Object[][] indexedVlvByAssertionDataProvider()
   {
     // @formatter:off

--
Gitblit v1.10.0