Starlarkify some java runtime tests and one common test.

PiperOrigin-RevId: 880883085
Change-Id: I6b2013aa8fba49136967563c349292f1ab098f91
diff --git a/test/java/common/rules/BUILD b/test/java/common/rules/BUILD
index cc2cd33..32870da 100644
--- a/test/java/common/rules/BUILD
+++ b/test/java/common/rules/BUILD
@@ -1,3 +1,4 @@
+load(":add_exports_tests.bzl", "add_exports_tests")
 load(":deploy_archive_builder_tests.bzl", "deploy_archive_builder_test_suite")
 load(":java_binary_tests.bzl", "java_binary_tests")
 load(":java_import_tests.bzl", "java_import_tests")
@@ -21,3 +22,5 @@
 java_import_tests(name = "java_import_tests")
 
 java_test_tests(name = "java_test_tests")
+
+add_exports_tests(name = "add_exports_tests")
diff --git a/test/java/common/rules/add_exports_tests.bzl b/test/java/common/rules/add_exports_tests.bzl
new file mode 100644
index 0000000..482e731
--- /dev/null
+++ b/test/java/common/rules/add_exports_tests.bzl
@@ -0,0 +1,39 @@
+"""Tests for the add_exports attribute"""
+
+load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
+load("@rules_testing//lib:util.bzl", "util")
+load("//java:defs.bzl", "java_library")
+load("//test/java/testutil:java_info_subject.bzl", "java_info_subject")
+load("//test/java/testutil:rules/java_info_merge.bzl", "java_info_merge_rule")
+
+def _test_merge_add_exports(name):
+    util.helper_target(
+        java_info_merge_rule,
+        name = name + "/merge",
+        deps = [name + "/a"],
+    )
+    util.helper_target(
+        java_library,
+        name = name + "/a",
+        srcs = ["A.java"],
+        add_exports = ["java.base/java.lang"],
+    )
+
+    analysis_test(
+        name = name,
+        impl = _test_merge_add_exports_impl,
+        target = name + "/merge",
+    )
+
+def _test_merge_add_exports_impl(env, target):
+    java_info_subject.from_target(env, target).module_flags().add_exports().contains_exactly(
+        ["java.base/java.lang"],
+    )
+
+def add_exports_tests(name):
+    test_suite(
+        name = name,
+        tests = [
+            _test_merge_add_exports,
+        ],
+    )
diff --git a/test/java/common/rules/merge_attrs_tests.bzl b/test/java/common/rules/merge_attrs_tests.bzl
index 84b340e..bea71ad 100644
--- a/test/java/common/rules/merge_attrs_tests.bzl
+++ b/test/java/common/rules/merge_attrs_tests.bzl
@@ -1,4 +1,4 @@
-"""Tests for merge_attrsfunction"""
+"""Tests for merge_attrs function"""
 
 load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest")
 load(
diff --git a/test/java/testutil/cc_info_subject.bzl b/test/java/testutil/cc_info_subject.bzl
index 2d7dca1..b50ff2e 100644
--- a/test/java/testutil/cc_info_subject.bzl
+++ b/test/java/testutil/cc_info_subject.bzl
@@ -22,6 +22,7 @@
     public = struct(
         equals = lambda other: _cc_info_linking_context_equals(self.actual, other, self.meta),
         library_files = lambda: _new_library_files_subject(self.actual, self.meta),
+        static_library_files = lambda: _new_static_library_files_subject(self.actual, self.meta),
     )
     return public
 
@@ -43,6 +44,17 @@
         meta = meta.derive("library_files"),
     )
 
+def _new_static_library_files_subject(linking_context, meta):
+    static_libraries = []
+    for input in linking_context.linker_inputs.to_list():
+        for lib in input.libraries:
+            if lib.static_library:
+                static_libraries.append(lib.static_library)
+    return subjects.depset_file(
+        depset(static_libraries),
+        meta = meta.derive("static_library_files"),
+    )
+
 def _cc_info_linking_context_equals(actual, expected, meta):
     if actual == expected:
         return
@@ -87,6 +99,7 @@
     return seq[0]
 
 cc_info_subject = struct(
+    new_from_cc_info = _new_cc_info_subject,
     new_from_java_info = lambda java_info, meta: _new_cc_info_subject(java_info.cc_link_params_info, meta.derive("cc_link_params_info")),
     libraries_to_link = _new_cc_info_libraries_to_link_subject,
 )
diff --git a/test/java/testutil/java_runtime_info_subject.bzl b/test/java/testutil/java_runtime_info_subject.bzl
index ad68fea..bb6ae52 100644
--- a/test/java/testutil/java_runtime_info_subject.bzl
+++ b/test/java/testutil/java_runtime_info_subject.bzl
@@ -3,6 +3,7 @@
 load("@rules_testing//lib:truth.bzl", "subjects", "truth")
 load("@rules_testing//lib:util.bzl", "TestingAspectInfo")
 load("//java/common:java_common.bzl", "java_common")
+load(":cc_info_subject.bzl", "cc_info_subject")
 
 def _new_java_runtime_info_subject(java_runtime_info, meta):
     self = struct(
@@ -10,11 +11,19 @@
         meta = meta.derive("JavaRuntimeInfo"),
     )
     public = struct(
+        hermetic_static_libs = lambda: _new_hermetic_static_libs_subject(self.actual.hermetic_static_libs, self.meta.derive("hermetic_static_libs")),
         java_home = lambda: _new_path_string_subject(self.actual.java_home, self.meta.derive("java_home")),
         java_home_runfiles_path = lambda: _new_path_string_subject(self.actual.java_home_runfiles_path, self.meta.derive("java_home_runfiles_path")),
         java_executable_exec_path = lambda: _new_path_string_subject(self.actual.java_executable_exec_path, self.meta.derive("java_executable_exec_path")),
         java_executable_runfiles_path = lambda: _new_path_string_subject(self.actual.java_executable_runfiles_path, self.meta.derive("java_executable_runfiles_path")),
         files = lambda: subjects.depset_file(self.actual.files, self.meta.derive("files")),
+        lib_ct_sym = lambda: subjects.file(self.actual.lib_ct_sym, self.meta.derive("lib_ct_sym")),
+    )
+    return public
+
+def _new_hermetic_static_libs_subject(hermetic_static_libs, meta):
+    public = struct(
+        singleton = lambda: cc_info_subject.new_from_cc_info(_get_singleton(hermetic_static_libs), meta.derive("cc_info")),
     )
     return public
 
@@ -46,6 +55,11 @@
         ),
     )
 
+def _get_singleton(seq):
+    if len(seq) != 1:
+        fail("expected singleton, got:", seq)
+    return seq[0]
+
 java_runtime_info_subject = struct(
     new = _new_java_runtime_info_subject,
     from_target = _from_target,
diff --git a/test/java/toolchains/java_runtime_tests.bzl b/test/java/toolchains/java_runtime_tests.bzl
index 5ec2a06..0112b17 100644
--- a/test/java/toolchains/java_runtime_tests.bzl
+++ b/test/java/toolchains/java_runtime_tests.bzl
@@ -1,5 +1,6 @@
 """Tests for the java_runtime rule"""
 
+load("@rules_cc//cc:defs.bzl", "cc_import")
 load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
 load("@rules_testing//lib:truth.bzl", "matching", "subjects")
 load("@rules_testing//lib:util.bzl", "util")
@@ -353,6 +354,71 @@
         "{gendir}/{package}/generated_java_home",
     )
 
+def _test_hermetic_static_libs(name):
+    util.helper_target(
+        cc_import,
+        name = name + "/libs",
+        static_library = "libStatic.a",
+    )
+    util.helper_target(
+        java_runtime,
+        name = name + "/jvm",
+        lib_modules = name + "/gen_lib_modules",
+        hermetic_srcs = [name + "/hermetic.properties"],
+        hermetic_static_libs = [name + "/libs"],
+    )
+
+    analysis_test(
+        name = name,
+        impl = _test_hermetic_static_libs_impl,
+        target = name + "/jvm",
+    )
+
+def _test_hermetic_static_libs_impl(env, target):
+    cc_info = java_runtime_info_subject.from_target(env, target).hermetic_static_libs().singleton()
+    cc_info.linking_context().static_library_files().contains_exactly(["{package}/libStatic.a"])
+
+def _test_implicit_lib_ct_sym(name):
+    util.helper_target(
+        java_runtime,
+        name = name + "/jvm",
+        srcs = [
+            name + "/java",
+            name + "/jvm/implicit/lib/ct.sym",
+        ],
+    )
+    analysis_test(
+        name = name,
+        impl = _test_implicit_lib_ct_sym_impl,
+        target = name + "/jvm",
+    )
+
+def _test_implicit_lib_ct_sym_impl(env, target):
+    java_runtime_info_subject.from_target(env, target).lib_ct_sym().short_path_equals(
+        "{package}/{name}/implicit/lib/ct.sym",
+    )
+
+def _test_explicit_lib_ct_sym(name):
+    util.helper_target(
+        java_runtime,
+        name = name + "/jvm",
+        srcs = [
+            name + "/java",
+            name + "/jvm/implicit/lib/ct.sym",
+        ],
+        lib_ct_sym = name + "/jvm/explicit/lib/ct.sym",
+    )
+    analysis_test(
+        name = name,
+        impl = _test_explicit_lib_ct_sym_impl,
+        target = name + "/jvm",
+    )
+
+def _test_explicit_lib_ct_sym_impl(env, target):
+    java_runtime_info_subject.from_target(env, target).lib_ct_sym().short_path_equals(
+        "{package}/{name}/explicit/lib/ct.sym",
+    )
+
 def java_runtime_tests(name):
     test_suite(
         name = name,
@@ -371,5 +437,8 @@
             _test_make_variables,
             _test_no_srcs,
             _test_java_home_generated,
+            _test_hermetic_static_libs,
+            _test_implicit_lib_ct_sym,
+            _test_explicit_lib_ct_sym,
         ],
     )