diff --git a/luni/src/test/java/libcore/java/util/zip/ZipInputStreamTest.java b/luni/src/test/java/libcore/java/util/zip/ZipInputStreamTest.java
index 1dc22ca..4af2561 100644
--- a/luni/src/test/java/libcore/java/util/zip/ZipInputStreamTest.java
+++ b/luni/src/test/java/libcore/java/util/zip/ZipInputStreamTest.java
@@ -16,30 +16,20 @@
 
 package libcore.java.util.zip;
 
+import junit.framework.TestCase;
+import libcore.io.Streams;
+import tests.support.resource.Support_Resources;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
 import java.util.Random;
-import java.util.Set;
 import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
 import java.util.zip.ZipInputStream;
 import java.util.zip.ZipOutputStream;
 
-import junit.framework.TestCase;
-
-import tests.support.resource.Support_Resources;
-
 public final class ZipInputStreamTest extends TestCase {
 
     public void testShortMessage() throws IOException {
@@ -115,4 +105,51 @@
 
         zi.close();
     }
+
+    public void testAvailable() throws Exception {
+        // NOTE: We don't care about the contents of any of these entries as long as they're
+        // not empty.
+        ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(
+                zip(new String[] { "foo", "bar", "baz" }, new byte[] { 0, 0, 0, 1, 1, 1 })));
+
+        assertEquals(1, zis.available());
+        zis.getNextEntry();
+        assertEquals(1, zis.available());
+        zis.closeEntry();
+        // On Android M and below, this call would return "1". That seems a bit odd given that the
+        // contract for available states that we should return 1 if there are any bytes left to read
+        // from the "current" entry.
+        assertEquals(0, zis.available());
+
+        // There shouldn't be any bytes left to read if the entry is fully consumed...
+        zis.getNextEntry();
+        Streams.readFullyNoClose(zis);
+        assertEquals(0, zis.available());
+
+        // ... or if the entry is fully skipped over.
+        zis.getNextEntry();
+        zis.skip(Long.MAX_VALUE);
+        assertEquals(0, zis.available());
+
+        // There are no entries left in the file, so there whould be nothing left to read.
+        assertNull(zis.getNextEntry());
+        assertEquals(0, zis.available());
+
+        zis.close();
+    }
+
+    private static byte[] zip(String[] names, byte[] bytes) throws IOException {
+        ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
+        ZipOutputStream zippedOut = new ZipOutputStream(bytesOut);
+
+        for (String name : names) {
+            ZipEntry entry = new ZipEntry(name);
+            zippedOut.putNextEntry(entry);
+            zippedOut.write(bytes);
+            zippedOut.closeEntry();
+        }
+
+        zippedOut.close();
+        return bytesOut.toByteArray();
+    }
 }
