/*
 * 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;
    }


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

}
