Consolidate ObjectCodec<String> creation

Opens the door to swapping in different implementations without needing to
touch a ton of code.

RELNOTES: None
PiperOrigin-RevId: 171412555
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
index 7995681..6007146 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
@@ -18,8 +18,9 @@
 import com.google.common.hash.HashCode;
 import com.google.devtools.build.lib.actions.Root;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.skyframe.serialization.FastStringCodec;
 import com.google.devtools.build.lib.skyframe.serialization.PathCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
 import com.google.devtools.build.lib.util.StringCanonicalizer;
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.Path;
@@ -243,17 +244,18 @@
         && this.execRoot.equals(that.execRoot);
   }
 
-  void serialize(CodedOutputStream codedOut, PathCodec pathCodec) throws IOException {
+  void serialize(CodedOutputStream codedOut, PathCodec pathCodec)
+      throws IOException, SerializationException {
     serverDirectories.serialize(codedOut, pathCodec);
     pathCodec.serialize(workspace, codedOut);
-    FastStringCodec.INSTANCE.serialize(productName, codedOut);
+    StringCodecs.asciiOptimized().serialize(productName, codedOut);
   }
 
   static BlazeDirectories deserialize(CodedInputStream codedIn, PathCodec pathCodec)
-      throws IOException {
+      throws IOException, SerializationException {
     return new BlazeDirectories(
         ServerDirectories.deserialize(codedIn, pathCodec),
         pathCodec.deserialize(codedIn),
-        FastStringCodec.INSTANCE.deserialize(codedIn));
+        StringCodecs.asciiOptimized().deserialize(codedIn));
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
index 61c3ff6..3b62084 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
@@ -16,6 +16,7 @@
 
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.devtools.build.lib.skyframe.serialization.PathCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
@@ -37,12 +38,14 @@
   }
 
   @Override
-  public void serialize(BlazeDirectories obj, CodedOutputStream codedOut) throws IOException {
+  public void serialize(BlazeDirectories obj, CodedOutputStream codedOut)
+      throws IOException, SerializationException {
     obj.serialize(codedOut, pathCodec);
   }
 
   @Override
-  public BlazeDirectories deserialize(CodedInputStream codedIn) throws IOException {
+  public BlazeDirectories deserialize(CodedInputStream codedIn)
+      throws IOException, SerializationException {
     return BlazeDirectories.deserialize(codedIn, pathCodec);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
index 8c75f58..48a05c9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
@@ -19,6 +19,7 @@
 import com.google.common.hash.Hashing;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.PathCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.Path;
@@ -125,7 +126,8 @@
         && this.outputBase.equals(that.outputBase);
   }
 
-  void serialize(CodedOutputStream out, PathCodec pathCodec) throws IOException {
+  void serialize(CodedOutputStream out, PathCodec pathCodec)
+      throws IOException, SerializationException {
     pathCodec.serialize(installBase, out);
     out.writeBoolNoTag(installMD5 != null);
     if (installMD5 != null) {
@@ -135,7 +137,7 @@
   }
 
   static ServerDirectories deserialize(CodedInputStream in, PathCodec pathCodec)
-      throws IOException {
+      throws IOException, SerializationException {
     Path installBase = pathCodec.deserialize(in);
     HashCode installMd5 = null;
     if (in.readBool()) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
index f9bc78b..71c8508 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
@@ -29,9 +29,9 @@
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher;
 import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType;
 import com.google.devtools.build.lib.skyframe.serialization.EnumCodec;
-import com.google.devtools.build.lib.skyframe.serialization.FastStringCodec;
 import com.google.devtools.build.lib.skyframe.serialization.LabelCodec;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
@@ -517,7 +517,7 @@
   void serialize(CodedOutputStream out) throws IOException, SerializationException {
     out.writeBoolNoTag(mandatoryMinimumVersion);
     out.writeBoolNoTag(objcProviderFromLinked);
-    serializeNullable(xcodeVersion, out, FastStringCodec.INSTANCE);
+    serializeNullable(xcodeVersion, out, StringCodecs.asciiOptimized());
     serializeNullable(iosSdkVersion, out, DottedVersion.CODEC);
     serializeNullable(watchOsSdkVersion, out, DottedVersion.CODEC);
     serializeNullable(tvOsSdkVersion, out, DottedVersion.CODEC);
@@ -526,10 +526,10 @@
     serializeNullable(watchosMinimumOs, out, DottedVersion.CODEC);
     serializeNullable(tvosMinimumOs, out, DottedVersion.CODEC);
     serializeNullable(macosMinimumOs, out, DottedVersion.CODEC);
-    FastStringCodec.INSTANCE.serialize(iosCpu, out);
+    StringCodecs.asciiOptimized().serialize(iosCpu, out);
     LabelCodec.INSTANCE.serialize(appleCrosstoolTop, out);
     PlatformType.CODEC.serialize(applePlatformType, out);
-    FastStringCodec.INSTANCE.serialize(appleSplitCpu, out);
+    StringCodecs.asciiOptimized().serialize(appleSplitCpu, out);
     ConfigurationDistinguisher.CODEC.serialize(configurationDistinguisher, out);
     STRING_LIST_CODEC.serialize((ImmutableList<String>) iosMultiCpus, out);
     STRING_LIST_CODEC.serialize((ImmutableList<String>) watchosCpus, out);
@@ -537,7 +537,7 @@
     STRING_LIST_CODEC.serialize((ImmutableList<String>) macosCpus, out);
     LabelCodec.INSTANCE.serialize(defaultProvisioningProfile, out);
     LabelCodec.INSTANCE.serialize(xcodeVersionConfig, out);
-    serializeNullable(xcodeToolchain, out, FastStringCodec.INSTANCE);
+    serializeNullable(xcodeToolchain, out, StringCodecs.asciiOptimized());
     AppleBitcodeMode.CODEC.serialize(appleBitcodeMode, out);
     out.writeBoolNoTag(enableAppleCrosstoolTransition);
     out.writeBoolNoTag(targetUsesAppleCrosstool);
@@ -548,7 +548,7 @@
     AppleCommandLineOptions result = new AppleCommandLineOptions();
     result.mandatoryMinimumVersion = in.readBool();
     result.objcProviderFromLinked = in.readBool();
-    result.xcodeVersion = deserializeNullable(in, FastStringCodec.INSTANCE);
+    result.xcodeVersion = deserializeNullable(in, StringCodecs.asciiOptimized());
     result.iosSdkVersion = deserializeNullable(in, DottedVersion.CODEC);
     result.watchOsSdkVersion = deserializeNullable(in, DottedVersion.CODEC);
     result.tvOsSdkVersion = deserializeNullable(in, DottedVersion.CODEC);
@@ -557,10 +557,10 @@
     result.watchosMinimumOs = deserializeNullable(in, DottedVersion.CODEC);
     result.tvosMinimumOs = deserializeNullable(in, DottedVersion.CODEC);
     result.macosMinimumOs = deserializeNullable(in, DottedVersion.CODEC);
-    result.iosCpu = FastStringCodec.INSTANCE.deserialize(in);
+    result.iosCpu = StringCodecs.asciiOptimized().deserialize(in);
     result.appleCrosstoolTop = LabelCodec.INSTANCE.deserialize(in);
     result.applePlatformType = PlatformType.CODEC.deserialize(in);
-    result.appleSplitCpu = FastStringCodec.INSTANCE.deserialize(in);
+    result.appleSplitCpu = StringCodecs.asciiOptimized().deserialize(in);
     result.configurationDistinguisher = ConfigurationDistinguisher.CODEC.deserialize(in);
     result.iosMultiCpus = STRING_LIST_CODEC.deserialize(in);
     result.watchosCpus = STRING_LIST_CODEC.deserialize(in);
@@ -568,7 +568,7 @@
     result.macosCpus = STRING_LIST_CODEC.deserialize(in);
     result.defaultProvisioningProfile = LabelCodec.INSTANCE.deserialize(in);
     result.xcodeVersionConfig = LabelCodec.INSTANCE.deserialize(in);
-    result.xcodeToolchain = deserializeNullable(in, FastStringCodec.INSTANCE);
+    result.xcodeToolchain = deserializeNullable(in, StringCodecs.asciiOptimized());
     result.appleBitcodeMode = AppleBitcodeMode.CODEC.deserialize(in);
     result.enableAppleCrosstoolTransition = in.readBool();
     result.targetUsesAppleCrosstool = in.readBool();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java
index 72b9e9a..442408b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java
@@ -35,8 +35,8 @@
 import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions.AppleBitcodeMode;
 import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType;
 import com.google.devtools.build.lib.skyframe.serialization.EnumCodec;
-import com.google.devtools.build.lib.skyframe.serialization.FastStringCodec;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
@@ -740,7 +740,7 @@
   static AppleConfiguration deserialize(CodedInputStream in)
       throws IOException, SerializationException {
     AppleCommandLineOptions options = AppleCommandLineOptions.deserialize(in);
-    String iosCpu = FastStringCodec.INSTANCE.deserialize(in);
+    String iosCpu = StringCodecs.asciiOptimized().deserialize(in);
     DottedVersion xcodeVersion = deserializeNullable(in, DottedVersion.CODEC);
     return new AppleConfiguration(
         options,
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 45e652f..331278f 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
@@ -9,7 +9,7 @@
 
 java_library(
     name = "serialization",
-    srcs = glob(["*.java"]),
+    srcs = glob(["**/*.java"]),
     deps = [
         "//src/main/java/com/google/devtools/build/lib:preconditions",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java
index 6f8881d..89978ba 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java
@@ -16,6 +16,7 @@
 
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
@@ -26,7 +27,7 @@
 
   // TODO(michajlo): Share single instance of package id codec among all the codecs.
   private final PackageIdentifierCodec packageIdCodec = new PackageIdentifierCodec();
-  private final ObjectCodec<String> stringCodec = new FastStringCodec();
+  private final ObjectCodec<String> stringCodec = StringCodecs.asciiOptimized();
 
   @Override
   public Class<Label> getEncodedClass() {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java
index 4aca0b0..38fb13d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java
@@ -40,7 +40,8 @@
   }
 
   @Override
-  public void serialize(Path path, CodedOutputStream codedOut) throws IOException {
+  public void serialize(Path path, CodedOutputStream codedOut)
+      throws IOException, SerializationException {
     Preconditions.checkState(
         path.getFileSystem() == fileSystem,
         "Path's FileSystem (%s) did not match the configured FileSystem (%s)",
@@ -50,7 +51,8 @@
   }
 
   @Override
-  public Path deserialize(CodedInputStream codedIn) throws IOException {
+  public Path deserialize(CodedInputStream codedIn)
+      throws IOException, SerializationException {
     PathFragment pathFragment = pathFragmentCodec.deserialize(codedIn);
     return fileSystem.getPath(pathFragment);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java
index 8cd06f2..a2f9e25 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.skyframe.serialization;
 
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
@@ -22,7 +23,7 @@
 /** Custom serialization for {@link PathFragment}s. */
 class PathFragmentCodec implements ObjectCodec<PathFragment> {
 
-  private final FastStringCodec stringCodec = new FastStringCodec();
+  private final ObjectCodec<String> stringCodec = StringCodecs.asciiOptimized();
 
   @Override
   public Class<PathFragment> getEncodedClass() {
@@ -30,7 +31,8 @@
   }
 
   @Override
-  public void serialize(PathFragment pathFragment, CodedOutputStream codedOut) throws IOException {
+  public void serialize(PathFragment pathFragment, CodedOutputStream codedOut)
+      throws IOException, SerializationException {
     codedOut.writeInt32NoTag(pathFragment.getDriveLetter());
     codedOut.writeBoolNoTag(pathFragment.isAbsolute());
     codedOut.writeInt32NoTag(pathFragment.segmentCount());
@@ -40,7 +42,8 @@
   }
 
   @Override
-  public PathFragment deserialize(CodedInputStream codedIn) throws IOException {
+  public PathFragment deserialize(CodedInputStream codedIn)
+      throws IOException, SerializationException {
     char driveLetter = (char) codedIn.readInt32();
     boolean isAbsolute = codedIn.readBool();
     int segmentCount = codedIn.readInt32();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java
index 5efea4b..85abc95 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java
@@ -16,6 +16,7 @@
 
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
@@ -24,7 +25,7 @@
 /** Common utilities for serialization. */
 public class SerializationCommonUtils {
   public static final ImmutableListCodec<String> STRING_LIST_CODEC =
-      new ImmutableListCodec<>(FastStringCodec.INSTANCE);
+      new ImmutableListCodec<>(StringCodecs.asciiOptimized());
   private static final ByteString DEFAULT_REPOSITORY =
       ByteString.copyFromUtf8(RepositoryName.DEFAULT.getName());
   private static final ByteString MAIN_REPOSITORY =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/FastStringCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodec.java
similarity index 96%
rename from src/main/java/com/google/devtools/build/lib/skyframe/serialization/FastStringCodec.java
rename to src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodec.java
index 23bf38b..e763f70 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/FastStringCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodec.java
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.devtools.build.lib.skyframe.serialization;
+package com.google.devtools.build.lib.skyframe.serialization.strings;
 
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
@@ -29,8 +30,7 @@
  * still handle UTF-8, though less efficiently than {@link StringCodec}. Should be used when the
  * majority of the data passing through will be ascii.
  */
-public class FastStringCodec implements ObjectCodec<String> {
-  public static final FastStringCodec INSTANCE = new FastStringCodec();
+class FastStringCodec implements ObjectCodec<String> {
 
   private static final Unsafe theUnsafe;
   private static final long STRING_VALUE_OFFSET;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/StringCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodec.java
similarity index 85%
rename from src/main/java/com/google/devtools/build/lib/skyframe/serialization/StringCodec.java
rename to src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodec.java
index 4b1bc70..8aaba60 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/StringCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodec.java
@@ -12,14 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.devtools.build.lib.skyframe.serialization;
+package com.google.devtools.build.lib.skyframe.serialization.strings;
 
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
 
 /** Dead-simple serialization for {@link String}s. */
-public class StringCodec implements ObjectCodec<String> {
+class StringCodec implements ObjectCodec<String> {
 
   @Override
   public Class<String> getEncodedClass() {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodecs.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodecs.java
new file mode 100644
index 0000000..24f36ec
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodecs.java
@@ -0,0 +1,43 @@
+// Copyright 2017 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.skyframe.serialization.strings;
+
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+
+/** Utility for accessing (potentially platform-specific) {@link String} {@link ObjectCodec}s. */
+public final class StringCodecs {
+
+  private static final FastStringCodec fastStringCodec = new FastStringCodec();
+  private static final StringCodec stringCodec = new StringCodec();
+
+  private StringCodecs() {}
+
+  /**
+   * Returns singleton instance optimized for almost-always ASCII data. This instance can still
+   * serialize/deserialize UTF-8 data, but with potentially worse performance than
+   * {@link #simple()}.
+   */
+  public static ObjectCodec<String> asciiOptimized() {
+    return fastStringCodec;
+  }
+
+  /**
+   * Returns singleton instance of basic implementation. Should be preferred over
+   * {@link #asciiOptimized()} when a sufficient amount of UTF-8 data is expected.
+   */
+  public static ObjectCodec<String> simple() {
+    return stringCodec;
+  }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ImmutableListCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ImmutableListCodecTest.java
index 50481dc..6591bee 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ImmutableListCodecTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ImmutableListCodecTest.java
@@ -15,6 +15,7 @@
 package com.google.devtools.build.lib.skyframe.serialization;
 
 import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.AbstractObjectCodecTest;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -26,7 +27,7 @@
   @SuppressWarnings("unchecked")
   public ImmutableListCodecTest() {
     super(
-        new ImmutableListCodec<>(new StringCodec()),
+        new ImmutableListCodec<>(StringCodecs.simple()),
         ImmutableList.of(),
         ImmutableList.of("foo"),
         ImmutableList.of("bar", "baz"));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java
index 051667d..f1f08cd 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.skyframe.PrecomputedValueCodec;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.AbstractObjectCodecTest;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import org.junit.runner.RunWith;
@@ -32,7 +33,7 @@
                 ObjectCodecs.newBuilder()
                     .asClassKeyedBuilder()
                     // Note no PathFragmentCodec.
-                    .add(String.class, new FastStringCodec())
+                    .add(String.class, StringCodecs.asciiOptimized())
                     .add(Label.class, LabelCodec.INSTANCE)
                     .build()),
         new PrecomputedValue(PathFragment.create("java serializable 1")),
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/FastStringCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodecTest.java
similarity index 96%
rename from src/test/java/com/google/devtools/build/lib/skyframe/serialization/FastStringCodecTest.java
rename to src/test/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodecTest.java
index bad3e6d..b472f54 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/FastStringCodecTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodecTest.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.devtools.build.lib.skyframe.serialization;
+package com.google.devtools.build.lib.skyframe.serialization.strings;
 
 import com.google.common.testing.EqualsTester;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.AbstractObjectCodecTest;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/StringCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodecTest.java
similarity index 93%
rename from src/test/java/com/google/devtools/build/lib/skyframe/serialization/StringCodecTest.java
rename to src/test/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodecTest.java
index b33c54c..c1b6f5d 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/StringCodecTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodecTest.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.devtools.build.lib.skyframe.serialization;
+package com.google.devtools.build.lib.skyframe.serialization.strings;
 
 import com.google.devtools.build.lib.skyframe.serialization.testutils.AbstractObjectCodecTest;
 import org.junit.runner.RunWith;