Allow overriding the methodology of determining the hostname.

PiperOrigin-RevId: 373598339
diff --git a/src/main/java/com/google/devtools/build/lib/util/NetUtil.java b/src/main/java/com/google/devtools/build/lib/util/NetUtil.java
index fc669ca..10868c9 100644
--- a/src/main/java/com/google/devtools/build/lib/util/NetUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/util/NetUtil.java
@@ -13,18 +13,23 @@
 // limitations under the License.
 package com.google.devtools.build.lib.util;
 
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.function.Supplier;
 
 /**
  * Various utility methods for network related stuff.
  */
 public final class NetUtil {
 
-  private static String hostname;
+  private static String hostname = null;
+  private static Supplier<String> hostnameSupplier = NetUtil::computeShortHostName;
 
-  private NetUtil() {
-  }
+  private NetUtil() {}
 
   /**
    * Returns the *cached* short hostname (computed at most once per the lifetime of a server). Can
@@ -34,7 +39,8 @@
     if (hostname == null) {
       synchronized (NetUtil.class) {
         if (hostname == null) {
-          hostname = computeShortHostName();
+          hostname = firstNonNull(hostnameSupplier.get(), "unknown");
+          hostnameSupplier = null;
         }
       }
     }
@@ -42,6 +48,18 @@
   }
 
   /**
+   * Sets a {@link Supplier} for the hostname to return from {@link #getCachedShortHostName}.
+   *
+   * <p>If not called, the hostname comes from {@link #computeShortHostName}. To prevent multiple
+   * different hostnames from being used, it is illegal to call this after {@link
+   * #getCachedShortHostName} has been called.
+   */
+  public static synchronized void overrideHostnameSupplier(Supplier<String> override) {
+    checkState(hostname == null, "Hostname already set to %s", hostname);
+    hostnameSupplier = checkNotNull(override);
+  }
+
+  /**
    * Returns the short hostname or <code>unknown</code> if the host name could not be determined.
    * Performs reverse DNS lookup and can take seconds to complete.
    */