[singlejar] Port test_util to Windows

- Port various functions in `test_util` to Windows.
- Change `@local_jdk//:jdk-default` (target does not seem to exist) to `@local_jdk//:jdk`.

See #2241

Closes #6248.

PiperOrigin-RevId: 217138180
diff --git a/src/tools/singlejar/BUILD b/src/tools/singlejar/BUILD
index 5fa3047..1b17ec5 100644
--- a/src/tools/singlejar/BUILD
+++ b/src/tools/singlejar/BUILD
@@ -2,13 +2,6 @@
 #   singlejar C++ implementation.
 package(default_visibility = ["//src:__subpackages__"])
 
-JAR_TOOL_PATH_COPT_TPL = "-DJAR_TOOL_PATH=\\\"external/local_jdk/bin/jar%s\\\""
-
-JAR_TOOL_PATH_COPTS = select({
-    "//src/conditions:windows": [JAR_TOOL_PATH_COPT_TPL % ".exe"],
-    "//conditions:default": [JAR_TOOL_PATH_COPT_TPL % ""],
-})
-
 filegroup(
     name = "srcs",
     srcs = glob(["**"]),
@@ -99,7 +92,7 @@
 cc_test(
     name = "desugar_checking_test",
     srcs = [
-        "desugar_checking_test.cc",
+        "combiners_test.cc",
         ":zip_headers",
         ":zlib_interface",
     ],
@@ -151,13 +144,13 @@
         "input_jar_scan_entries_test.h",
         "input_jar_scan_jartool_test.cc",
     ],
-    copts = JAR_TOOL_PATH_COPTS,
-    data = [
-        "@local_jdk//:jar",
-        "@local_jdk//:jdk",
-    ],
+    # TODO(@rongjiecomputer): update copts to handle Windows and add
+    # ".exe" extension.
+    copts = ["-DJAR_TOOL_PATH=$(JAVA)/bin/jar"],
+    data = ["@bazel_tools//tools/jdk:current_java_runtime"],
     # Timing out, see https://github.com/bazelbuild/bazel/issues/1555
     tags = ["manual"],
+    toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"],
     deps = [
         ":input_jar",
         ":test_util",
@@ -223,20 +216,23 @@
     srcs = [
         "output_jar_simple_test.cc",
     ],
-    copts = JAR_TOOL_PATH_COPTS,
+    # TODO(@rongjiecomputer): update copts to handle Windows and add
+    # ".exe" extension.
+    copts = ["-DJAR_TOOL_PATH=$(JAVA)/bin/jar"],
     data = [
         ":data1",
         ":data2",
         ":stored_jar",
         ":test1",
         ":test2",
-        "@local_jdk//:jar",
-        "@local_jdk//:jdk-default",
+        "@bazel_tools//tools/jdk:current_java_runtime",
     ],
+    toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"],
     deps = [
         ":input_jar",
         ":options",
         ":output_jar",
+        ":port",
         ":test_util",
         "//src/main/cpp/util",
         "@com_google_googletest//:gtest_main",
@@ -305,8 +301,8 @@
         "//src/test/shell:bashunit",
         "@bazel_tools//tools/bash/runfiles",
         "@bazel_tools//tools/jdk:current_java_runtime",
-        "@local_jdk//:jar",
     ],
+    toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"],
     deps = ["//src/test/shell:bashunit"],
 )
 
@@ -409,10 +405,15 @@
 
 cc_library(
     name = "test_util",
+    testonly = 1,
     srcs = ["test_util.cc"],
     hdrs = ["test_util.h"],
     deps = [
         "//src/main/cpp/util",
+        # TODO(laszlocsomor) Use @bazel_tools//tools/cpp/runfiles after Bazel is
+        # released with
+        # https://github.com/bazelbuild/bazel/commit/23bc3bee79d8a8b8dc15bbfb6072ec9f965dff96.
+        "//tools/cpp/runfiles:runfiles_src_for_singlejar_only",
         "@com_google_googletest//:gtest_main",
     ],
 )
@@ -486,6 +487,7 @@
         "@bazel_tools//tools/jdk:current_java_runtime",
     ],
     outs = ["stored.jar"],
-    cmd = "$(location @local_jdk//:jar) -0cf \"$@\" $(location :output_jar.cc)",
-    tools = ["@local_jdk//:jar"],
+    cmd = "$(location @bazel_tools//tools/jdk:current_java_runtime) -0cf \"$@\" $(location :output_jar.cc)",
+    toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"],
+    tools = ["@bazel_tools//tools/jdk:current_java_runtime"],
 )
diff --git a/src/tools/singlejar/test_util.cc b/src/tools/singlejar/test_util.cc
index 722df5d..131e345 100644
--- a/src/tools/singlejar/test_util.cc
+++ b/src/tools/singlejar/test_util.cc
@@ -18,6 +18,10 @@
 #include <stdlib.h>
 #include <sys/types.h>
 
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
 #include <string>
 
 #include "src/main/cpp/util/file.h"
@@ -27,9 +31,25 @@
 
 #include "googletest/include/gtest/gtest.h"
 
+#ifdef _WIN32
+#define popen _popen
+#define pclose _pclose
+#endif
+
 namespace singlejar_test_util {
 
 bool AllocateFile(const string &name, size_t size) {
+#ifdef _WIN32
+  int fd = _sopen(name.c_str(), _O_RDWR | _O_CREAT | _O_BINARY, _SH_DENYNO,
+                  _S_IREAD | _S_IWRITE);
+  int success = _chsize_s(fd, size);
+  _close(fd);
+  if (success < 0) {
+    perror(strerror(errno));
+    return false;
+  }
+  return true;
+#else
   int fd = open(name.c_str(), O_CREAT | O_RDWR | O_TRUNC, 0777);
   if (fd < 0) {
     perror(name.c_str());
@@ -47,6 +67,7 @@
   } else {
     return close(fd) == 0;
   }
+#endif
 }
 
 int RunCommand(const char *cmd, ...) {
@@ -87,7 +108,13 @@
   string command;
   blaze_util::StringPrintf(&command, "unzip -p %s %s", zip_path.c_str(),
                            entry_name.c_str());
+#ifdef _WIN32
+  // "b" is Microsoft-specific. It's necessary, because without it the popen
+  // implementation will strip "\r\n" to "\n" and make many tests fail.
+  FILE *fp = popen(command.c_str(), "rb");
+#else
   FILE *fp = popen(command.c_str(), "r");
+#endif
   if (!fp) {
     ADD_FAILURE() << "Command " << command << " failed.";
     return string("");
diff --git a/src/tools/singlejar/test_util.h b/src/tools/singlejar/test_util.h
index 184e40f..fbe2661 100644
--- a/src/tools/singlejar/test_util.h
+++ b/src/tools/singlejar/test_util.h
@@ -14,9 +14,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <unistd.h>
 #include <string>
 
+#include "tools/cpp/runfiles/runfiles_src.h"
+
 namespace singlejar_test_util {
   using std::string;