@@ -2531,4 +2531,81 @@ EOF
25312531 expect_log " foo.txt"
25322532}
25332533
2534+ function test_unused_deps() {
2535+ if [[ -n " ${RULES_JAVA_OVERRIDE_PATH:- } " ]]; then
2536+ cat >> MODULE.bazel << EOF
2537+ local_path_override(
2538+ module_name = "rules_java",
2539+ path = "${RULES_JAVA_OVERRIDE_PATH} ",
2540+ )
2541+ EOF
2542+ fi
2543+
2544+ # Check if rules_java has the toolchain-driven unused_deps support
2545+ # We check this by querying the attributes of java_package_configuration
2546+ # or attempting to build a package configuration target with 'unused_deps'.
2547+ # If rules_java does not have it, we skip the test.
2548+
2549+ mkdir -p pkg
2550+ cat > pkg/BUILD << EOF
2551+ load("@rules_java//java:defs.bzl", "java_package_configuration")
2552+ java_package_configuration(
2553+ name = "test_config_query",
2554+ package_specs = [":spec_query"],
2555+ unused_deps = "error",
2556+ )
2557+ package_group(
2558+ name = "spec_query",
2559+ packages = ["//pkg/..."],
2560+ )
2561+ EOF
2562+
2563+ if ! bazel query //pkg:test_config_query > /dev/null 2>&1 ; then
2564+ echo " Skipping test_unused_deps: rules_java does not support unused_deps configuration yet"
2565+ return 0
2566+ fi
2567+
2568+ # Write the actual integration test targets
2569+ cat << 'EOF ' > pkg/BUILD
2570+ load("@rules_java//java:java_library.bzl", "java_library")
2571+ load("@rules_java//toolchains:default_java_toolchain.bzl", "default_java_toolchain")
2572+ load("@rules_java//java:defs.bzl", "java_package_configuration")
2573+
2574+ package_group(
2575+ name = "my_package_spec",
2576+ packages = ["//pkg/..."],
2577+ )
2578+
2579+ java_package_configuration(
2580+ name = "unused_deps_error_config",
2581+ package_specs = [":my_package_spec"],
2582+ unused_deps = "error",
2583+ )
2584+
2585+ default_java_toolchain(
2586+ name = "java_toolchain",
2587+ package_configuration = [":unused_deps_error_config"],
2588+ )
2589+
2590+ java_library(name = "a", srcs = ["A.java"], deps = [":b"])
2591+ java_library(name = "b", srcs = ["B.java"])
2592+ EOF
2593+
2594+ cat << 'EOF ' > pkg/A.java
2595+ public class A {
2596+ // Does not reference B
2597+ }
2598+ EOF
2599+
2600+ cat << 'EOF ' > pkg/B.java
2601+ public class B {}
2602+ EOF
2603+
2604+ bazel build //pkg:a \
2605+ --extra_toolchains=//pkg:java_toolchain_definition \
2606+ >& $TEST_log && fail " build succeeded, but expected it to fail due to unused dependency"
2607+
2608+ expect_log " Target '//pkg:b' is declared as a direct dependency of '//pkg:a' but is unused"
2609+ }
2610+
25342611run_suite " Java integration tests"
0 commit comments