Implement available() method for Windows subprocesses.

RELNOTES: None
PiperOrigin-RevId: 351574909
diff --git a/src/test/java/com/google/devtools/build/lib/windows/WindowsSubprocessTest.java b/src/test/java/com/google/devtools/build/lib/windows/WindowsSubprocessTest.java
index d44a948..a305285 100644
--- a/src/test/java/com/google/devtools/build/lib/windows/WindowsSubprocessTest.java
+++ b/src/test/java/com/google/devtools/build/lib/windows/WindowsSubprocessTest.java
@@ -16,6 +16,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertThrows;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -26,6 +27,7 @@
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.runfiles.Runfiles;
 import java.io.File;
+import java.io.InputStream;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -125,6 +127,24 @@
     assertThat(new String(buf, UTF_8).trim()).isEqualTo("X:");
   }
 
+  @Test
+  public void testStreamAvailable_zeroAfterClose() throws Exception {
+    SubprocessBuilder subprocessBuilder = new SubprocessBuilder(WindowsSubprocessFactory.INSTANCE);
+    subprocessBuilder.setWorkingDirectory(new File("."));
+    subprocessBuilder.setArgv(ImmutableList.of(mockBinary, "-jar", mockSubprocess, "OHELLO"));
+    process = subprocessBuilder.start();
+    InputStream inputStream = process.getInputStream();
+    // We don't know if the process has already written to the pipe
+    assertThat(inputStream.available()).isAnyOf(0, 5);
+    process.waitFor();
+    // Windows allows streams to be read after the process has died.
+    assertThat(inputStream.available()).isAnyOf(0, 5);
+    inputStream.close();
+    assertThrows(IllegalStateException.class, inputStream::available)
+        .getMessage()
+        .contains("Stream already closed");
+  }
+
   /**
    * An argument and its command-line-escaped counterpart.
    *