/*
 * Copyright (c) 2010, 2012, 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.
 */
import java.io.File;
import java.io.IOException;

/*
 * @test
 * @bug 6994753 7123582
 * @summary tests -XshowSettings options
 * @compile -XDignore.symbol.file Settings.java
 * @run main Settings
 * @author ksrini
 */
public class Settings extends TestHelper {
    private static File testJar = null;

    static void init() throws IOException {
        if  (testJar != null) {
            return;
        }
        testJar = new File("test.jar");
        StringBuilder tsrc = new StringBuilder();
        tsrc.append("public static void main(String... args) {\n");
        tsrc.append("   for (String x : args) {\n");
        tsrc.append("        System.out.println(x);\n");
        tsrc.append("   }\n");
        tsrc.append("}\n");
        createJar(testJar, tsrc.toString());
    }

    static void checkContains(TestResult tr, String str) {
        if (!tr.contains(str)) {
            System.out.println(tr);
            throw new RuntimeException(str + " not found");
        }
    }

    static void checkNoContains(TestResult tr, String str) {
        if (tr.contains(str)) {
            System.out.println(tr.status);
            throw new RuntimeException(str + " found");
        }
    }

    private static final String VM_SETTINGS = "VM settings:";
    private static final String PROP_SETTINGS = "Property settings:";
    private static final String LOCALE_SETTINGS = "Locale settings:";

    static void containsAllOptions(TestResult tr) {
        checkContains(tr, VM_SETTINGS);
        checkContains(tr, PROP_SETTINGS);
        checkContains(tr, LOCALE_SETTINGS);
    }

    static void runTestOptionDefault() throws IOException {
        String stackSize = "256"; // in kb
        if (getArch().equals("ppc64")) {
            stackSize = "800";
        }
        TestResult tr = null;
        tr = doExec(javaCmd, "-Xms64m", "-Xmx512m",
                "-Xss" + stackSize + "k", "-XshowSettings", "-jar", testJar.getAbsolutePath());
        containsAllOptions(tr);
        if (!tr.isOK()) {
            System.out.println(tr.status);
            throw new RuntimeException("test fails");
        }
        tr = doExec(javaCmd, "-Xms65536k", "-Xmx712m",
                "-Xss" + stackSize + "000", "-XshowSettings", "-jar", testJar.getAbsolutePath());
        containsAllOptions(tr);
        if (!tr.isOK()) {
            System.out.println(tr.status);
            throw new RuntimeException("test fails");
        }
    }

    static void runTestOptionAll() throws IOException {
        init();
        TestResult tr = null;
        tr = doExec(javaCmd, "-XshowSettings:all");
        containsAllOptions(tr);
    }

    static void runTestOptionVM() throws IOException {
        TestResult tr = null;
        tr = doExec(javaCmd, "-XshowSettings:vm");
        checkContains(tr, VM_SETTINGS);
        checkNoContains(tr, PROP_SETTINGS);
        checkNoContains(tr, LOCALE_SETTINGS);
    }

    static void runTestOptionProperty() throws IOException {
        TestResult tr = null;
        tr = doExec(javaCmd, "-XshowSettings:properties");
        checkNoContains(tr, VM_SETTINGS);
        checkContains(tr, PROP_SETTINGS);
        checkNoContains(tr, LOCALE_SETTINGS);
    }

    static void runTestOptionLocale() throws IOException {
        TestResult tr = null;
        tr = doExec(javaCmd, "-XshowSettings:locale");
        checkNoContains(tr, VM_SETTINGS);
        checkNoContains(tr, PROP_SETTINGS);
        checkContains(tr, LOCALE_SETTINGS);
    }

    static void runTestBadOptions() throws IOException {
        TestResult tr = null;
        tr = doExec(javaCmd, "-XshowSettingsBadOption");
        checkNoContains(tr, VM_SETTINGS);
        checkNoContains(tr, PROP_SETTINGS);
        checkNoContains(tr, LOCALE_SETTINGS);
        checkContains(tr, "Unrecognized option: -XshowSettingsBadOption");
    }

    static void runTest7123582() throws IOException {
        TestResult tr = null;
        tr = doExec(javaCmd, "-XshowSettings", "-version");
        if (!tr.isOK()) {
            System.out.println(tr.status);
            throw new RuntimeException("test fails");
        }
        containsAllOptions(tr);
    }

    public static void main(String... args) {
        try {
            runTestOptionAll();
            runTestOptionDefault();
            runTestOptionVM();
            runTestOptionProperty();
            runTestOptionLocale();
            runTestBadOptions();
            runTest7123582();
        } catch (IOException ioe) {
            throw new RuntimeException(ioe);
        }
    }
}
