Improve CliFixture messages and Win behavior
Original commit: elastic/x-pack-elasticsearch@332d1744a2
This commit is contained in:
parent
fdd98f01ed
commit
de85a2cd2b
|
@ -22,6 +22,7 @@ import java.nio.file.StandardCopyOption;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
import static java.util.Collections.singleton;
|
import static java.util.Collections.singleton;
|
||||||
|
|
||||||
|
@ -42,12 +43,18 @@ public class CliFixture {
|
||||||
if (false == Files.isRegularFile(cliJar)) {
|
if (false == Files.isRegularFile(cliJar)) {
|
||||||
throw new IllegalArgumentException(cliJar + " is not a regular file");
|
throw new IllegalArgumentException(cliJar + " is not a regular file");
|
||||||
}
|
}
|
||||||
Path javaExecutable = Paths.get(System.getProperty("java.home"), "bin", "java");
|
String javaExec = "java";
|
||||||
|
boolean isWindows = System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("win");
|
||||||
|
|
||||||
|
if (isWindows) {
|
||||||
|
javaExec += ".exe";
|
||||||
|
}
|
||||||
|
Path javaExecutable = Paths.get(System.getProperty("java.home"), "bin", javaExec);
|
||||||
if (false == Files.exists(javaExecutable)) {
|
if (false == Files.exists(javaExecutable)) {
|
||||||
throw new IllegalArgumentException(cliJar + " doesn't exist");
|
throw new IllegalArgumentException(javaExec + " doesn't exist");
|
||||||
}
|
}
|
||||||
if (false == Files.isExecutable(javaExecutable)) {
|
if (false == Files.isExecutable(javaExecutable)) {
|
||||||
throw new IllegalArgumentException(cliJar + " isn't executable");
|
throw new IllegalArgumentException(javaExec + " isn't executable");
|
||||||
}
|
}
|
||||||
|
|
||||||
try (ServerSocket server = new ServerSocket()) {
|
try (ServerSocket server = new ServerSocket()) {
|
||||||
|
@ -63,13 +70,15 @@ public class CliFixture {
|
||||||
InetSocketAddress bound = (InetSocketAddress) server.getLocalSocketAddress();
|
InetSocketAddress bound = (InetSocketAddress) server.getLocalSocketAddress();
|
||||||
if (bound.getAddress() instanceof Inet6Address) {
|
if (bound.getAddress() instanceof Inet6Address) {
|
||||||
Files.write(tmp, singleton("[" + bound.getHostString() + "]:" + bound.getPort()));
|
Files.write(tmp, singleton("[" + bound.getHostString() + "]:" + bound.getPort()));
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
Files.write(tmp, singleton(bound.getHostString() + ":" + bound.getPort()));
|
Files.write(tmp, singleton(bound.getHostString() + ":" + bound.getPort()));
|
||||||
}
|
}
|
||||||
Files.move(tmp, dir.resolve("ports"), StandardCopyOption.ATOMIC_MOVE);
|
Files.move(tmp, dir.resolve("ports"), StandardCopyOption.ATOMIC_MOVE);
|
||||||
|
|
||||||
|
boolean run = true;
|
||||||
// Run forever until killed
|
// Run forever until killed
|
||||||
while (true) {
|
while (run) {
|
||||||
try {
|
try {
|
||||||
println("accepting on localhost:" + server.getLocalPort());
|
println("accepting on localhost:" + server.getLocalPort());
|
||||||
Socket s = server.accept();
|
Socket s = server.accept();
|
||||||
|
@ -79,7 +88,7 @@ public class CliFixture {
|
||||||
}
|
}
|
||||||
List<String> command = new ArrayList<>();
|
List<String> command = new ArrayList<>();
|
||||||
command.add(javaExecutable.toString());
|
command.add(javaExecutable.toString());
|
||||||
// command.add("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000");
|
// command.add("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000");
|
||||||
// Force a specific terminal type so we have consistent responses for testing.
|
// Force a specific terminal type so we have consistent responses for testing.
|
||||||
command.add("-Dorg.jline.terminal.type=xterm-256color");
|
command.add("-Dorg.jline.terminal.type=xterm-256color");
|
||||||
// Disable terminal types that won't work with stdin isn't actually a tty
|
// Disable terminal types that won't work with stdin isn't actually a tty
|
||||||
|
@ -95,30 +104,30 @@ public class CliFixture {
|
||||||
Process process = cliBuilder.start();
|
Process process = cliBuilder.start();
|
||||||
println("started " + command);
|
println("started " + command);
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
int i;
|
int i;
|
||||||
try {
|
try {
|
||||||
while ((i = process.getInputStream().read()) != -1) {
|
while ((i = process.getInputStream().read()) != -1) {
|
||||||
s.getOutputStream().write(i);
|
s.getOutputStream().write(i);
|
||||||
s.getOutputStream().flush();
|
s.getOutputStream().flush();
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException("failed to copy from process to socket", e);
|
throw new RuntimeException("failed to copy from process to socket", e);
|
||||||
} finally {
|
} finally {
|
||||||
process.destroyForcibly();
|
process.destroyForcibly();
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
int i;
|
int i;
|
||||||
try {
|
try {
|
||||||
while ((i = s.getInputStream().read()) != -1) {
|
while ((i = s.getInputStream().read()) != -1) {
|
||||||
process.getOutputStream().write(i);
|
process.getOutputStream().write(i);
|
||||||
process.getOutputStream().flush();
|
process.getOutputStream().flush();
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException("failed to copy from socket to process", e);
|
throw new RuntimeException("failed to copy from socket to process", e);
|
||||||
} finally {
|
} finally {
|
||||||
process.destroyForcibly();
|
process.destroyForcibly();
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
process.waitFor();
|
process.waitFor();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|
Loading…
Reference in New Issue