Regression tests for tickets fixed by previous change. (#9019)
Summary: closes https://github.com/facebook/rocksdb/issues/5891 closes https://github.com/facebook/rocksdb/issues/2001 Java BytewiseComparator is now unsigned compliant, consistent with the default C++ comparator, which has always been thus. Consequently 2 tickets reporting the previous broken state can be closed. This test confirms that the following issues were in fact resolved by a change made between 6.2.2 and 6.22.1, to wit https://github.com/facebook/rocksdb/commit/7242dae7 which as part of its effect, changed the Java bytewise comparators. Pull Request resolved: https://github.com/facebook/rocksdb/pull/9019 Reviewed By: pdillinger Differential Revision: D31610910 Pulled By: mrambacher fbshipit-source-id: 664230f1377a1aa270136edd63eea2c206b907e9main
parent
560fe70233
commit
ec9082d698
@ -0,0 +1,126 @@ |
||||
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
||||
// This source code is licensed under both the GPLv2 (found in the
|
||||
// COPYING file in the root directory) and Apache 2.0 License
|
||||
// (found in the LICENSE.Apache file in the root directory).
|
||||
|
||||
package org.rocksdb; |
||||
|
||||
import static org.junit.Assert.assertArrayEquals; |
||||
|
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.util.ArrayList; |
||||
import org.junit.ClassRule; |
||||
import org.junit.Rule; |
||||
import org.junit.Test; |
||||
import org.junit.rules.TemporaryFolder; |
||||
import org.rocksdb.util.BytewiseComparator; |
||||
|
||||
/** |
||||
* This test confirms that the following issues were in fact resolved |
||||
* by a change made between 6.2.2 and 6.22.1, |
||||
* to wit {@link <a href="https://github.com/facebook/rocksdb/commit/7242dae7">...</a>} |
||||
* which as part of its effect, changed the Java bytewise comparators. |
||||
* |
||||
* {@link <a href="https://github.com/facebook/rocksdb/issues/5891">...</a>} |
||||
* {@link <a href="https://github.com/facebook/rocksdb/issues/2001">...</a>} |
||||
*/ |
||||
public class BytewiseComparatorRegressionTest { |
||||
@ClassRule |
||||
public static final RocksNativeLibraryResource ROCKS_NATIVE_LIBRARY_RESOURCE = |
||||
new RocksNativeLibraryResource(); |
||||
|
||||
@Rule public TemporaryFolder dbFolder = new TemporaryFolder(); |
||||
|
||||
@Rule public TemporaryFolder temporarySSTFolder = new TemporaryFolder(); |
||||
|
||||
private final static byte[][] testData = {{10, -11, 13}, {10, 11, 12}, {10, 11, 14}}; |
||||
private final static byte[][] orderedData = {{10, 11, 12}, {10, 11, 14}, {10, -11, 13}}; |
||||
|
||||
/** |
||||
* {@link <a href="https://github.com/facebook/rocksdb/issues/5891">...</a>} |
||||
*/ |
||||
@Test |
||||
public void testJavaComparator() throws RocksDBException { |
||||
final BytewiseComparator comparator = new BytewiseComparator(new ComparatorOptions()); |
||||
performTest(new Options().setCreateIfMissing(true).setComparator(comparator)); |
||||
} |
||||
|
||||
@Test |
||||
public void testDefaultComparator() throws RocksDBException { |
||||
performTest(new Options().setCreateIfMissing(true)); |
||||
} |
||||
|
||||
/** |
||||
* {@link <a href="https://github.com/facebook/rocksdb/issues/5891">...</a>} |
||||
*/ |
||||
@Test |
||||
public void testCppComparator() throws RocksDBException { |
||||
performTest(new Options().setCreateIfMissing(true).setComparator( |
||||
BuiltinComparator.BYTEWISE_COMPARATOR)); |
||||
} |
||||
|
||||
private void performTest(final Options options) throws RocksDBException { |
||||
try (final RocksDB db = RocksDB.open(options, dbFolder.getRoot().getAbsolutePath())) { |
||||
for (final byte[] item : testData) { |
||||
db.put(item, item); |
||||
} |
||||
try (final RocksIterator iterator = db.newIterator()) { |
||||
iterator.seekToFirst(); |
||||
final ArrayList<byte[]> result = new ArrayList<>(); |
||||
while (iterator.isValid()) { |
||||
result.add(iterator.key()); |
||||
iterator.next(); |
||||
} |
||||
assertArrayEquals(orderedData, result.toArray()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private byte[] hexToByte(final String hexString) { |
||||
final byte[] bytes = new byte[hexString.length() / 2]; |
||||
if (bytes.length * 2 < hexString.length()) { |
||||
throw new RuntimeException("Hex string has odd length: " + hexString); |
||||
} |
||||
|
||||
for (int i = 0; i < bytes.length; i++) { |
||||
final int firstDigit = toDigit(hexString.charAt(i + i)); |
||||
final int secondDigit = toDigit(hexString.charAt(i + i + 1)); |
||||
bytes[i] = (byte) ((firstDigit << 4) + secondDigit); |
||||
} |
||||
|
||||
return bytes; |
||||
} |
||||
|
||||
private int toDigit(final char hexChar) { |
||||
final int digit = Character.digit(hexChar, 16); |
||||
if (digit == -1) { |
||||
throw new IllegalArgumentException("Invalid Hexadecimal Character: " + hexChar); |
||||
} |
||||
return digit; |
||||
} |
||||
|
||||
/** |
||||
* {@link <a href="https://github.com/facebook/rocksdb/issues/2001">...</a>} |
||||
* |
||||
* @throws RocksDBException if something goes wrong, or if the regression occurs |
||||
* @throws IOException if we can't make the temporary file |
||||
*/ |
||||
@Test |
||||
public void testSST() throws RocksDBException, IOException { |
||||
final File tempSSTFile = temporarySSTFolder.newFile("test_file_with_weird_keys.sst"); |
||||
|
||||
final EnvOptions envOpts = new EnvOptions(); |
||||
final Options opts = new Options(); |
||||
final SstFileWriter writer = |
||||
new SstFileWriter(envOpts, opts, new BytewiseComparator(new ComparatorOptions())); |
||||
writer.open(tempSSTFile.getAbsolutePath()); |
||||
final byte[] gKey = |
||||
hexToByte("000000293030303030303030303030303030303030303032303736343730696E666F33"); |
||||
final byte[] wKey = |
||||
hexToByte("0000008d3030303030303030303030303030303030303030303437363433696e666f34"); |
||||
writer.add(new Slice(gKey), new Slice("dummyV1")); |
||||
writer.add(new Slice(wKey), new Slice("dummyV2")); |
||||
writer.finish(); |
||||
} |
||||
} |
Loading…
Reference in new issue