diff --git a/cmake/onnxruntime_java_unittests.cmake b/cmake/onnxruntime_java_unittests.cmake index 8edf61065d6a..6038532d9217 100644 --- a/cmake/onnxruntime_java_unittests.cmake +++ b/cmake/onnxruntime_java_unittests.cmake @@ -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() diff --git a/cmake/onnxruntime_unittests.cmake b/cmake/onnxruntime_unittests.cmake index 4b880c4437df..c0ea7892f2f2 100644 --- a/cmake/onnxruntime_unittests.cmake +++ b/cmake/onnxruntime_unittests.cmake @@ -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 + $,$>) + + add_custom_command(TARGET custom_op_library POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + $ + ${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 $ - ${JAVA_NATIVE_TEST_DIR}/$) - # 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 $ - ${JAVA_NATIVE_TEST_DIR}/$) - 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() diff --git a/java/build.gradle b/java/build.gradle index 8b4d5429b0f7..34ac93cce6f4 100644 --- a/java/build.gradle +++ b/java/build.gradle @@ -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