blob: 898cb03d76991060a16a54affa5a47cc51054714 [file]
// Copyright 2018 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import com.google.devtools.build.runfiles.Runfiles;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;
/** A mock Java binary only used in tests, to exercise the Java Runfiles library. */
public class Foo {
public static void main(String[] args) throws IOException, InterruptedException {
System.out.println("Hello Java Foo!");
Runfiles r = Runfiles.create();
System.out.println("rloc=" + r.rlocation("foo_ws/foo/datadep/hello.txt"));
for (String lang : new String[] {"py", "java", "sh", "cc"}) {
String path = r.rlocation(childBinaryName(lang));
if (path == null || path.isEmpty()) {
throw new IOException("cannot find child binary for " + lang);
}
ProcessBuilder pb = new ProcessBuilder(path);
pb.environment().putAll(r.getEnvVars());
if (isWindows()) {
pb.environment().put("SYSTEMROOT", System.getenv("SYSTEMROOT"));
}
Process p = pb.start();
if (!p.waitFor(3, TimeUnit.SECONDS)) {
throw new IOException("child process for " + lang + " timed out");
}
if (p.exitValue() != 0) {
throw new IOException(
"child process for " + lang + " failed: " + readStream(p.getErrorStream()));
}
System.out.printf(readStream(p.getInputStream()));
}
}
private static boolean isWindows() {
return File.separatorChar == '\\';
}
private static String childBinaryName(String lang) {
if (isWindows()) {
return "foo_ws/bar/bar-" + lang + ".exe";
} else {
return "foo_ws/bar/bar-" + lang;
}
}
private static String readStream(InputStream stm) throws IOException {
StringBuilder result = new StringBuilder();
try (BufferedReader r =
new BufferedReader(new InputStreamReader(stm, StandardCharsets.UTF_8))) {
String line = null;
while ((line = r.readLine()) != null) {
line = line.trim(); // trim CRLF on Windows, LF on Linux
result.append(line).append("\n"); // ensure uniform line ending
}
}
return result.toString();
}
}