Arrrghs.java revision 1945
553N/A * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 0N/A * published by the Free Software Foundation. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 553N/A * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 553N/A * CA 95054 USA or visit www.sun.com if you need additional information or 0N/A * @bug 5030233 6214916 6356475 6571029 6684582 6742159 4459600 6758881 0N/A * @summary Argument parsing validation. * This class provides various tests for arguments processing. * A group of tests to ensure that arguments are passed correctly to * a child java process upon a re-exec, this typically happens when * a version other than the one being executed is requested by the user. * History: these set of tests were part of Arrrghs.sh. The MKS shell * implementations were notoriously buggy. Implementing these tests purely * in Java is not only portable but also robust. // The version string to force a re-exec // The Cookie or the pattern we match in the debug output. * SIGH, On Windows all strings are quoted, we need to unwrap it // Trim the string and remove the enclosed quotes if any. * This method detects the cookie in the output stream of the process. // Return the value asap if not in debug mode. * This method return true if the expected and detected arguments are the same. * Quoting could cause dissimilar testArguments and expected arguments. env.
put(
"_JAVA_LAUNCHER_DEBUG",
"true");
* A convenience method for identical test pattern and expected arguments * These tests require that a JVM (any JVM) be installed in the system registry. * If none is installed, skip this test. "no java found in system registry.");
// Basic test with many spaces // Quoted whitespace does matter ? // Escaped quotes outside of quotes as literals // Check for escaped quotes inside of quotes as literal // A quote preceeded by an odd number of slashes is a literal quote // A quote preceeded by an even number of slashes is a literal quote // Make sure that whitespace doesn't interfere with the removal of the // appropriate tokens. (space-tab-space preceeds -jre-restict-search). // Make sure that the mJRE tokens being stripped, aren't stripped if // they happen to appear as arguments to the main class. * These tests are usually run on non-existent targets to check error results // Test for 6356475 "REGRESSION:"java -X" from cmdline fails" * A set of tests which tests various dispositions of the main method. tr.
contains(
"Error: Could not find main class MIA");
tr.
contains(
"java.lang.NoClassDefFoundError: MIA");
// use classpath to check tr.
contains(
"Error: Could not find main class MIA");
tr.
contains(
"java.lang.NoClassDefFoundError: MIA");
// incorrect method access "private static void main(String[] args){}");
tr.
contains(
"Error: Main method not found in class Foo");
// use classpath to check tr.
contains(
"Error: Main method not found in class Foo");
"public static int main(String[] args){return 1;}");
tr.
contains(
"Error: Main method must return a value of type void in class Foo");
// use classpath to check tr.
contains(
"Error: Main method must return a value of type void in class Foo");
// incorrect parameter type "public static void main(Object[] args){}");
tr.
contains(
"Error: Main method not found in class Foo");
// use classpath to check tr.
contains(
"Error: Main method not found in class Foo");
// incorrect method type - non-static "public void main(String[] args){}");
tr.
contains(
"Error: Main method is not static in class Foo");
// use classpath to check tr.
contains(
"Error: Main method is not static in class Foo");
// amongst a potpourri of kindred main methods, is the right one chosen ? "void main(Object[] args){}",
"int main(Float[] args){return 1;}",
"private void main() {}",
"private static void main(int x) {}",
"public int main(int argc, String[] argv) {return 1;}",
"public static void main(String[] args) {System.out.println(\"THE_CHOSEN_ONE\");}");
// use classpath to check // test for extraneous whitespace in the Main-Class attribute "public static void main(String... args){}");
* @param args the command line arguments * @throws java.io.FileNotFoundException