/*
 * Copyright 1998 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

/* @test
   @bug 4167937
   @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;
    }


    static abstract class Test {

        String name;

        public Test(String name) {
            this.name = name;
        }

        abstract public 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);
        }

    }

    static abstract 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();
        }

    }

    static abstract 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();
        }

    }

    static abstract 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();
        }

    }

    static abstract 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();
    }

}
