Migrate the `JavaImportConfiguredTargetTest.testModuleFlags` test to Starlark

The test is removed from Bazel and added to rules_java

(ignore-relnotes)

PiperOrigin-RevId: 756213013
Change-Id: Iaa80599a95b5fab90c107cc68f14b787fa55f3bc
diff --git a/MODULE.bazel b/MODULE.bazel
index c8994ee..400a4c2 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -7,7 +7,7 @@
 
 bazel_dep(name = "platforms", version = "0.0.11")
 bazel_dep(name = "rules_cc", version = "0.0.15")
-bazel_dep(name = "bazel_features", version = "1.11.0")
+bazel_dep(name = "bazel_features", version = "1.28.0")
 bazel_dep(name = "bazel_skylib", version = "1.6.1")
 bazel_dep(name = "protobuf", version = "27.0", repo_name = "com_google_protobuf")
 bazel_dep(name = "zlib", version = "1.3.1.bcr.5")
diff --git a/WORKSPACE b/WORKSPACE
index cf3fa50..3cb2379 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -63,3 +63,14 @@
 load("//test:repositories.bzl", "test_repositories")
 
 test_repositories()
+
+http_archive(
+    name = "bazel_features",
+    sha256 = "2f057dd02098a106095ea291b4344257398a059eadb2c74cc470de0f9664dccd",
+    strip_prefix = "bazel_features-1.28.0",
+    url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.28.0/bazel_features-v1.28.0.tar.gz",
+)
+
+load("@bazel_features//:deps.bzl", "bazel_features_deps")
+
+bazel_features_deps()
diff --git a/test/java/common/rules/java_import_tests.bzl b/test/java/common/rules/java_import_tests.bzl
index 46b3983..fbf2151 100644
--- a/test/java/common/rules/java_import_tests.bzl
+++ b/test/java/common/rules/java_import_tests.bzl
@@ -1,11 +1,13 @@
 """Tests for the java_import rule"""
 
+load("@bazel_features//:features.bzl", "bazel_features")
 load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
 load("@rules_testing//lib:truth.bzl", "matching")
 load("@rules_testing//lib:util.bzl", "util")
 load("//java:java_import.bzl", "java_import")
 load("//java:java_library.bzl", "java_library")
 load("//java/common:java_info.bzl", "JavaInfo")
+load("//test/java/testutil:helper.bzl", "always_passes")
 load("//test/java/testutil:java_info_subject.bzl", "java_info_subject")
 load("//test/java/testutil:rules/forward_java_info.bzl", "java_info_forwarding_rule")
 
@@ -217,6 +219,56 @@
 def _test_java_library_allows_import_in_deps_impl(_env, _target):
     pass  # no errors
 
+def _test_module_flags(name):
+    if not bazel_features.java.java_info_constructor_module_flags:
+        # exit early because this test case would be a loading phase error otherwise
+        always_passes(name)
+        return
+
+    util.helper_target(
+        java_library,
+        name = name + "/lib",
+        srcs = ["Main.java"],
+        deps = [name + "/import-jar"],
+    )
+    util.helper_target(
+        java_import,
+        name = name + "/import-jar",
+        jars = ["import.jar"],
+        exports = [name + "/exportjar"],
+        deps = [name + "/depjar"],
+    )
+    util.helper_target(
+        java_import,
+        name = name + "/depjar",
+        add_exports = ["java.base/java.lang"],
+        jars = ["depjar.jar"],
+    )
+    util.helper_target(
+        java_import,
+        name = name + "/exportjar",
+        add_opens = ["java.base/java.util"],
+        jars = ["exportjar.jar"],
+    )
+
+    analysis_test(
+        name = name,
+        impl = _test_module_flags_impl,
+        targets = {
+            "importjar": name + "/import-jar",
+            "lib": name + "/lib",
+        },
+    )
+
+def _test_module_flags_impl(env, targets):
+    assert_import_module_flags = java_info_subject.from_target(env, targets.importjar).module_flags()
+    assert_import_module_flags.add_exports().contains_exactly(["java.base/java.lang"])
+    assert_import_module_flags.add_opens().contains_exactly(["java.base/java.util"])
+
+    assert_lib_module_flags = java_info_subject.from_target(env, targets.lib).module_flags()
+    assert_lib_module_flags.add_exports().contains_exactly(["java.base/java.lang"])
+    assert_lib_module_flags.add_opens().contains_exactly(["java.base/java.util"])
+
 def java_import_tests(name):
     test_suite(
         name = name,
@@ -227,5 +279,6 @@
             _test_deps,
             _test_commandline_contains_target_label,
             _test_java_library_allows_import_in_deps,
+            _test_module_flags,
         ],
     )
diff --git a/test/java/testutil/helper.bzl b/test/java/testutil/helper.bzl
new file mode 100644
index 0000000..eace0f8
--- /dev/null
+++ b/test/java/testutil/helper.bzl
@@ -0,0 +1,20 @@
+"""Misc helpers for rules_java testing"""
+
+load("@rules_testing//lib:analysis_test.bzl", "analysis_test")
+load("@rules_testing//lib:util.bzl", "util")
+
+def always_passes(name):
+    """Declares a fake, always passing test
+
+    Args:
+        name: (str) the name of the test
+    """
+    util.helper_target(
+        native.filegroup,
+        name = name + "/empty",
+    )
+    analysis_test(
+        name = name,
+        impl = lambda *a, **kw: None,
+        target = name + "/empty",
+    )
diff --git a/test/java/testutil/java_info_subject.bzl b/test/java/testutil/java_info_subject.bzl
index 972dc47..f263b04 100644
--- a/test/java/testutil/java_info_subject.bzl
+++ b/test/java/testutil/java_info_subject.bzl
@@ -26,6 +26,7 @@
         transitive_source_jars = lambda: subjects.depset_file(java_info.transitive_source_jars, self.meta.derive("transitive_source_jars")),
         transitive_source_jars_list = lambda: subjects.collection(java_info.transitive_source_jars.to_list(), self.meta.derive("transitive_source_jars.to_list()")),
         runtime_output_jars = lambda: subjects.depset_file(java_info.runtime_output_jars, self.meta.derive("runtime_output_jars")),
+        module_flags = lambda: _new_java_module_flags_subject(self.actual, self.meta),
     )
     return public
 
@@ -37,6 +38,17 @@
         },
     ))
 
+def _new_java_module_flags_subject(java_info, meta):
+    self = struct(
+        actual = java_info.module_flags_info,
+        meta = meta.derive("module_flags_info"),
+    )
+    public = struct(
+        add_exports = lambda: subjects.collection(self.actual.add_exports.to_list(), self.meta.derive("add_exports")),
+        add_opens = lambda: subjects.collection(self.actual.add_opens.to_list(), self.meta.derive("add_opens")),
+    )
+    return public
+
 def _new_java_compilation_info_subject(java_info, meta):
     self = struct(
         actual = java_info.compilation_info,