diff options
Diffstat (limited to 'src/test/java/com/google/devtools')
3 files changed, 125 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/worker/ErrorMessageTest.java b/src/test/java/com/google/devtools/build/lib/worker/ErrorMessageTest.java new file mode 100644 index 0000000000..37038b4172 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/worker/ErrorMessageTest.java @@ -0,0 +1,115 @@ +// Copyright 2017 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. + +package com.google.devtools.build.lib.worker; + +import static com.google.common.truth.Truth.assertThat; +import static java.nio.charset.StandardCharsets.UTF_8; + +import com.google.devtools.build.lib.vfs.FileSystemUtils; +import com.google.devtools.build.lib.vfs.Path; +import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests for {@link ErrorMessage}. */ +@RunWith(JUnit4.class) +public class ErrorMessageTest { + String logText = "\n\nabcdefghijklmnopqrstuvwxyz\n\n"; + + @Test + public void testEmptyErrorMessage() { + ErrorMessage errorMessage = ErrorMessage.builder().build(); + assertThat(errorMessage.toString()).isEqualTo("Unknown error"); + } + + @Test + public void testSimpleErrorMessage() { + ErrorMessage errorMessage = ErrorMessage.builder().message("Error").build(); + assertThat(errorMessage.toString()).isEqualTo("Error"); + } + + @Test + public void testErrorMessageWithLogText() { + ErrorMessage errorMessage = + ErrorMessage.builder().message("Error with log text").logText(logText).build(); + assertThat(errorMessage.toString()) + .isEqualTo( + "Error with log text\n" + + "---8<---8<--- (start of log) ---8<---8<---\n" + + "abcdefghijklmnopqrstuvwxyz\n" + + "---8<---8<--- (end of log) ---8<---8<---"); + } + + @Test + public void testErrorMessageWithEmptyLogText() { + ErrorMessage errorMessage = + ErrorMessage.builder().message("Error with log text").logText("").build(); + assertThat(errorMessage.toString()) + .isEqualTo( + "Error with log text\n" + + "---8<---8<--- (start of log) ---8<---8<---\n" + + "(empty)\n" + + "---8<---8<--- (end of log) ---8<---8<---"); + } + + @Test + public void testErrorMessageWithTruncatedLogText() { + ErrorMessage errorMessage = + ErrorMessage.builder() + .message("Error with log text") + .logText(logText) + .logSizeLimit(13) + .build(); + assertThat(errorMessage.toString()) + .isEqualTo( + "Error with log text\n" + + "---8<---8<--- (start of log) ---8<---8<---\n" + + "[... truncated ...]\n" + + "nopqrstuvwxyz\n" + + "---8<---8<--- (end of log snippet, 13 chars omitted) ---8<---8<---"); + } + + @Test + public void testErrorMessageWithLogFile() throws Exception { + InMemoryFileSystem fs = new InMemoryFileSystem(); + Path logFile = fs.getPath("/log.txt"); + FileSystemUtils.writeContent(logFile, UTF_8, logText); + ErrorMessage errorMessage = + ErrorMessage.builder().message("Error with log file").logFile(logFile).build(); + assertThat(errorMessage.toString()) + .isEqualTo( + "Error with log file\n" + + "---8<---8<--- (start of log, file at /log.txt) ---8<---8<---\n" + + "abcdefghijklmnopqrstuvwxyz\n" + + "---8<---8<--- (end of log) ---8<---8<---"); + } + + @Test + public void testErrorMessageWithUnreadableLogFile() { + InMemoryFileSystem fs = new InMemoryFileSystem(); + // This file does not exist. + Path logFile = fs.getPath("/nope.txt"); + ErrorMessage errorMessage = + ErrorMessage.builder().message("Error with log file").logFile(logFile).build(); + assertThat(errorMessage.toString()) + .startsWith( + "Error with log file\n" + + "---8<---8<--- (start of log, file at /nope.txt) ---8<---8<---\n" + + "ERROR: IOException while trying to read log file:\n" + + "java.io.FileNotFoundException: /nope.txt (No such file or directory)\n"); + assertThat(errorMessage.toString()).endsWith("---8<---8<--- (end of log) ---8<---8<---"); + } +} 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 index a940ed0bd3..2ae261e309 100644 --- a/src/test/java/com/google/devtools/build/lib/worker/ExampleWorker.java +++ b/src/test/java/com/google/devtools/build/lib/worker/ExampleWorker.java @@ -96,6 +96,9 @@ public class ExampleWorker { System.setErr(ps); if (poisoned) { + if (workerOptions.hardPoison) { + throw new IllegalStateException("I'm a very poisoned worker and will just crash."); + } System.out.println("I'm a poisoned worker and this is not a protobuf."); System.out.println("Here's a fake stack trace for you:"); System.out.println(" at com.example.Something(Something.java:83)"); 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 index 4de906a2ea..de454c9bc1 100644 --- a/src/test/java/com/google/devtools/build/lib/worker/ExampleWorkerOptions.java +++ b/src/test/java/com/google/devtools/build/lib/worker/ExampleWorkerOptions.java @@ -78,4 +78,11 @@ public class ExampleWorkerOptions extends OptionsBase { + "corrupt response instead of a response protobuf from then on (default: disabled)." ) public int poisonAfter; + + @Option( + name = "hard_poison", + defaultValue = "false", + help = "Instead of writing an error message to stdout, write it to stderr and terminate." + ) + public boolean hardPoison; } |