diff --git a/src/test/java/com/google/devtools/build/lib/remote/BUILD b/src/test/java/com/google/devtools/build/lib/remote/BUILD index a65bcfc0ba3d25..ab9e4802ce682e 100644 --- a/src/test/java/com/google/devtools/build/lib/remote/BUILD +++ b/src/test/java/com/google/devtools/build/lib/remote/BUILD @@ -149,6 +149,7 @@ java_test( size = "large", srcs = ["BuildWithoutTheBytesIntegrationTest.java"], shard_count = 5, + tags = ["requires-network"], runtime_deps = [ "//third_party/grpc-java:grpc-jar", ], @@ -173,6 +174,7 @@ java_test( java_test( name = "DiskCacheIntegrationTest", srcs = ["DiskCacheIntegrationTest.java"], + tags = ["requires-network"], runtime_deps = [ "//third_party/grpc-java:grpc-jar", ], diff --git a/src/test/java/com/google/devtools/build/lib/remote/util/IntegrationTestUtils.java b/src/test/java/com/google/devtools/build/lib/remote/util/IntegrationTestUtils.java index 44e204f06b53f7..e2d2df95f93f8c 100644 --- a/src/test/java/com/google/devtools/build/lib/remote/util/IntegrationTestUtils.java +++ b/src/test/java/com/google/devtools/build/lib/remote/util/IntegrationTestUtils.java @@ -25,8 +25,14 @@ import java.io.File; import java.io.IOException; import java.net.DatagramSocket; +import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.SocketException; +import java.nio.channels.SocketChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Comparator; import java.util.Random; /** Integration test utilities. */ @@ -73,6 +79,30 @@ public static int pickUnusedRandomPort() throws IOException, InterruptedExceptio throw new IOException("Failed to find available port"); } + private static void waitForPortOpen(Subprocess process, int port) + throws IOException, InterruptedException { + var addr = new InetSocketAddress("localhost", port); + var timeout = new IOException("Timed out when waiting for port to open"); + for (var i = 0; i < 20; ++i) { + if (!process.isAlive()) { + var message = new String(process.getErrorStream().readAllBytes(), UTF_8); + throw new IOException("Failed to start worker: " + message); + } + + try { + try (var socketChannel = SocketChannel.open()) { + socketChannel.configureBlocking(/* block= */ true); + socketChannel.connect(addr); + } + return; + } catch (IOException e) { + timeout.addSuppressed(e); + Thread.sleep(1000); + } + } + throw timeout; + } + public static WorkerInstance startWorker() throws IOException, InterruptedException { return startWorker(/* useHttp= */ false); } @@ -82,7 +112,6 @@ public static WorkerInstance startWorker(boolean useHttp) PathFragment testTmpDir = PathFragment.create(tmpDirFile().getAbsolutePath()); PathFragment workPath = testTmpDir.getRelative("remote.work_path"); PathFragment casPath = testTmpDir.getRelative("remote.cas_path"); - PathFragment pidPath = testTmpDir.getRelative("remote.pid_file"); int workerPort = pickUnusedRandomPort(); ensureMkdir(workPath); ensureMkdir(casPath); @@ -94,20 +123,10 @@ public static WorkerInstance startWorker(boolean useHttp) workerPath, "--work_path=" + workPath.getSafePathString(), "--cas_path=" + casPath.getSafePathString(), - (useHttp ? "--http_listen_port=" : "--listen_port=") + workerPort, - "--pid_file=" + pidPath)) + (useHttp ? "--http_listen_port=" : "--listen_port=") + workerPort)) .start(); - - File pidFile = new File(pidPath.getSafePathString()); - while (!pidFile.exists()) { - if (!workerProcess.isAlive()) { - String message = new String(workerProcess.getErrorStream().readAllBytes(), UTF_8); - throw new IOException("Failed to start worker: " + message); - } - Thread.sleep(1); - } - - return new WorkerInstance(workerProcess, workerPort, workPath, casPath, pidPath); + waitForPortOpen(workerProcess, workerPort); + return new WorkerInstance(workerProcess, workerPort, workPath, casPath); } private static void ensureMkdir(PathFragment path) throws IOException { @@ -125,23 +144,25 @@ public static class WorkerInstance { private final int port; private final PathFragment workPath; private final PathFragment casPath; - private final PathFragment pidPath; private WorkerInstance( - Subprocess process, - int port, - PathFragment workPath, - PathFragment casPath, - PathFragment pidPath) { + Subprocess process, int port, PathFragment workPath, PathFragment casPath) { this.process = process; this.port = port; this.workPath = workPath; this.casPath = casPath; - this.pidPath = pidPath; } - public void stop() { + public void stop() throws IOException { process.destroyAndWait(); + deleteDir(workPath); + deleteDir(casPath); + } + + private static void deleteDir(PathFragment path) throws IOException { + try (var stream = Files.walk(Paths.get(path.getSafePathString()))) { + stream.sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); + } } public int getPort() { @@ -155,9 +176,5 @@ public PathFragment getWorkPath() { public PathFragment getCasPath() { return casPath; } - - public PathFragment getPidPath() { - return pidPath; - } } }