Skip to content

Commit

Permalink
Simplify Java unit test setup and fix issues with setting system prop…
Browse files Browse the repository at this point in the history
…erties for tests.
  • Loading branch information
edgchen1 committed Sep 24, 2024
1 parent 091b81e commit 2e3979d
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 39 deletions.
32 changes: 20 additions & 12 deletions cmake/onnxruntime_java_unittests.cmake
Original file line number Diff line number Diff line change
@@ -1,23 +1,31 @@
# Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved.
# Licensed under the MIT License.

# This is a windows only file so we can run gradle tests via ctest
# This is a helper script that enables us to run gradle tests via ctest.

FILE(TO_NATIVE_PATH ${GRADLE_EXECUTABLE} GRADLE_NATIVE_PATH)
FILE(TO_NATIVE_PATH ${BIN_DIR} BINDIR_NATIVE_PATH)

message(STATUS "GRADLE_TEST_EP_FLAGS: ${ORT_PROVIDER_FLAGS}")
if (onnxruntime_ENABLE_TRAINING_APIS)
message(STATUS "Running ORT Java training tests")
execute_process(COMMAND cmd /C ${GRADLE_NATIVE_PATH} --console=plain cmakeCheck -DcmakeBuildDir=${BINDIR_NATIVE_PATH} -Dorg.gradle.daemon=false ${ORT_PROVIDER_FLAGS} -DENABLE_TRAINING_APIS=1
WORKING_DIRECTORY ${REPO_ROOT}/java
RESULT_VARIABLE HAD_ERROR)
else()
execute_process(COMMAND cmd /C ${GRADLE_NATIVE_PATH} --console=plain cmakeCheck -DcmakeBuildDir=${BINDIR_NATIVE_PATH} -Dorg.gradle.daemon=false ${ORT_PROVIDER_FLAGS}
WORKING_DIRECTORY ${REPO_ROOT}/java
RESULT_VARIABLE HAD_ERROR)
message(STATUS "gradle additional system property definitions: ${GRADLE_SYSTEM_PROPERTY_DEFINITIONS}")

set(GRADLE_TEST_ARGS
${GRADLE_NATIVE_PATH}
cmakeCheck
--console=plain
-DcmakeBuildDir=${BINDIR_NATIVE_PATH}
-Dorg.gradle.daemon=false
${GRADLE_SYSTEM_PROPERTY_DEFINITIONS})

if(WIN32)
list(PREPEND GRADLE_TEST_ARGS cmd /C)
endif()

message(STATUS "gradle test command args: ${GRADLE_TEST_ARGS}")

execute_process(COMMAND ${GRADLE_TEST_ARGS}
WORKING_DIRECTORY ${REPO_ROOT}/java
RESULT_VARIABLE HAD_ERROR)

if(HAD_ERROR)
message(FATAL_ERROR "Java Unitests failed")
message(FATAL_ERROR "Java Unitests failed")
endif()
62 changes: 36 additions & 26 deletions cmake/onnxruntime_unittests.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -1585,39 +1585,49 @@ if (NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten")

if (NOT onnxruntime_ENABLE_TRAINING_TORCH_INTEROP)
if (onnxruntime_BUILD_JAVA AND NOT onnxruntime_ENABLE_STATIC_ANALYSIS)
message(STATUS "Running Java tests")
block()
message(STATUS "Enabling Java tests")

# native-test is added to resources so custom_op_lib can be loaded
# and we want to symlink it there
# and we want to copy it there
set(JAVA_NATIVE_TEST_DIR ${JAVA_OUTPUT_DIR}/native-test)
file(MAKE_DIRECTORY ${JAVA_NATIVE_TEST_DIR})

set(CUSTOM_OP_LIBRARY_DST_FILE_NAME
$<IF:${WIN32},$<TARGET_FILE_NAME:custom_op_library>,$<TARGET_LINKER_FILE_NAME:custom_op_library>>)

add_custom_command(TARGET custom_op_library POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_FILE:custom_op_library>
${JAVA_NATIVE_TEST_DIR}/${CUSTOM_OP_LIBRARY_DST_FILE_NAME})

# delegate to gradle's test runner
if(WIN32)
add_custom_command(TARGET custom_op_library POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:custom_op_library>
${JAVA_NATIVE_TEST_DIR}/$<TARGET_FILE_NAME:custom_op_library>)
# On windows ctest requires a test to be an .exe(.com) file
# With gradle wrapper we get gradlew.bat. We delegate execution to a separate .cmake file
# That can handle both .exe and .bat
add_test(NAME onnxruntime4j_test COMMAND ${CMAKE_COMMAND}
-DGRADLE_EXECUTABLE=${GRADLE_EXECUTABLE}
-DBIN_DIR=${CMAKE_CURRENT_BINARY_DIR}
-DREPO_ROOT=${REPO_ROOT}
${ORT_PROVIDER_FLAGS}
-P ${CMAKE_CURRENT_SOURCE_DIR}/onnxruntime_java_unittests.cmake)
else()
add_custom_command(TARGET custom_op_library POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:custom_op_library>
${JAVA_NATIVE_TEST_DIR}/$<TARGET_LINKER_FILE_NAME:custom_op_library>)
if (onnxruntime_ENABLE_TRAINING_APIS)
message(STATUS "Running Java inference and training tests")
add_test(NAME onnxruntime4j_test COMMAND ${GRADLE_EXECUTABLE} cmakeCheck -DcmakeBuildDir=${CMAKE_CURRENT_BINARY_DIR} ${ORT_PROVIDER_FLAGS} -DENABLE_TRAINING_APIS=1
WORKING_DIRECTORY ${REPO_ROOT}/java)
else()
message(STATUS "Running Java inference tests only")
add_test(NAME onnxruntime4j_test COMMAND ${GRADLE_EXECUTABLE} cmakeCheck -DcmakeBuildDir=${CMAKE_CURRENT_BINARY_DIR} ${ORT_PROVIDER_FLAGS}
WORKING_DIRECTORY ${REPO_ROOT}/java)
endif()

# On Windows, ctest requires a test to be an .exe(.com) file. With gradle wrapper, we get gradlew.bat.
# To work around this, we delegate gradle execution to a separate .cmake file that can be run with cmake.
# For simplicity, we use this setup for all supported platforms and not just Windows.

# Note: Here we rely on the values in ORT_PROVIDER_FLAGS to be of the format "-Doption=value".
# This happens to also match the gradle command line option for specifying system properties.
set(GRADLE_SYSTEM_PROPERTY_DEFINITIONS ${ORT_PROVIDER_FLAGS})

if(onnxruntime_ENABLE_TRAINING_APIS)
message(STATUS "Enabling Java tests for training APIs")

list(APPEND GRADLE_SYSTEM_PROPERTY_DEFINITIONS "-DENABLE_TRAINING_APIS=1")
endif()

add_test(NAME onnxruntime4j_test COMMAND
${CMAKE_COMMAND}
-DGRADLE_EXECUTABLE=${GRADLE_EXECUTABLE}
-DBIN_DIR=${CMAKE_CURRENT_BINARY_DIR}
-DREPO_ROOT=${REPO_ROOT}
# Note: Quotes are important here to pass a list of values as a single property.
"-DGRADLE_SYSTEM_PROPERTY_DEFINITIONS=${GRADLE_SYSTEM_PROPERTY_DEFINITIONS}"
-P ${CMAKE_CURRENT_SOURCE_DIR}/onnxruntime_java_unittests.cmake)

set_property(TEST onnxruntime4j_test APPEND PROPERTY DEPENDS onnxruntime4j_jni)
endblock()
endif()
endif()

Expand Down
14 changes: 13 additions & 1 deletion java/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,19 @@ test {
if (cmakeBuildDir != null) {
workingDir cmakeBuildDir
}
systemProperties System.getProperties().subMap(['USE_CUDA', 'USE_ROCM', 'USE_TENSORRT', 'USE_DNNL', 'USE_OPENVINO', 'USE_COREML', 'USE_DML', 'JAVA_FULL_TEST', 'ENABLE_TRAINING_APIS'])
systemProperties System.getProperties().subMap([
'ENABLE_TRAINING_APIS',
'JAVA_FULL_TEST',
'USE_COREML',
'USE_CUDA',
'USE_DML',
'USE_DNNL',
'USE_OPENVINO',
'USE_ROCM',
'USE_TENSORRT',
'USE_QNN',
'USE_XNNPACK',
])
testLogging {
events "passed", "skipped", "failed"
showStandardStreams = true
Expand Down

0 comments on commit 2e3979d

Please sign in to comment.