Add a TestType utility enum that can be used to detect if Bazel is running in a test, and use it throughout our codebase.
PiperOrigin-RevId: 310249628
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 0353b03..fff5405 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -200,6 +200,7 @@
srcs = ["runtime/LoadingPhaseThreadsOption.java"],
deps = [
"//src/main/java/com/google/devtools/build/lib/actions:localhost_capacity",
+ "//src/main/java/com/google/devtools/build/lib/util:TestType",
"//src/main/java/com/google/devtools/build/lib/util:resource_converter",
"//src/main/java/com/google/devtools/common/options",
"//third_party:flogger",
@@ -249,6 +250,7 @@
srcs = glob(["bugreport/*.java"]),
deps = [
"//src/main/java/com/google/devtools/build/lib/analysis:blaze_version_info",
+ "//src/main/java/com/google/devtools/build/lib/util:TestType",
"//src/main/java/com/google/devtools/build/lib/util:crash_failure_details",
"//src/main/java/com/google/devtools/build/lib/util:custom_exit_code_publisher",
"//src/main/java/com/google/devtools/build/lib/util:custom_failure_detail_publisher",
@@ -400,6 +402,7 @@
"//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/build/lib/unix",
"//src/main/java/com/google/devtools/build/lib/util",
+ "//src/main/java/com/google/devtools/build/lib/util:TestType",
"//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
"//src/main/java/com/google/devtools/build/lib/util:command",
"//src/main/java/com/google/devtools/build/lib/util:crash_failure_details",
diff --git a/src/main/java/com/google/devtools/build/lib/bugreport/BugReport.java b/src/main/java/com/google/devtools/build/lib/bugreport/BugReport.java
index a853d93..8a6f37d 100644
--- a/src/main/java/com/google/devtools/build/lib/bugreport/BugReport.java
+++ b/src/main/java/com/google/devtools/build/lib/bugreport/BugReport.java
@@ -27,6 +27,7 @@
import com.google.devtools.build.lib.util.DetailedExitCode;
import com.google.devtools.build.lib.util.ExitCode;
import com.google.devtools.build.lib.util.LoggingUtil;
+import com.google.devtools.build.lib.util.TestType;
import com.google.devtools.build.lib.util.io.OutErr;
import java.io.PrintStream;
import java.util.Arrays;
@@ -54,10 +55,8 @@
@Nullable private static volatile Throwable unprocessedThrowableInTest = null;
private static final Object LOCK = new Object();
- private static final boolean IN_TEST = System.getenv("TEST_TMPDIR") != null;
-
private static final boolean SHOULD_NOT_SEND_BUG_REPORT_BECAUSE_IN_TEST =
- IN_TEST && System.getenv("ENABLE_BUG_REPORT_LOGGING_IN_TEST") == null;
+ TestType.isInTest() && System.getenv("ENABLE_BUG_REPORT_LOGGING_IN_TEST") == null;
private BugReport() {}
@@ -77,7 +76,7 @@
public static void setRuntime(BlazeRuntimeInterface newRuntime) {
Preconditions.checkNotNull(newRuntime);
Preconditions.checkState(
- runtime == null || IN_TEST, "runtime already set: %s, %s", runtime, newRuntime);
+ runtime == null || TestType.isInTest(), "runtime already set: %s, %s", runtime, newRuntime);
runtime = newRuntime;
}
@@ -90,7 +89,7 @@
* is about to block on thread completion that might hang because of a failed halt below.
*/
public static void maybePropagateUnprocessedThrowableIfInTest() {
- if (IN_TEST) {
+ if (TestType.isInTest()) {
// Instead of the jvm having been halted, we might have a saved Throwable.
synchronized (LOCK) {
Throwable lastUnprocessedThrowableInTest = unprocessedThrowableInTest;
@@ -196,11 +195,11 @@
int numericExitCode = exitCodeToUse.getNumericExitCode();
try {
synchronized (LOCK) {
- if (IN_TEST) {
+ if (TestType.isInTest()) {
unprocessedThrowableInTest = throwable;
}
// Don't try to send a bug report during a crash in a test, it will throw itself.
- if (!IN_TEST || !sendBugReport) {
+ if (!TestType.isInTest() || !sendBugReport) {
logCrash(throwable, sendBugReport, args);
}
try {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index c72af4b..0ac228a 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -90,6 +90,7 @@
import com.google.devtools.build.lib.util.OS;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.util.ProcessUtils;
+import com.google.devtools.build.lib.util.TestType;
import com.google.devtools.build.lib.util.ThreadUtils;
import com.google.devtools.build.lib.util.io.OutErr;
import com.google.devtools.build.lib.vfs.DigestHashFunction.DefaultHashFunctionNotSetException;
@@ -1295,8 +1296,7 @@
.setAbruptShutdownHandler(abruptShutdownHandler)
.setEventBusExceptionHandler(subscriberExceptionHandler);
- if (System.getenv("TEST_TMPDIR") != null
- && System.getenv("NO_CRASH_ON_LOGGING_IN_TEST") == null) {
+ if (TestType.isInTest() && System.getenv("NO_CRASH_ON_LOGGING_IN_TEST") == null) {
LoggingUtil.installRemoteLogger(getTestCrashLogger());
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/LoadingPhaseThreadsOption.java b/src/main/java/com/google/devtools/build/lib/runtime/LoadingPhaseThreadsOption.java
index 2962e44..85b2209 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/LoadingPhaseThreadsOption.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/LoadingPhaseThreadsOption.java
@@ -16,6 +16,7 @@
import com.google.common.flogger.GoogleLogger;
import com.google.devtools.build.lib.actions.LocalHostCapacity;
import com.google.devtools.build.lib.util.ResourceConverter;
+import com.google.devtools.build.lib.util.TestType;
import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionDocumentationCategory;
import com.google.devtools.common.options.OptionEffectTag;
@@ -61,7 +62,7 @@
// performance.
//
// TODO(jmmv): If tests care about this, it's them who should be setting a cap.
- if (System.getenv("TEST_TMPDIR") != null) {
+ if (TestType.isInTest()) {
value = Math.min(20, value);
logger.atInfo().log("Running under a test; loading_phase_threads capped at %d", value);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
index 4300a3c..9e97667 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -101,7 +101,6 @@
":action_sketch_function",
":action_template_expansion_function",
":action_utils",
- ":actiongraph/base_cache",
":actiongraph/known_artifacts",
":actiongraph/known_aspect_descriptors",
":actiongraph/known_configurations",
@@ -109,16 +108,12 @@
":actiongraph/known_rule_class_strings",
":actiongraph/known_targets",
":actiongraph/v2/aquery_output_handler",
- ":actiongraph/v2/base_cache",
":actiongraph/v2/known_artifacts",
":actiongraph/v2/known_aspect_descriptors",
":actiongraph/v2/known_configurations",
":actiongraph/v2/known_nested_sets",
- ":actiongraph/v2/known_path_fragments",
":actiongraph/v2/known_rule_class_strings",
":actiongraph/v2/known_targets",
- ":actiongraph/v2/monolithic_output_handler",
- ":actiongraph/v2/streamed_output_handler",
":artifact_conflict_finder",
":artifact_function",
":artifact_nested_set_function",
@@ -194,7 +189,6 @@
":recursive_pkg_value",
":repository_mapping_function",
":repository_mapping_value",
- ":repository_value",
":sane_analysis_exception",
":sky_functions",
":sky_value_dirtiness_checker",
@@ -259,7 +253,6 @@
"//src/main/java/com/google/devtools/build/lib/analysis:duplicate_exception",
"//src/main/java/com/google/devtools/build/lib/analysis:inconsistent_aspect_order_exception",
"//src/main/java/com/google/devtools/build/lib/analysis:platform_options",
- "//src/main/java/com/google/devtools/build/lib/analysis:provider_collection",
"//src/main/java/com/google/devtools/build/lib/analysis:toolchain_collection",
"//src/main/java/com/google/devtools/build/lib/analysis:toolchain_context",
"//src/main/java/com/google/devtools/build/lib/analysis:top_level_artifact_context",
@@ -272,7 +265,6 @@
"//src/main/java/com/google/devtools/build/lib/causes",
"//src/main/java/com/google/devtools/build/lib/clock",
"//src/main/java/com/google/devtools/build/lib/cmdline",
- "//src/main/java/com/google/devtools/build/lib/cmdline:LabelValidator",
"//src/main/java/com/google/devtools/build/lib/collect/compacthashset",
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
"//src/main/java/com/google/devtools/build/lib/concurrent",
@@ -299,6 +291,7 @@
"//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
"//src/main/java/com/google/devtools/build/lib/syntax:frontend",
"//src/main/java/com/google/devtools/build/lib/util",
+ "//src/main/java/com/google/devtools/build/lib/util:TestType",
"//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
"//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
"//src/main/java/com/google/devtools/build/lib/util:exit_code",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ExternalFilesHelper.java b/src/main/java/com/google/devtools/build/lib/skyframe/ExternalFilesHelper.java
index 6fad4fc..c4e85d1 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ExternalFilesHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ExternalFilesHelper.java
@@ -24,6 +24,7 @@
import com.google.devtools.build.lib.repository.ExternalPackageHelper;
import com.google.devtools.build.lib.rules.repository.RepositoryFunction;
import com.google.devtools.build.lib.util.Pair;
+import com.google.devtools.build.lib.util.TestType;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.RootedPath;
import com.google.devtools.build.skyframe.SkyFunction;
@@ -33,8 +34,6 @@
/** Common utilities for dealing with paths outside the package roots. */
public class ExternalFilesHelper {
- private static final boolean IN_TEST = System.getenv("TEST_TMPDIR") != null;
-
private static final GoogleLogger logger = GoogleLogger.forEnclosingClass();
private final AtomicReference<PathPackageLocator> pkgLocator;
@@ -72,7 +71,7 @@
BlazeDirectories directories,
ManagedDirectoriesKnowledge managedDirectoriesKnowledge,
ExternalPackageHelper externalPackageHelper) {
- return IN_TEST
+ return TestType.isInTest()
? createForTesting(
pkgLocator,
externalFileAction,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
index 294c303..0de6183 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
@@ -42,6 +42,7 @@
name = "constants",
srcs = ["SerializationConstants.java"],
deps = [
+ "//src/main/java/com/google/devtools/build/lib/util:TestType",
"//src/main/java/com/google/devtools/build/lib/util:resource_usage",
],
)
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationConstants.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationConstants.java
index 11f68a0..f518129 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationConstants.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationConstants.java
@@ -15,6 +15,7 @@
package com.google.devtools.build.lib.skyframe.serialization;
import com.google.devtools.build.lib.util.ResourceUsage;
+import com.google.devtools.build.lib.util.TestType;
/**
* Some static constants for deciding serialization behavior.
@@ -24,7 +25,6 @@
/** Number of threads in deserialization pools. */
public static final int DESERIALIZATION_POOL_SIZE = 2 * ResourceUsage.getAvailableProcessors();
- private static final boolean IN_TEST = System.getenv("TEST_TMPDIR") != null;
private static final boolean CHECK_SERIALIZATION =
System.getenv("DONT_SANITY_CHECK_SERIALIZATION") == null;
@@ -32,6 +32,6 @@
* Returns true if serialization should be validated on all Skyframe writes.
*/
public static boolean shouldCheckSerializationBecauseInTest() {
- return IN_TEST && CHECK_SERIALIZATION;
+ return TestType.isInTest() && CHECK_SERIALIZATION;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/util/BUILD b/src/main/java/com/google/devtools/build/lib/util/BUILD
index 285bfc5..4e292fa 100644
--- a/src/main/java/com/google/devtools/build/lib/util/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/util/BUILD
@@ -179,6 +179,11 @@
)
java_library(
+ name = "TestType",
+ srcs = ["TestType.java"],
+)
+
+java_library(
name = "resource_usage",
srcs = [
"ResourceUsage.java",
diff --git a/src/main/java/com/google/devtools/build/lib/util/TestType.java b/src/main/java/com/google/devtools/build/lib/util/TestType.java
new file mode 100644
index 0000000..813ecbc
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/util/TestType.java
@@ -0,0 +1,42 @@
+// Copyright 2020 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.util;
+
+/**
+ * Utility to detect if in a test. Typically just {@link #isInTest} can be called to branch on
+ * unavoidable test-only behavior (avoiding filesystem access, crashing on errors, etc.).
+ *
+ * <p>Some integration tests may need to distinguish more fully between shell and Java integration
+ * tests, and can thread a {@code TestType} object to the necessary libraries to indicate that.
+ */
+public enum TestType {
+ PRODUCTION,
+ JAVA_INTEGRATION,
+ SHELL_INTEGRATION;
+
+ private static final boolean IN_TEST = System.getenv("TEST_TMPDIR") != null;
+
+ public static TestType getTestType() {
+ return IN_TEST ? SHELL_INTEGRATION : PRODUCTION;
+ }
+
+ public static boolean isInTest() {
+ return getTestType().inTest();
+ }
+
+ public boolean inTest() {
+ return !PRODUCTION.equals(this);
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/BUILD b/src/main/java/com/google/devtools/build/lib/vfs/BUILD
index 4263bbf..35949e6 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/vfs/BUILD
@@ -51,6 +51,7 @@
"//src/main/java/com/google/devtools/build/lib/concurrent",
"//src/main/java/com/google/devtools/build/lib/profiler",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
+ "//src/main/java/com/google/devtools/build/lib/util:TestType",
"//src/main/java/com/google/devtools/build/lib/util:filetype",
"//src/main/java/com/google/devtools/common/options",
"//third_party:guava",
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/DigestHashFunction.java b/src/main/java/com/google/devtools/build/lib/vfs/DigestHashFunction.java
index 6031934..be61308 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/DigestHashFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/DigestHashFunction.java
@@ -21,6 +21,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
+import com.google.devtools.build.lib.util.TestType;
import com.google.devtools.build.lib.vfs.DigestHashFunction.DigestLength.DigestLengthImpl;
import com.google.devtools.common.options.Converter;
import com.google.devtools.common.options.OptionsParsingException;
@@ -158,8 +159,7 @@
return getDefault();
} catch (DefaultHashFunctionNotSetException e) {
// Some tests use this class without calling GoogleUnixFileSystemModule.globalInit().
- Preconditions.checkState(
- System.getenv("TEST_TMPDIR") != null, "Default hash function has not been set");
+ Preconditions.checkState(TestType.isInTest(), "Default hash function has not been set");
return DigestHashFunction.SHA256;
}
}