Add value equals and hashCode to BuildConfigurationValue

Note that they only incorporate the values that are not wholly dependent on other values and not server global. To minimize chance for error here, a factory method was added to BuildConfiguration that clearly takes a set of independent, varying values (which should be part of equality) and then a constrained set of server global values (which should not be part of equality).

This is so re-computation of BuildConfigurationValue by BuildConfigurationFunction that results in an equal BuildConfigurationValue avoids full Skyframe invalidation of all ConfiguredTargetFunction computations.

PiperOrigin-RevId: 415119618
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
index 33d413a..efec6b3 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
@@ -22,7 +22,6 @@
 
 import com.google.common.base.Stopwatch;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.eventbus.Subscribe;
 import com.google.common.util.concurrent.Futures;
@@ -42,6 +41,8 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.CoreOptions;
+import com.google.devtools.build.lib.analysis.config.FragmentFactory;
+import com.google.devtools.build.lib.analysis.config.FragmentRegistry;
 import com.google.devtools.build.lib.bugreport.BugReport;
 import com.google.devtools.build.lib.buildeventstream.AnnounceBuildEventTransportsEvent;
 import com.google.devtools.build.lib.buildeventstream.ArtifactGroupNamer;
@@ -941,18 +942,33 @@
         new GenericBuildEvent(
             testId("Initial"), ImmutableSet.of(ProgressEvent.INITIAL_PROGRESS_UPDATE));
     BuildConfigurationValue configuration =
-        new BuildConfigurationValue(
+        BuildConfigurationValue.create(
+            defaultBuildOptions,
+            RepositoryName.createFromValidStrippedName("workspace"),
+            /*siblingRepositoryLayout=*/ false,
             new BlazeDirectories(
                 new ServerDirectories(outputBase, outputBase, outputBase),
                 rootDirectory,
                 /*defaultSystemJavabase=*/ null,
                 "productName"),
-            /*fragments=*/ ImmutableMap.of(),
-            defaultBuildOptions,
-            /*reservedActionMnemonics=*/ ImmutableSet.of(),
-            ActionEnvironment.EMPTY,
-            RepositoryName.createFromValidStrippedName("workspace"),
-            /*siblingRepositoryLayout=*/ false);
+            new BuildConfigurationValue.GlobalStateProvider() {
+              @Override
+              public ActionEnvironment getActionEnvironment(BuildOptions buildOptions) {
+                return ActionEnvironment.EMPTY;
+              }
+
+              @Override
+              public FragmentRegistry getFragmentRegistry() {
+                return FragmentRegistry.create(
+                    ImmutableList.of(), ImmutableList.of(), ImmutableList.of());
+              }
+
+              @Override
+              public ImmutableSet<String> getReservedActionMnemonics() {
+                return ImmutableSet.of();
+              }
+            },
+            new FragmentFactory());
     BuildEvent firstWithConfiguration =
         new GenericConfigurationEvent(testId("first"), configuration.toBuildEvent());
     BuildEvent secondWithConfiguration =