From b8ecbf3396358973ef269914d5d8c26da78ca665 Mon Sep 17 00:00:00 2001 From: Dusan Balek Date: Mon, 15 Jun 2026 12:46:58 +0200 Subject: [PATCH 1/2] 8386654: Test tools/javac/SystemFilesClosed.java fails on systems without lsof --- test/langtools/tools/javac/SystemFilesClosed.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/langtools/tools/javac/SystemFilesClosed.java b/test/langtools/tools/javac/SystemFilesClosed.java index e5cd080eaffff..27e0266cbfce1 100644 --- a/test/langtools/tools/javac/SystemFilesClosed.java +++ b/test/langtools/tools/javac/SystemFilesClosed.java @@ -33,6 +33,7 @@ import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.IOException; import java.net.URI; import java.nio.file.Path; import java.nio.file.Paths; @@ -43,6 +44,7 @@ import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; @@ -53,6 +55,17 @@ public class SystemFilesClosed { @Test void testSystemFilesClosed() throws Exception { + // Probe lsof availability before doing the jlink/compile work + try { + Process process = new ProcessBuilder("lsof", "-v") + .redirectOutput(ProcessBuilder.Redirect.DISCARD) + .redirectError(ProcessBuilder.Redirect.DISCARD) + .start(); + process.waitFor(); + } catch (IOException ex) { + Assumptions.abort("lsof is not available on this system"); + } + String targetSystem = base.toString(); int ret = java.util.spi.ToolProvider.findFirst("jlink") .orElseThrow() From 4b72543c8ff5b32e21a2fce79e2c9087e8193bb1 Mon Sep 17 00:00:00 2001 From: Dusan Balek Date: Mon, 15 Jun 2026 15:39:29 +0200 Subject: [PATCH 2/2] Modified to follow reviewer comments --- .../tools/javac/SystemFilesClosed.java | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/test/langtools/tools/javac/SystemFilesClosed.java b/test/langtools/tools/javac/SystemFilesClosed.java index 27e0266cbfce1..a08828c842dcb 100644 --- a/test/langtools/tools/javac/SystemFilesClosed.java +++ b/test/langtools/tools/javac/SystemFilesClosed.java @@ -31,13 +31,15 @@ */ import java.io.BufferedReader; +import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; -import java.io.IOException; import java.net.URI; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Arrays; import java.util.List; +import java.util.Optional; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.SimpleJavaFileObject; @@ -56,14 +58,8 @@ public class SystemFilesClosed { @Test void testSystemFilesClosed() throws Exception { // Probe lsof availability before doing the jlink/compile work - try { - Process process = new ProcessBuilder("lsof", "-v") - .redirectOutput(ProcessBuilder.Redirect.DISCARD) - .redirectError(ProcessBuilder.Redirect.DISCARD) - .start(); - process.waitFor(); - } catch (IOException ex) { - Assumptions.abort("lsof is not available on this system"); + if (!lsofCommand().isPresent()) { + Assumptions.abort("lsof command is not available on this system"); } String targetSystem = base.toString(); @@ -96,7 +92,8 @@ public static void main(String[] args) { } Process process = new ProcessBuilder() - .command("lsof", "-p", String.valueOf(ProcessHandle.current().pid())) + .command(lsofCommand().orElseThrow(() -> new RuntimeException("lsof command is not available on this system")), + "-p", String.valueOf(ProcessHandle.current().pid())) .redirectOutput(ProcessBuilder.Redirect.PIPE) .redirectError(ProcessBuilder.Redirect.INHERIT) .start(); @@ -116,4 +113,17 @@ public void setUp(TestInfo info) { .orElseThrow() .getName()); } + + static Optional lsofCommandCache = Arrays.stream(new String[] { + "/usr/bin/lsof", + "/usr/sbin/lsof", + "/bin/lsof", + "/sbin/lsof", + "/usr/local/bin/lsof"}) + .filter(args -> new File(args).exists()) + .findFirst(); + + static Optional lsofCommand() { + return lsofCommandCache; + } }