提交 8a58e755 编写于 作者: B bristor

6356642: extcheck.exe -verbose throws ArrayIndexOutOfBoundsException exception

Summary: Fix causes printing of user-level error messages instead of throwing exceptions
Reviewed-by: sherman
上级 bdaaed33
/* /*
* Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -307,11 +307,10 @@ public class ExtCheck { ...@@ -307,11 +307,10 @@ public class ExtCheck {
} }
/** /**
* Print out the error message and exit from the program * Throws a RuntimeException with a message describing the error.
*/ */
static void error(String message){ static void error(String message) throws RuntimeException {
System.err.println(message); throw new RuntimeException(message);
System.exit(-1);
} }
......
/* /*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -32,7 +32,10 @@ import java.io.*; ...@@ -32,7 +32,10 @@ import java.io.*;
*/ */
public final class Main { public final class Main {
public static final String INSUFFICIENT = "Insufficient number of arguments";
public static final String MISSING = "Missing <jar file> argument";
public static final String DOES_NOT_EXIST = "Jarfile does not exist: ";
public static final String EXTRA = "Extra command line argument: ";
/** /**
* Terminates with one of the following codes * Terminates with one of the following codes
...@@ -40,26 +43,36 @@ public final class Main { ...@@ -40,26 +43,36 @@ public final class Main {
* 0 No newer jar file was found * 0 No newer jar file was found
* -1 An internal error occurred * -1 An internal error occurred
*/ */
public static void main(String args[]){ public static void main(String args[]) {
try {
if (args.length < 1){ realMain(args);
System.err.println("Usage: extcheck [-verbose] <jar file>"); } catch (Exception ex) {
System.err.println(ex.getMessage());
System.exit(-1); System.exit(-1);
} }
}
public static void realMain(String[] args) throws Exception {
if (args.length < 1) {
usage(INSUFFICIENT);
}
int argIndex = 0; int argIndex = 0;
boolean verboseFlag = false; boolean verboseFlag = false;
if (args[argIndex].equals("-verbose")){ if (args[argIndex].equals("-verbose")) {
verboseFlag = true; verboseFlag = true;
argIndex++; argIndex++;
if (argIndex >= args.length) {
usage(MISSING);
}
} }
String jarName = args[argIndex]; String jarName = args[argIndex];
argIndex++; argIndex++;
File jarFile = new File(jarName); File jarFile = new File(jarName);
if (!jarFile.exists()){ if (!jarFile.exists()){
ExtCheck.error("Jarfile " + jarName + " does not exist"); usage(DOES_NOT_EXIST + jarName);
} }
if (argIndex < args.length) { if (argIndex < args.length) {
ExtCheck.error("Extra command line argument :"+args[argIndex]); usage(EXTRA + args[argIndex]);
} }
ExtCheck jt = ExtCheck.create(jarFile,verboseFlag); ExtCheck jt = ExtCheck.create(jarFile,verboseFlag);
boolean result = jt.checkInstalledAgainstTarget(); boolean result = jt.checkInstalledAgainstTarget();
...@@ -68,7 +81,10 @@ public final class Main { ...@@ -68,7 +81,10 @@ public final class Main {
} else { } else {
System.exit(1); System.exit(1);
} }
} }
private static void usage(String msg) throws Exception {
throw new Exception(msg + "\nUsage: extcheck [-verbose] <jar file>");
}
} }
/*
* Copyright 2008 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 6356642
* @summary Verify that extcheck exits appropriately when invalid args are given.
* @run shell TestExtcheckArgs.sh
* @author Dave Bristor
*/
import java.io.File;
import com.sun.tools.extcheck.Main;
/*
* Test extcheck by using Runtime.exec instead of invoking
* com.sun.tools.extcheck.Main.main, since the latter does its own
* System.exit under the conditions checked here.
*/
public class TestExtcheckArgs {
public static void realMain(String[] args) throws Throwable {
String testJar = System.getenv("TESTJAVA") + File.separator
+ "lib" + File.separator + "jconsole.jar";
verify(new String[] {
}, Main.INSUFFICIENT);
verify(new String[] {
"-verbose"
}, Main.MISSING);
verify(new String[] {
"-verbose",
"foo"
}, Main.DOES_NOT_EXIST);
verify(new String[] {
testJar,
"bar"
}, Main.EXTRA);
verify(new String[] {
"-verbose",
testJar,
"bar"
}, Main.EXTRA);
}
static void verify(String[] args, String expected) throws Throwable {
try {
Main.realMain(args);
fail();
} catch (Exception ex) {
if (ex.getMessage().startsWith(expected)) {
pass();
} else {
fail("Unexpected message: " + ex.getMessage());
}
}
}
//--------------------- Infrastructure ---------------------------
static volatile int passed = 0, failed = 0;
static boolean pass() {passed++; return true;}
static boolean fail() {failed++; Thread.dumpStack(); return false;}
static boolean fail(String msg) {System.out.println(msg); return fail();}
static void unexpected(Throwable t) {failed++; t.printStackTrace();}
static boolean check(boolean cond) {if (cond) pass(); else fail(); return cond;}
static boolean equal(Object x, Object y) {
if (x == null ? y == null : x.equals(y)) return pass();
else return fail(x + " not equal to " + y);}
public static void main(String[] args) throws Throwable {
try {realMain(args);} catch (Throwable t) {unexpected(t);}
System.out.println("\nPassed = " + passed + " failed = " + failed);
if (failed > 0) throw new AssertionError("Some tests failed");}
}
#! /bin/sh
#
# Copyright 2008 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.
#
if [ "x$TESTJAVA" = x ]; then
TESTJAVA=$1; shift
TESTCLASSES=.
TESTSRC=.
fi
export TESTJAVA
case "`uname`" in Windows*|CYGWIN* ) PS=';';; *) PS=':';; esac
${TESTJAVA}/bin/javac -d ${TESTCLASSES} -classpath ${TESTJAVA}/lib/tools.jar${PS}${TESTCLASSES} ${TESTSRC}/TestExtcheckArgs.java
rc=$?
if [ $rc != 0 ]; then
echo Compilation failure with exit status $rc
exit $rc
fi
${TESTJAVA}/bin/java -classpath ${TESTJAVA}/lib/tools.jar${PS}${TESTCLASSES} TestExtcheckArgs
rc=$?
if [ $rc != 0 ]; then
echo Execution failure with exit status $rc
exit $rc
fi
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册