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