Start serializing ArtifactOwner: put in a simple codec for the null artifact owner and fix up BuildConfigurationValue.Key. ConfiguredTargetKey is going to need some modifications to AutoCodec: probably the long-awaited static "create" method.

PiperOrigin-RevId: 182630181
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionRegistry.java b/src/main/java/com/google/devtools/build/lib/actions/ActionRegistry.java
index de85ce9..df064e8 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionRegistry.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionRegistry.java
@@ -14,8 +14,6 @@
 
 package com.google.devtools.build.lib.actions;
 
-import com.google.common.annotations.VisibleForTesting;
-
 /**
  * An interface for registering actions.
  */
@@ -30,18 +28,4 @@
    * these actions.
    */
   ArtifactOwner getOwner();
-
-  /**
-   * An action registry that does exactly nothing.
-   */
-  @VisibleForTesting
-  public static final ActionRegistry NOP = new ActionRegistry() {
-    @Override
-    public void registerAction(ActionAnalysisMetadata... actions) {}
-
-    @Override
-    public ArtifactOwner getOwner() {
-      return ArtifactOwner.NULL_OWNER;
-    }
-  };
 }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
index eb9165a..e371ec1 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
@@ -238,7 +238,7 @@
    */
   @VisibleForTesting
   public Artifact(Path path, ArtifactRoot root, PathFragment execPath) {
-    this(path, root, execPath, ArtifactOwner.NULL_OWNER);
+    this(path, root, execPath, ArtifactOwner.NullArtifactOwner.INSTANCE);
   }
 
   /**
@@ -251,7 +251,7 @@
         path,
         root,
         root.getExecPath().getRelative(root.getRoot().relativize(path)),
-        ArtifactOwner.NULL_OWNER);
+        ArtifactOwner.NullArtifactOwner.INSTANCE);
   }
 
   /** Constructs a source or derived Artifact for the specified root-relative path and root. */
@@ -261,7 +261,7 @@
         root.getRoot().getRelative(rootRelativePath),
         root,
         root.getExecPath().getRelative(rootRelativePath),
-        ArtifactOwner.NULL_OWNER);
+        ArtifactOwner.NullArtifactOwner.INSTANCE);
   }
 
   public final Path getPath() {
@@ -337,10 +337,11 @@
 
   /**
    * Gets the {@code ActionLookupKey} of the {@code ConfiguredTarget} that owns this artifact, if it
-   * was set. Otherwise, this should be a dummy value -- either {@link ArtifactOwner#NULL_OWNER} or
-   * a dummy owner set in tests. Such a dummy value should only occur for source artifacts if
-   * created without specifying the owner, or for special derived artifacts, such as target
-   * completion middleman artifacts, build info artifacts, and the like.
+   * was set. Otherwise, this should be a dummy value -- either {@link
+   * ArtifactOwner.NullArtifactOwner#INSTANCE} or a dummy owner set in tests. Such a dummy value
+   * should only occur for source artifacts if created without specifying the owner, or for special
+   * derived artifacts, such as target completion middleman artifacts, build info artifacts, and the
+   * like.
    */
   public final ArtifactOwner getArtifactOwner() {
     return owner;
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
index 7382944..7a0f88b 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
@@ -155,7 +155,7 @@
 
   @Override
   public Artifact getSourceArtifact(PathFragment execPath, ArtifactRoot root) {
-    return getSourceArtifact(execPath, root, ArtifactOwner.NULL_OWNER);
+    return getSourceArtifact(execPath, root, ArtifactOwner.NullArtifactOwner.INSTANCE);
   }
 
   private void validatePath(PathFragment rootRelativePath, ArtifactRoot root) {
@@ -424,7 +424,7 @@
       sourceArtifactCache.markEntryAsValid(execPath);
     } else {
       // Must be a new artifact or artifact in the cache is stale, so create a new one.
-      artifact = getSourceArtifact(execPath, sourceRoot, ArtifactOwner.NULL_OWNER); 
+      artifact = getSourceArtifact(execPath, sourceRoot, ArtifactOwner.NullArtifactOwner.INSTANCE);
     }
     return artifact;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactOwner.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactOwner.java
index 597893f..02904d4 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactOwner.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactOwner.java
@@ -15,26 +15,40 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SingletonCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 
 /**
  * An interface for {@code ActionLookupKey}, or at least for a {@link Label}. Only tests and
  * internal {@link Artifact}-generators should implement this interface -- otherwise, {@code
  * ActionLookupKey} and its subclasses should be the only implementation.
  */
+@AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC)
 public interface ArtifactOwner {
+  ObjectCodec<ArtifactOwner> CODEC = new ArtifactOwner_AutoCodec();
+
   Label getLabel();
 
-  @VisibleForTesting
-  ArtifactOwner NULL_OWNER =
-      new ArtifactOwner() {
-        @Override
-        public Label getLabel() {
-          return null;
-        }
+  /**
+   * An {@link ArtifactOwner} that just returns null for its label. Only for use with resolved
+   * source artifacts and tests.
+   */
+  class NullArtifactOwner implements ArtifactOwner {
+    @VisibleForTesting public static final NullArtifactOwner INSTANCE = new NullArtifactOwner();
 
-        @Override
-        public String toString() {
-          return "NULL_OWNER";
-        }
-      };
+    static final ObjectCodec<NullArtifactOwner> CODEC = SingletonCodec.of(INSTANCE, "NULL_OWNER");
+
+    private NullArtifactOwner() {}
+
+    @Override
+    public Label getLabel() {
+      return null;
+    }
+
+    @Override
+    public String toString() {
+      return "NULL_OWNER";
+    }
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/BUILD b/src/main/java/com/google/devtools/build/lib/actions/BUILD
index 608ea70..2c3f3ab 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/actions/BUILD
@@ -33,6 +33,8 @@
         "//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/shell",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/skyframe",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
index 46e616c..c42539a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
@@ -22,11 +22,17 @@
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
 import com.google.devtools.build.lib.vfs.FileSystemProvider;
 import com.google.devtools.build.skyframe.SkyFunctionName;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
+import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.CodedOutputStream;
+import java.io.IOException;
 import java.io.Serializable;
 import java.util.Objects;
 import java.util.Set;
@@ -59,8 +65,8 @@
    * @param buildOptions the build options the fragments should be built from
    */
   @ThreadSafe
-  public static SkyKey key(Set<Class<? extends BuildConfiguration.Fragment>> fragments,
-      BuildOptions buildOptions) {
+  public static Key key(
+      Set<Class<? extends BuildConfiguration.Fragment>> fragments, BuildOptions buildOptions) {
     return keyInterner.intern(
         new Key(
             ImmutableSortedSet.copyOf(BuildConfiguration.lexicalFragmentSorter, fragments),
@@ -68,12 +74,15 @@
   }
 
   static final class Key implements SkyKey, Serializable {
+    static final ObjectCodec<Key> CODEC = new Codec();
+
     private final ImmutableSortedSet<Class<? extends BuildConfiguration.Fragment>> fragments;
     private final BuildOptions buildOptions;
     // If hashCode really is -1, we'll recompute it from scratch each time. Oh well.
     private volatile int hashCode = -1;
 
-    Key(ImmutableSortedSet<Class<? extends Fragment>> fragments, BuildOptions buildOptions) {
+    private Key(
+        ImmutableSortedSet<Class<? extends Fragment>> fragments, BuildOptions buildOptions) {
       this.fragments = fragments;
       this.buildOptions = Preconditions.checkNotNull(buildOptions);
     }
@@ -111,5 +120,42 @@
       }
       return hashCode;
     }
+
+    private static class Codec implements ObjectCodec<Key> {
+      @Override
+      public Class<Key> getEncodedClass() {
+        return Key.class;
+      }
+
+      @Override
+      public void serialize(Key obj, CodedOutputStream codedOut)
+          throws SerializationException, IOException {
+        BuildOptions.CODEC.serialize(obj.buildOptions, codedOut);
+        codedOut.writeInt32NoTag(obj.fragments.size());
+        for (Class<? extends BuildConfiguration.Fragment> fragment : obj.fragments) {
+          StringCodecs.asciiOptimized().serialize(fragment.getName(), codedOut);
+        }
+      }
+
+      @Override
+      @SuppressWarnings("unchecked") // Class<? extends...> cast
+      public Key deserialize(CodedInputStream codedIn) throws SerializationException, IOException {
+        BuildOptions buildOptions = BuildOptions.CODEC.deserialize(codedIn);
+        int fragmentsSize = codedIn.readInt32();
+        ImmutableSortedSet.Builder<Class<? extends BuildConfiguration.Fragment>> fragmentsBuilder =
+            ImmutableSortedSet.orderedBy(BuildConfiguration.lexicalFragmentSorter);
+        for (int i = 0; i < fragmentsSize; i++) {
+          try {
+            fragmentsBuilder.add(
+                (Class<? extends BuildConfiguration.Fragment>)
+                    Class.forName(StringCodecs.asciiOptimized().deserialize(codedIn)));
+          } catch (ClassNotFoundException e) {
+            throw new SerializationException(
+                "Couldn't deserialize BuildConfigurationValue$Key fragment class", e);
+          }
+        }
+        return key(fragmentsBuilder.build(), buildOptions);
+      }
+    }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
index b69193f..8e8baa5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
@@ -23,7 +23,6 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.skyframe.SkyFunctionName;
-import com.google.devtools.build.skyframe.SkyKey;
 import java.util.Objects;
 import javax.annotation.Nullable;
 
@@ -33,11 +32,11 @@
  */
 public class ConfiguredTargetKey extends ActionLookupKey {
   private final Label label;
-  @Nullable private final SkyKey configurationKey;
+  @Nullable private final BuildConfigurationValue.Key configurationKey;
 
   private transient int hashCode;
 
-  private ConfiguredTargetKey(Label label, @Nullable SkyKey configurationKey) {
+  private ConfiguredTargetKey(Label label, @Nullable BuildConfigurationValue.Key configurationKey) {
     this.label = Preconditions.checkNotNull(label);
     this.configurationKey = configurationKey;
   }
@@ -58,11 +57,11 @@
       BlazeInterners.newWeakInterner();
 
   public static ConfiguredTargetKey of(Label label, @Nullable BuildConfiguration configuration) {
-    SkyKey configurationKey =
+    BuildConfigurationValue.Key configurationKey =
         configuration == null
             ? null
             : BuildConfigurationValue.key(
-            configuration.fragmentClasses(), configuration.getOptions());
+                configuration.fragmentClasses(), configuration.getOptions());
     return of(
         label,
         configurationKey,
@@ -70,7 +69,9 @@
   }
 
   static ConfiguredTargetKey of(
-      Label label, @Nullable SkyKey configurationKey, boolean isHostConfiguration) {
+      Label label,
+      @Nullable BuildConfigurationValue.Key configurationKey,
+      boolean isHostConfiguration) {
     if (isHostConfiguration) {
       return hostInterner.intern(new HostConfiguredTargetKey(label, configurationKey));
     } else {
@@ -89,7 +90,7 @@
   }
 
   @Nullable
-  SkyKey getConfigurationKey() {
+  BuildConfigurationValue.Key getConfigurationKey() {
     return configurationKey;
   }
 
@@ -163,7 +164,8 @@
   }
 
   private static class HostConfiguredTargetKey extends ConfiguredTargetKey {
-    private HostConfiguredTargetKey(Label label, @Nullable SkyKey configurationKey) {
+    private HostConfiguredTargetKey(
+        Label label, @Nullable BuildConfigurationValue.Key configurationKey) {
       super(label, configurationKey);
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java b/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
index 911f690..cf15941 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
@@ -924,7 +924,7 @@
         rootDir.getRoot().getRelative(relpath),
         rootDir,
         rootDir.getExecPath().getRelative(relpath),
-        ArtifactOwner.NULL_OWNER,
+        ArtifactOwner.NullArtifactOwner.INSTANCE,
         SpecialArtifactType.TREE);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/ParamFileWriteActionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/ParamFileWriteActionTest.java
index eca896a..5f85b94 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/actions/ParamFileWriteActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/ParamFileWriteActionTest.java
@@ -114,7 +114,7 @@
         rootDir.getRoot().getRelative(relpath),
         rootDir,
         rootDir.getExecPath().getRelative(relpath),
-        ArtifactOwner.NULL_OWNER,
+        ArtifactOwner.NullArtifactOwner.INSTANCE,
         SpecialArtifactType.TREE);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/PopulateTreeArtifactActionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/PopulateTreeArtifactActionTest.java
index 94ac8a8..a22868b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/actions/PopulateTreeArtifactActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/PopulateTreeArtifactActionTest.java
@@ -349,7 +349,7 @@
         root.getRoot().getRelative(relpath),
         root,
         root.getExecPath().getRelative(relpath),
-        ArtifactOwner.NULL_OWNER,
+        ArtifactOwner.NullArtifactOwner.INSTANCE,
         SpecialArtifactType.TREE);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/SpawnActionTemplateTest.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/SpawnActionTemplateTest.java
index 5bfb86f..3001b3b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/actions/SpawnActionTemplateTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/SpawnActionTemplateTest.java
@@ -147,9 +147,10 @@
     Iterable<TreeFileArtifact> inputTreeFileArtifacts =
         createInputTreeFileArtifacts(inputTreeArtifact);
 
-    List<SpawnAction> expandedActions = ImmutableList.copyOf(
-        actionTemplate.generateActionForInputArtifacts(
-            inputTreeFileArtifacts, ArtifactOwner.NULL_OWNER));
+    List<SpawnAction> expandedActions =
+        ImmutableList.copyOf(
+            actionTemplate.generateActionForInputArtifacts(
+                inputTreeFileArtifacts, ArtifactOwner.NullArtifactOwner.INSTANCE));
 
     assertThat(expandedActions).hasSize(3);
 
@@ -185,9 +186,10 @@
 
     Iterable<TreeFileArtifact> inputTreeFileArtifacts =
         createInputTreeFileArtifacts(inputTreeArtifact);
-    List<SpawnAction> expandedActions = ImmutableList.copyOf(
-        actionTemplate.generateActionForInputArtifacts(
-            inputTreeFileArtifacts, ArtifactOwner.NULL_OWNER));
+    List<SpawnAction> expandedActions =
+        ImmutableList.copyOf(
+            actionTemplate.generateActionForInputArtifacts(
+                inputTreeFileArtifacts, ArtifactOwner.NullArtifactOwner.INSTANCE));
 
     for (int i = 0; i < expandedActions.size(); ++i) {
       assertThat(expandedActions.get(i).getInputs()).containsAllOf(
@@ -205,9 +207,10 @@
     Iterable<TreeFileArtifact> inputTreeFileArtifacts =
         createInputTreeFileArtifacts(inputTreeArtifact);
 
-    List<SpawnAction> expandedActions = ImmutableList.copyOf(
-        actionTemplate.generateActionForInputArtifacts(
-            inputTreeFileArtifacts, ArtifactOwner.NULL_OWNER));
+    List<SpawnAction> expandedActions =
+        ImmutableList.copyOf(
+            actionTemplate.generateActionForInputArtifacts(
+                inputTreeFileArtifacts, ArtifactOwner.NullArtifactOwner.INSTANCE));
 
     assertThat(expandedActions).hasSize(3);
 
@@ -229,9 +232,10 @@
     Iterable<TreeFileArtifact> inputTreeFileArtifacts =
         createInputTreeFileArtifacts(inputTreeArtifact);
 
-    List<SpawnAction> expandedActions = ImmutableList.copyOf(
-        actionTemplate.generateActionForInputArtifacts(
-            inputTreeFileArtifacts, ArtifactOwner.NULL_OWNER));
+    List<SpawnAction> expandedActions =
+        ImmutableList.copyOf(
+            actionTemplate.generateActionForInputArtifacts(
+                inputTreeFileArtifacts, ArtifactOwner.NullArtifactOwner.INSTANCE));
 
     assertThat(expandedActions).hasSize(3);
 
@@ -265,7 +269,7 @@
 
     try {
       actionTemplate.generateActionForInputArtifacts(
-          inputTreeFileArtifacts, ArtifactOwner.NULL_OWNER);
+          inputTreeFileArtifacts, ArtifactOwner.NullArtifactOwner.INSTANCE);
       fail("Absolute output paths not allowed, expected IllegalArgumentException");
     } catch (IllegalArgumentException e) {
       // expected
@@ -283,7 +287,7 @@
 
     try {
       actionTemplate.generateActionForInputArtifacts(
-          inputTreeFileArtifacts, ArtifactOwner.NULL_OWNER);
+          inputTreeFileArtifacts, ArtifactOwner.NullArtifactOwner.INSTANCE);
       fail("Output paths containing '..' not allowed, expected IllegalArgumentException");
     } catch (IllegalArgumentException e) {
       // expected
@@ -324,7 +328,7 @@
         root.getRoot().getRelative(relpath),
         root,
         root.getExecPath().getRelative(relpath),
-        ArtifactOwner.NULL_OWNER,
+        ArtifactOwner.NullArtifactOwner.INSTANCE,
         SpecialArtifactType.TREE);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
index eb91237..2f7ad5b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
@@ -393,7 +393,7 @@
 
     @Override
     public ArtifactOwner getOwner() {
-      return ArtifactOwner.NULL_OWNER;
+      return ArtifactOwner.NullArtifactOwner.INSTANCE;
     }
 
     @Override
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index d7d194c..4141e58 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -503,7 +503,7 @@
     return new CachingAnalysisEnvironment(
         view.getArtifactFactory(),
         actionKeyContext,
-        ArtifactOwner.NULL_OWNER,
+        ArtifactOwner.NullArtifactOwner.INSTANCE,
         /*isSystemEnv=*/ true, /*extendedSanityChecks*/
         false,
         reporter,
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
index 3819117..36c2daa 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
@@ -677,7 +677,7 @@
         path,
         ArtifactRoot.asDerivedRoot(execRoot, execRoot.getRelative("out")),
         execPath,
-        ArtifactOwner.NULL_OWNER,
+        ArtifactOwner.NullArtifactOwner.INSTANCE,
         SpecialArtifactType.TREE);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
index 58703e5..e3937d4 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
@@ -902,7 +902,7 @@
     return ImmutableList.<CommandAction>builder()
         .addAll(
             template.generateActionForInputArtifacts(
-                ImmutableList.of(treeFileArtifact), ArtifactOwner.NULL_OWNER))
+                ImmutableList.of(treeFileArtifact), ArtifactOwner.NullArtifactOwner.INSTANCE))
         .build();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunctionTest.java
index 9b2e73d..b6a834e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunctionTest.java
@@ -212,7 +212,7 @@
         fullPath,
         ArtifactRoot.asDerivedRoot(rootDirectory, rootDirectory.getRelative("out")),
         execPath,
-        ArtifactOwner.NULL_OWNER,
+        ArtifactOwner.NullArtifactOwner.INSTANCE,
         SpecialArtifactType.TREE);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
index 8b421f6..d33c259 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
@@ -623,7 +623,7 @@
         outputPath,
         derivedRoot,
         derivedRoot.getExecPath().getRelative(derivedRoot.getRoot().relativize(outputPath)),
-        ArtifactOwner.NULL_OWNER,
+        ArtifactOwner.NullArtifactOwner.INSTANCE,
         SpecialArtifactType.TREE);
   }