aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar Philipp Wollermann <philwo@google.com>2015-09-21 13:54:36 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-09-21 14:26:03 +0000
commit3cb162d96e6b9253f5c8f81e857f0aa787be59bf (patch)
tree3deba93336bf832134a348402a0c970c7ed44b19 /src/test/java/com/google/devtools/build
parent28f08f157d6bf206ff0aef5a9ec54694195dc911 (diff)
workers: Put all tests in bazel_worker_test.sh. Add a testbed that makes it easy to test details of how the worker strategy behaves in corner cases.
-- MOS_MIGRATED_REVID=103541927
Diffstat (limited to 'src/test/java/com/google/devtools/build')
-rw-r--r--src/test/java/com/google/devtools/build/lib/worker/ExampleWorker.java128
-rw-r--r--src/test/java/com/google/devtools/build/lib/worker/ExampleWorkerOptions.java41
2 files changed, 169 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/worker/ExampleWorker.java b/src/test/java/com/google/devtools/build/lib/worker/ExampleWorker.java
new file mode 100644
index 0000000000..b9146b2fba
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/worker/ExampleWorker.java
@@ -0,0 +1,128 @@
+// Copyright 2015 Google Inc. 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.
+package com.google.devtools.build.lib.worker;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.worker.ExampleWorkerOptions.ExampleWorkOptions;
+import com.google.devtools.build.lib.worker.WorkerProtocol.WorkRequest;
+import com.google.devtools.build.lib.worker.WorkerProtocol.WorkResponse;
+import com.google.devtools.common.options.OptionsParser;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * An example implementation of a worker process that is used for integration tests.
+ */
+public class ExampleWorker {
+
+ public static void main(String[] args) throws Exception {
+ if (ImmutableSet.copyOf(args).contains("--persistent_worker")) {
+ OptionsParser parser = OptionsParser.newOptionsParser(ExampleWorkerOptions.class);
+ parser.setAllowResidue(false);
+ parser.parse(args);
+ ExampleWorkerOptions workerOptions = parser.getOptions(ExampleWorkerOptions.class);
+ Preconditions.checkState(workerOptions.persistentWorker);
+
+ runPersistentWorker(workerOptions);
+ } else {
+ // This is a single invocation of the example that exits after it processed the request.
+ processRequest(ImmutableList.copyOf(args));
+ }
+ }
+
+ private static void runPersistentWorker(ExampleWorkerOptions workerOptions) throws IOException {
+ PrintStream originalStdOut = System.out;
+ PrintStream originalStdErr = System.err;
+
+ while (true) {
+ try {
+ WorkRequest request = WorkRequest.parseDelimitedFrom(System.in);
+ if (request == null) {
+ break;
+ }
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ int exitCode = 0;
+
+ try (PrintStream ps = new PrintStream(baos)) {
+ System.setOut(ps);
+ System.setErr(ps);
+
+ try {
+ processRequest(request.getArgumentsList());
+ } catch (Exception e) {
+ e.printStackTrace();
+ exitCode = 1;
+ }
+ } finally {
+ System.setOut(originalStdOut);
+ System.setErr(originalStdErr);
+ }
+
+ WorkResponse.newBuilder()
+ .setOutput(baos.toString())
+ .setExitCode(exitCode)
+ .build()
+ .writeDelimitedTo(System.out);
+ System.out.flush();
+ } finally {
+ // Be a good worker process and consume less memory when idle.
+ System.gc();
+ }
+ }
+ }
+
+ private static void processRequest(List<String> args) throws Exception {
+ if (args.size() == 1 && args.get(0).startsWith("@")) {
+ args = Files.readAllLines(Paths.get(args.get(0).substring(1)), UTF_8);
+ }
+
+ OptionsParser parser = OptionsParser.newOptionsParser(ExampleWorkOptions.class);
+ parser.setAllowResidue(true);
+ parser.parse(args);
+ ExampleWorkOptions workOptions = parser.getOptions(ExampleWorkOptions.class);
+
+ List<String> residue = parser.getResidue();
+ List<String> outputs = new ArrayList(residue.size());
+ for (String arg : residue) {
+ String output = arg;
+ if (workOptions.uppercase) {
+ output = output.toUpperCase();
+ }
+ outputs.add(output);
+ }
+
+ String outputStr = Joiner.on(' ').join(outputs);
+ if (workOptions.outputFile.isEmpty()) {
+ System.err.println("ExampleWorker: Writing to stdout!");
+ System.out.println(outputStr);
+ } else {
+ System.err.println("ExampleWorker: Writing to file " + workOptions.outputFile);
+ try (PrintStream outputFile = new PrintStream(workOptions.outputFile)) {
+ outputFile.println(outputStr);
+ }
+ }
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/worker/ExampleWorkerOptions.java b/src/test/java/com/google/devtools/build/lib/worker/ExampleWorkerOptions.java
new file mode 100644
index 0000000000..3b5878c8f4
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/worker/ExampleWorkerOptions.java
@@ -0,0 +1,41 @@
+// Copyright 2015 Google Inc. 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.
+package com.google.devtools.build.lib.worker;
+
+import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionsBase;
+
+/**
+ * Options for the example worker itself.
+ */
+public class ExampleWorkerOptions extends OptionsBase {
+
+ /**
+ * Options for the example worker concerning single units of work.
+ */
+ public static class ExampleWorkOptions extends OptionsBase {
+ @Option(
+ name = "output_file",
+ defaultValue = "",
+ help = "Write the output to a file instead of stdout."
+ )
+ public String outputFile;
+
+ @Option(name = "uppercase", defaultValue = "false", help = "Uppercase the input.")
+ public boolean uppercase;
+ }
+
+ @Option(name = "persistent_worker", defaultValue = "false")
+ public boolean persistentWorker;
+}