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; } }