Mark ActionExecutionValue#valueFingerprint as transient so we don't try to serialize it. Also add fingerprints for FileStateValue: we were blindly calling #getDigest on FileStateValue, which doesn't work out well.

PiperOrigin-RevId: 227584335
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
index d52d6f3..c87860b 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
@@ -37,13 +37,16 @@
 import com.google.devtools.build.lib.actions.ArtifactSkyKey;
 import com.google.devtools.build.lib.actions.BasicActionLookupValue;
 import com.google.devtools.build.lib.actions.FileArtifactValue;
+import com.google.devtools.build.lib.actions.FilesetOutputSymlink;
 import com.google.devtools.build.lib.actions.MissingInputFileException;
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
 import com.google.devtools.build.lib.actions.util.TestAction.DummyAction;
 import com.google.devtools.build.lib.events.NullEventHandler;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.FileStatus;
+import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -280,6 +283,44 @@
     assertThat(value.getChildValues().get(treeFileArtifact2).getDigest()).isNotNull();
   }
 
+  @Test
+  public void actionExecutionValueSerialization() throws Exception {
+    Artifact artifact1 = createDerivedArtifact("one");
+    Artifact artifact2 = createDerivedArtifact("two");
+    ArtifactFileMetadata metadata1 =
+        ActionMetadataHandler.fileMetadataFromArtifact(artifact1, null, null);
+    SpecialArtifact treeArtifact = createDerivedTreeArtifactOnly("tree");
+    TreeFileArtifact treeFileArtifact =
+        createFakeTreeFileArtifact(treeArtifact, "subpath", "content");
+    TreeArtifactValue treeArtifactValue =
+        TreeArtifactValue.create(
+            ImmutableMap.of(treeFileArtifact, FileArtifactValue.create(treeFileArtifact)));
+    Artifact artifact3 = createDerivedArtifact("three");
+    FilesetOutputSymlink filesetOutputSymlink =
+        FilesetOutputSymlink.createForTesting(
+            PathFragment.EMPTY_FRAGMENT, PathFragment.EMPTY_FRAGMENT, PathFragment.EMPTY_FRAGMENT);
+    ActionExecutionValue actionExecutionValue =
+        ActionExecutionValue.create(
+            ImmutableMap.of(artifact1, metadata1, artifact2, ArtifactFileMetadata.PLACEHOLDER),
+            ImmutableMap.of(treeArtifact, treeArtifactValue),
+            ImmutableMap.of(artifact3, FileArtifactValue.DEFAULT_MIDDLEMAN),
+            ImmutableList.of(filesetOutputSymlink),
+            null,
+            true);
+    ActionExecutionValue valueWithFingerprint =
+        ActionExecutionValue.create(
+            ImmutableMap.of(artifact1, metadata1, artifact2, ArtifactFileMetadata.PLACEHOLDER),
+            ImmutableMap.of(treeArtifact, treeArtifactValue),
+            ImmutableMap.of(artifact3, FileArtifactValue.DEFAULT_MIDDLEMAN),
+            ImmutableList.of(filesetOutputSymlink),
+            null,
+            true);
+    valueWithFingerprint.getValueFingerprint();
+    new SerializationTester(actionExecutionValue, valueWithFingerprint)
+        .addDependency(FileSystem.class, root.getFileSystem())
+        .runTests();
+  }
+
   private void file(Path path, String contents) throws Exception {
     FileSystemUtils.createDirectoryAndParents(path.getParentDirectory());
     writeFile(path, contents);