Fixed two Bazel java tests on Windows by using the right native file system

Newly passing:
//src/test/java/com/google/devtools/build/...
  lib/skyframe:SkyframeTests
  lib:actions_test

Also refactored FileSystems.java

--
Change-Id: I03ab9db5c1ab5e5be4ff1efbc5cf2d280084254a
Reviewed-on: https://bazel-review.googlesource.com/#/c/3843
MOS_MIGRATED_REVID=125449456
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/FileSystemConcurrencyTest.java b/src/test/java/com/google/devtools/build/lib/vfs/FileSystemConcurrencyTest.java
index 0ae1a25..2d6308f 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/FileSystemConcurrencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/FileSystemConcurrencyTest.java
@@ -36,7 +36,7 @@
 
   @Before
   public final void initializeFileSystem() throws Exception  {
-    FileSystem testFS = FileSystems.initDefaultAsNative();
+    FileSystem testFS = FileSystems.getNativeFileSystem();
 
     // Resolve symbolic links in the temp dir:
     workingDir = testFS.getPath(new File(TestUtils.tmpDir()).getCanonicalPath());
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/FileSystemsTest.java b/src/test/java/com/google/devtools/build/lib/vfs/FileSystemsTest.java
index 5e10a3e..1e250a0 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/FileSystemsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/FileSystemsTest.java
@@ -30,19 +30,19 @@
 
   @Test
   public void testFileSystemsCreatesOnlyOneDefaultNative() {
-    assertSame(FileSystems.initDefaultAsNative(),
-               FileSystems.initDefaultAsNative());
+    assertSame(FileSystems.getNativeFileSystem(),
+               FileSystems.getNativeFileSystem());
   }
 
   @Test
   public void testFileSystemsCreatesOnlyOneDefaultJavaIo() {
-    assertSame(FileSystems.initDefaultAsJavaIo(),
-               FileSystems.initDefaultAsJavaIo());
+    assertSame(FileSystems.getJavaIoFileSystem(),
+               FileSystems.getJavaIoFileSystem());
   }
 
   @Test
   public void testFileSystemsCanSwitchDefaults() {
-    assertNotSame(FileSystems.initDefaultAsNative(),
-                  FileSystems.initDefaultAsJavaIo());
+    assertNotSame(FileSystems.getNativeFileSystem(),
+                  FileSystems.getJavaIoFileSystem());
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/UnixPathGetParentTest.java b/src/test/java/com/google/devtools/build/lib/vfs/UnixPathGetParentTest.java
index db0cad3..d4719f6 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/UnixPathGetParentTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/UnixPathGetParentTest.java
@@ -38,7 +38,7 @@
 
   @Before
   public final void createTestRoot() throws Exception  {
-    unixFs = FileSystems.initDefaultAsNative();
+    unixFs = FileSystems.getNativeFileSystem();
     testRoot = unixFs.getPath(TestUtils.tmpDir()).getRelative("UnixPathGetParentTest");
     FileSystemUtils.createDirectoryAndParents(testRoot);
   }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/UnixPathTest.java b/src/test/java/com/google/devtools/build/lib/vfs/UnixPathTest.java
index cd174c6..2be5055 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/UnixPathTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/UnixPathTest.java
@@ -53,7 +53,7 @@
   private File tmpDir;
 
   protected FileSystem getUnixFileSystem() {
-    return FileSystems.initDefaultAsNative();
+    return FileSystems.getNativeFileSystem();
   }
 
   @Before
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/ZipFileSystemTest.java b/src/test/java/com/google/devtools/build/lib/vfs/ZipFileSystemTest.java
index 8ff07bc..bbe4129 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/ZipFileSystemTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/ZipFileSystemTest.java
@@ -60,7 +60,7 @@
 
   @Before
   public final void initializeFileSystems() throws Exception  {
-    FileSystem unixFs = FileSystems.initDefaultAsNative();
+    FileSystem unixFs = FileSystems.getNativeFileSystem();
     Path testdataDir = unixFs.getPath(BlazeTestUtils.runfilesDir()).getRelative(
         TestConstants.JAVATESTS_ROOT + "/com/google/devtools/build/lib/vfs");
     Path zPath1 = testdataDir.getChild("sample_with_dirs.zip");
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/util/FileSystems.java b/src/test/java/com/google/devtools/build/lib/vfs/util/FileSystems.java
index 38ad5f4..9329a8b 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/util/FileSystems.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/util/FileSystems.java
@@ -13,13 +13,16 @@
 // limitations under the License.
 package com.google.devtools.build.lib.vfs.util;
 
+import com.google.common.base.Verify;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.JavaIoFileSystem;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.UnionFileSystem;
 import com.google.devtools.build.lib.vfs.UnixFileSystem;
+import com.google.devtools.build.lib.vfs.WindowsFileSystem;
 import com.google.devtools.build.lib.vfs.ZipFileSystem;
 
 import java.io.IOException;
@@ -34,60 +37,69 @@
 
   private FileSystems() {}
 
-  private static FileSystem defaultFileSystem;
+  private static FileSystem defaultNativeFileSystem;
+  private static FileSystem defaultJavaIoFileSystem;
+  private static FileSystem defaultUnionFileSystem;
 
   /**
-   * Initializes the default {@link FileSystem} instance as a platform native
-   * (Unix) file system, creating one iff needed, and returns the instance.
-   *
-   * <p>This method is idempotent as long as the initialization is of the same
-   * type (Native/JavaIo/Union).
+   * Initializes the default native {@link FileSystem} instance as a platform native
+   * (Unix or Windows) file system. If it's not initialized, then initialize it,
+   * otherwise verify if the type of the instance is correct.
    */
-  public static synchronized FileSystem initDefaultAsNative() {
-    if (!(defaultFileSystem instanceof UnixFileSystem)) {
-      defaultFileSystem = new UnixFileSystem();
+  public static synchronized FileSystem getNativeFileSystem() {
+    if (OS.getCurrent() == OS.WINDOWS) {
+      if (defaultNativeFileSystem == null) {
+        defaultNativeFileSystem = new WindowsFileSystem();
+      } else {
+        Verify.verify(defaultNativeFileSystem instanceof WindowsFileSystem);
+      }
+    } else {
+      if (defaultNativeFileSystem == null) {
+        defaultNativeFileSystem = new UnixFileSystem();
+      } else {
+        Verify.verify(defaultNativeFileSystem instanceof UnixFileSystem);
+      }
     }
-    return defaultFileSystem;
+    return defaultNativeFileSystem;
   }
 
   /**
-   * Initializes the default {@link FileSystem} instance as a java.io.File
-   * file system, creating one iff needed, and returns the instance.
-   *
-   * <p>This method is idempotent as long as the initialization is of the same
-   * type (Native/JavaIo/Union).
+   * Initializes the default java {@link FileSystem} instance as a java.io.File
+   * file system. If it's not initialized, then initialize it,
+   * otherwise verify if the type of the instance is correct.
    */
-  public static synchronized FileSystem initDefaultAsJavaIo() {
-    if (!(defaultFileSystem instanceof JavaIoFileSystem)) {
-      defaultFileSystem = new JavaIoFileSystem();
+  public static synchronized FileSystem getJavaIoFileSystem() {
+    if (defaultJavaIoFileSystem == null) {
+      defaultJavaIoFileSystem = new JavaIoFileSystem();
+    } else {
+      Verify.verify(defaultJavaIoFileSystem instanceof JavaIoFileSystem);
     }
-    return defaultFileSystem;
+    return defaultJavaIoFileSystem;
   }
 
   /**
-   * Initializes the default {@link FileSystem} instance as a
-   * {@link UnionFileSystem}, creating one iff needed,
-   * and returns the instance.
-   *
-   * <p>This method is idempotent as long as the initialization is of the same
-   * type (Native/JavaIo/Union).
+   * Initializes the default union {@link FileSystem} instance as a
+   * {@link UnionFileSystem}. If it's not initialized, then initialize it,
+   * otherwise verify if the type of the instance is correct.
    *
    * @param prefixMapping the desired mapping of path prefixes to delegate file systems
    * @param rootFileSystem the default file system for paths that don't match any prefix map
    */
-  public static synchronized FileSystem initDefaultAsUnion(
+  public static synchronized FileSystem getUnionFileSystem(
       Map<PathFragment, FileSystem> prefixMapping, FileSystem rootFileSystem) {
-    if (!(defaultFileSystem instanceof UnionFileSystem)) {
-      defaultFileSystem = new UnionFileSystem(prefixMapping, rootFileSystem);
+    if (defaultUnionFileSystem == null) {
+      defaultUnionFileSystem = new UnionFileSystem(prefixMapping, rootFileSystem);
+    } else {
+      Verify.verify(defaultUnionFileSystem instanceof UnionFileSystem);
     }
-    return defaultFileSystem;
+    return defaultUnionFileSystem;
   }
 
   /**
    * Returns a new instance of a simple {@link FileSystem} implementation that
    * presents the contents of a zip file as a read-only file system view.
    */
-  public static FileSystem newZipFileSystem(Path zipFile) throws IOException {
+  public static FileSystem getZipFileSystem(Path zipFile) throws IOException {
     return new ZipFileSystem(zipFile);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/util/FsApparatus.java b/src/test/java/com/google/devtools/build/lib/vfs/util/FsApparatus.java
index 101061f..fc88272 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/util/FsApparatus.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/util/FsApparatus.java
@@ -56,7 +56,7 @@
    * does not hold with our usage of Unix filesystems.
    */
   public static FsApparatus newNative() {
-    FileSystem fs = FileSystems.initDefaultAsNative();
+    FileSystem fs = FileSystems.getNativeFileSystem();
     Path wd = fs.getPath(TMP_DIR);
 
     try {