test/jdk/java/io/IOException/LastErrorString.java
changeset 47216 71c04702a3d5
parent 32649 2ee9017c7597
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/io/IOException/LastErrorString.java	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,266 @@
+/*
+ * Copyright (c) 1998, 2011, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+   @bug 4167937
+   @ignore Test truncates system files when run as root, see 7042603
+   @summary Test code paths that use the JVM_LastErrorString procedure
+ */
+
+import java.io.IOException;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.RandomAccessFile;
+
+
+public class LastErrorString {
+
+    static String UNWRITEABLE_DIR;
+    static String UNREADABLE_FILE;
+    static String READABLE_FILE;
+    static String WRITEABLE_FILE;
+    static String INVALID_PATH;
+
+    static {
+        if (File.separatorChar == '/') {
+            UNWRITEABLE_DIR = "/etc/dfs";
+            UNREADABLE_FILE = "/etc/shadow";
+        } else if (File.separatorChar == '\\') {
+            UNREADABLE_FILE = "c:/pagefile.sys";
+            UNWRITEABLE_DIR = "z:/fooBAR/baz/GORP";
+        } else {
+            throw new RuntimeException("What kind of system is this?");
+        }
+        File d = new File(System.getProperty("test.src", "."));
+        READABLE_FILE = new File(d, "LastErrorString.java").getPath();
+        WRITEABLE_FILE = "x.LastErrorString";
+        String s = "foo/";
+        for (;;) {
+            s = s + s;
+            if (s.length() > 8192) break;
+        }
+        s += "bar";
+        INVALID_PATH = s;
+    }
+
+
+    abstract static class Test {
+
+        String name;
+
+        public Test(String name) {
+            this.name = name;
+        }
+
+        public abstract void run() throws IOException;
+
+        public void go() throws IOException {
+            try {
+                this.run();
+            } catch (IOException x) {
+                System.err.println(name);
+                System.err.println("  " + x);
+                return;
+            }
+            System.err.println("WARNING: No exception for " + name);
+        }
+
+    }
+
+    abstract static class ClosedFISTest extends Test {
+
+        FileInputStream in;
+
+        public ClosedFISTest(String name) {
+            super("FileInputStream." + name);
+        }
+
+        public void go() throws IOException {
+            this.in = new FileInputStream(READABLE_FILE);
+            this.in.close();
+            super.go();
+        }
+
+    }
+
+    abstract static class ClosedFOSTest extends Test {
+
+        FileOutputStream out;
+
+        public ClosedFOSTest(String name) {
+            super("FileOutputStream." + name);
+        }
+
+        public void go() throws IOException {
+            this.out = new FileOutputStream(WRITEABLE_FILE);
+            this.out.close();
+            super.go();
+        }
+
+    }
+
+    abstract static class ClosedRAFTest extends Test {
+
+        RandomAccessFile raf;
+
+        public ClosedRAFTest(String name) {
+            super("RandomAccessFile." + name);
+        }
+
+        public void go() throws IOException {
+            this.raf = new RandomAccessFile(WRITEABLE_FILE, "rw");
+            this.raf.close();
+            super.go();
+        }
+
+    }
+
+    abstract static class ReadOnlyRAFTest extends Test {
+
+        RandomAccessFile raf;
+
+        public ReadOnlyRAFTest(String name) {
+            super("RandomAccessFile." + name);
+        }
+
+        public void go() throws IOException {
+            this.raf = new RandomAccessFile(READABLE_FILE, "r");
+            super.go();
+            this.raf.close();
+        }
+
+    }
+
+
+    static void go() throws Exception {
+
+        new Test("File.createNewFile") {
+            public void run() throws IOException {
+                new File(UNWRITEABLE_DIR, "foo").createNewFile();
+            }}.go();
+
+        new Test("File.getCanonicalpath") {
+            public void run() throws IOException {
+                new File(INVALID_PATH).getCanonicalPath();
+            }}.go();
+
+        new Test("FileInputStream(file)") {
+            public void run() throws IOException {
+                new FileInputStream(UNREADABLE_FILE);
+            }}.go();
+
+        new Test("FileInputStream(dir)") {
+            public void run() throws IOException {
+                new FileInputStream(".");
+            }}.go();
+
+        new ClosedFISTest("read()") {
+            public void run() throws IOException {
+                in.read();
+            }}.go();
+
+        new ClosedFISTest("read(byte[])") {
+            public void run() throws IOException {
+                byte[] b = new byte[10];
+                in.read(b);
+            }}.go();
+
+        new ClosedFISTest("skip") {
+            public void run() throws IOException {
+                in.skip(10);
+            }}.go();
+
+        new ClosedFISTest("available") {
+            public void run() throws IOException {
+                in.available();
+            }}.go();
+
+        new Test("FileOutputStream") {
+            public void run() throws IOException {
+                new FileOutputStream(UNREADABLE_FILE);
+            }}.go();
+
+        new ClosedFOSTest("write()") {
+            public void run() throws IOException {
+                out.write(10);
+            }}.go();
+
+        new ClosedFOSTest("write(byte[])") {
+            public void run() throws IOException {
+                out.write(new byte[] { 1, 2, 3 });
+            }}.go();
+
+        new Test("RandomAccessFile") {
+            public void run() throws IOException {
+                new RandomAccessFile(UNREADABLE_FILE, "r");
+            }}.go();
+
+        new ClosedRAFTest("getFilePointer") {
+            public void run() throws IOException {
+                raf.getFilePointer();
+            }}.go();
+
+        new ClosedRAFTest("length") {
+            public void run() throws IOException {
+                raf.length();
+            }}.go();
+
+        new ClosedRAFTest("seek") {
+            public void run() throws IOException {
+                raf.seek(20);
+            }}.go();
+
+        new ClosedRAFTest("setLength") {
+            public void run() throws IOException {
+                raf.setLength(0);
+            }}.go();
+
+        new ClosedRAFTest("readShort") {
+            public void run() throws IOException {
+                raf.readShort();
+            }}.go();
+
+        new ClosedRAFTest("readInt") {
+            public void run() throws IOException {
+                raf.readInt();
+            }}.go();
+
+        new ReadOnlyRAFTest("writeShort") {
+            public void run() throws IOException {
+                raf.writeShort(10);
+            }}.go();
+
+        new ReadOnlyRAFTest("getFilePointer") {
+            public void run() throws IOException {
+                raf.writeInt(10);
+            }}.go();
+
+    }
+
+
+    public static void main(String[] args) throws Exception {
+        go();
+    }
+
+}