Skip to content

Commit bcffc51

Browse files
committed
Add test for custom class loader.
1 parent d411a83 commit bcffc51

File tree

4 files changed

+92
-0
lines changed

4 files changed

+92
-0
lines changed

java/CMakeLists.txt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ set(JAVA_TEST_CLASSES
340340
src/test/java/org/rocksdb/DefaultEnvTest.java
341341
src/test/java/org/rocksdb/DirectSliceTest.java
342342
src/test/java/org/rocksdb/EnvOptionsTest.java
343+
src/test/java/org/rocksdb/EventListenerClassloaderTest.java
343344
src/test/java/org/rocksdb/EventListenerTest.java
344345
src/test/java/org/rocksdb/FilterTest.java
345346
src/test/java/org/rocksdb/FlushOptionsTest.java
@@ -886,6 +887,25 @@ add_custom_target(rocksdbjava ALL
886887

887888
enable_testing()
888889
get_target_property(ROCKSDBJNI_CLASSES_TEST_JAR_FILE rocksdbjni_test_classes JAR_FILE)
890+
get_target_property(ROCKSDBJNI_CLASSES_JAR_FILE rocksdbjni_classes JAR_FILE)
891+
get_target_property(ROCKSDBJNI_CLASSES_TEST_DIR rocksdbjni_test_classes CLASSDIR)
892+
893+
894+
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/java/cl-test/org/rocksdb)
895+
add_custom_target(cltest-before
896+
COMMAND ${CMAKE_COMMAND} -E copy
897+
${ROCKSDBJNI_CLASSES_TEST_DIR}/org/rocksdb/EventListenerClassloaderTest.class
898+
${PROJECT_BINARY_DIR}/java/cl-test/org/rocksdb/EventListenerClassloaderTest.class
899+
DEPENDS rocksdbjava
900+
)
901+
902+
add_test(
903+
NAME cltest
904+
COMMAND ${Java_JAVA_EXECUTABLE} ${JVMARGS} -ea -Xcheck:jni -Drocks-jar=${ROCKSDBJNI_CLASSES_JAR_FILE} -classpath ${JAVA_RUN_TESTCLASSPATH}:${PROJECT_BINARY_DIR}/java/cl-test org.junit.runner.JUnitCore org.rocksdb.EventListenerClassloaderTest
905+
)
906+
907+
set_tests_properties(cltest PROPERTIES DEPENDS cltest-before)
908+
889909
foreach (CLAZZ ${JAVA_TEST_RUNNING_CLASSES})
890910
if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
891911
add_test(

java/rocksjni/testable_event_listener.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <cstdint>
77
#include <iostream>
88
#include <utility>
9+
#include <thread>
910

1011
#include "include/org_rocksdb_test_TestableEventListener.h"
1112
#include "rocksdb/listener.h"
@@ -72,6 +73,17 @@ static TableProperties newTablePropertiesForTest() {
7273
return table_properties;
7374
}
7475

76+
/*
77+
* Class: org_rocksdb_test_TestableEventListener
78+
* Method: invokeAllCallbacksInThread
79+
* Signature: (J)V
80+
*/
81+
JNIEXPORT void JNICALL Java_org_rocksdb_test_TestableEventListener_invokeAllCallbacksInThread
82+
(JNIEnv *, jclass, jlong jhandle) {
83+
std::thread t1 = std::thread(Java_org_rocksdb_test_TestableEventListener_invokeAllCallbacks, nullptr, nullptr, jhandle);
84+
t1.join();
85+
}
86+
7587
/*
7688
* Class: org_rocksdb_test_TestableEventListener
7789
* Method: invokeAllCallbacks
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.rocksdb;
2+
3+
4+
import org.junit.Test;
5+
6+
import java.lang.reflect.Method;
7+
import java.net.URL;
8+
import java.net.URLClassLoader;
9+
import java.nio.file.Path;
10+
import java.nio.file.Paths;
11+
12+
import static org.assertj.core.api.Assertions.assertThat;
13+
import static org.assertj.core.api.Assertions.fail;
14+
15+
16+
17+
/**
18+
* Only this class can be on default classpath.
19+
* It loads rocksDB code with custom classloader and then test that all
20+
* event data for event listener can be instantiated.
21+
*/
22+
public class EventListenerClassloaderTest {
23+
24+
25+
@Test
26+
public void testCallback() throws Exception {
27+
28+
try {
29+
this.getClass().getClassLoader().loadClass("org.rocksdb.RocksDB");
30+
fail("It looks like RocksDB is on classpath. This test must load RocksDB via custom classLoader" +
31+
" to verify callback cache all class instances.");
32+
}catch (ClassNotFoundException e) {
33+
;
34+
}
35+
36+
String jarPath = System.getProperty("rocks-jar");
37+
assertThat(jarPath).isNotNull().as("Java property 'rocks-jar' was not setup properly");
38+
39+
Path classesDir = Paths.get(jarPath);
40+
ClassLoader cl = new URLClassLoader(new URL[]{
41+
classesDir.toAbsolutePath().toUri().toURL()
42+
});
43+
44+
Class rocksDBclazz = cl.loadClass("org.rocksdb.RocksDB");
45+
Method loadLibrary = rocksDBclazz.getMethod("loadLibrary");
46+
loadLibrary.invoke(null);
47+
48+
Class testableEventListenerClazz = cl.loadClass("org.rocksdb.test.TestableEventListener");
49+
Method invokeAllCallbacksInThread = testableEventListenerClazz.getMethod("invokeAllCallbacksInThread");
50+
Object instance = testableEventListenerClazz.getDeclaredConstructor().newInstance();
51+
invokeAllCallbacksInThread.invoke(instance);
52+
53+
54+
}
55+
}

java/src/test/java/org/rocksdb/test/TestableEventListener.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,10 @@ public void invokeAllCallbacks() {
1919
invokeAllCallbacks(nativeHandle_);
2020
}
2121

22+
public void invokeAllCallbacksInThread() {
23+
invokeAllCallbacksInThread(nativeHandle_);
24+
}
25+
2226
private static native void invokeAllCallbacks(final long handle);
27+
private static native void invokeAllCallbacksInThread(final long handle);
2328
}

0 commit comments

Comments
 (0)