< prev index next >

test/jdk/java/io/InputStream/Skip.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 1997, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -21,19 +21,21 @@
  * questions.
  */
 
 
 /* @test
-   @bug 4016710
-   @summary check for correct implementation of InputStream.skip
+   @bug 4016710 6516099
+   @summary check for correct implementation of InputStream.skip{NBytes}
    */
 
 import java.io.*;
 
 
 public class Skip{
 
+    private static final int EOF = -1;
+
     private static void dotest(InputStream in , int curpos ,
                                long total , long toskip , long expected)
         throws Exception
     {
 

@@ -59,10 +61,48 @@
             throw new RuntimeException("Unexpected "+e+" is thrown!");
         }
 
     }
 
+    private static void dotestExact(MyInputStream in , int curpos ,
+                               long total , long toskip)
+        throws Exception
+    {
+
+        try {
+
+            System.err.println("\n\nCurrently at pos = " + curpos +
+                               "\nTotal bytes in the Stream = " + total +
+                               "\nNumber of bytes to skip = " + toskip);
+
+            try {
+                long pos = in.position();
+                assert pos == curpos : pos + " != " + curpos;
+                in.skipNBytes(toskip);
+                if (in.position() != pos + (toskip < 0 ? 0 : toskip)) {
+                    throw new RuntimeException((in.position() - pos) +
+                        " bytes skipped; expected " + toskip);
+                }
+            } catch (EOFException eofe) {
+                if (!(toskip > 0 &&
+                    (curpos == EOF || (curpos + toskip > total)))) {
+                    throw new RuntimeException("Unexpected EOFException", eofe);
+                }
+
+                System.err.println("Caught expected EOFException");
+
+                return;
+            }
+
+        } catch (IOException e) {
+            System.err.println("IOException is thrown - possible result");
+        } catch (Throwable e) {
+            throw new RuntimeException("Unexpected "+e+" is thrown!");
+        }
+
+    }
+
     public static void main( String argv[] ) throws Exception {
 
         MyInputStream in = new MyInputStream(11);
 
         /* test for negative skip */

@@ -70,13 +110,14 @@
 
         /* check for skip beyond EOF starting from before EOF */
         dotest(in,  0, 11,  20, 11);
 
         /* check for skip after EOF */
-        dotest(in, -1, 11,  20,  0);
+        dotest(in, EOF, 11,  20,  0);
 
         in = new MyInputStream(9000);
+
         /* check for skip equal to the read chunk size in InputStream.java */
         dotest(in,  0, 9000, 2048, 2048);
 
         /* check for skip greater than the read chunk size in InputStream.java */
         dotest(in, 2048, 9000, 5000, 5000);

@@ -96,31 +137,53 @@
          * long toskip = total - (long)6;
          * in = new MyInputStream(total);
          * dotest(in, 0, total, toskip, toskip);
          */
 
+        /* tests for skipping an exact number of bytes */
+
+        in = new MyInputStream(11);
+
+        /* test for negative skip */
+        dotestExact(in,  0, 11, -23);
+
+        /* test for zero skip */
+        dotestExact(in,  0, 11, 0);
+
+        /* test for skip before EOF */
+        dotestExact(in,  0, 11, 5);
+
+        /* check for skip beyond EOF starting from before EOF */
+        dotestExact(in,  5, 11, 7);
+
+        /* check for skip from / after EOF */
+        dotestExact(in, EOF, 11, 1);
     }
 
 }
 
 class MyInputStream extends InputStream {
 
-    private int readctr = 0;
+    private static final int EOF = -1;
+
+    private long readctr = 0;
     private long endoffile;
 
     public MyInputStream(long endoffile) {
         this.endoffile = endoffile;
     }
 
     public int read() {
 
         if (readctr == endoffile) {
-            return -1;
+            return EOF;
         }
         else {
             readctr++;
             return 0;
         }
     }
 
     public int available() { return 0; }
+
+    public long position() { return readctr; }
 }
< prev index next >