7195249: Some jtreg tests use hard coded ports
Use Utils.getFreePort() and launch the tests by java code Reviewed-by: jbachorik, sla
This commit is contained in:
parent
76e336a948
commit
ee21184b17
@ -127,9 +127,6 @@ java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java generic-a
|
||||
|
||||
# jdk_management
|
||||
|
||||
# 8028150
|
||||
sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh windows-all
|
||||
|
||||
############################################################################
|
||||
|
||||
# jdk_jmx
|
||||
|
@ -25,9 +25,9 @@
|
||||
# No need to compile (now done by JTReg tags in calling file)
|
||||
#
|
||||
echo ${TESTJAVA}/bin/java ${TESTVMOPTS} -Dtest.src=${TESTCLASSES} \
|
||||
-classpath ${TESTCLASSES} $* || exit 20
|
||||
-classpath ${TESTCLASSPATH} $* || exit 20
|
||||
|
||||
${TESTJAVA}/bin/java ${TESTVMOPTS} -Dtest.src=${TESTCLASSES} \
|
||||
-classpath ${TESTCLASSES} $* || exit 20
|
||||
-classpath ${TESTCLASSPATH} $* || exit 20
|
||||
|
||||
exit 0
|
||||
|
@ -0,0 +1,202 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 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 jdk.testlibrary.OutputAnalyzer;
|
||||
import jdk.testlibrary.Platform;
|
||||
import jdk.testlibrary.ProcessTools;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.file.FileSystem;
|
||||
import java.nio.file.FileSystems;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.attribute.PosixFilePermission;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Change file permission for out-of-the-box management an do test used by
|
||||
* PasswordFilePermissionTest and SSLConfigFilePermissionTest tests
|
||||
*
|
||||
* @author Taras Ledkov
|
||||
*/
|
||||
public abstract class AbstractFilePermissionTest {
|
||||
private final String TEST_CLASS_PATH = System.getProperty("test.class.path");
|
||||
protected final String TEST_CLASSES = System.getProperty("test.classes");
|
||||
protected final FileSystem FS = FileSystems.getDefault();
|
||||
private int MAX_GET_FREE_PORT_TRIES = 10;
|
||||
|
||||
protected final Path libDir = FS.getPath(TEST_CLASSES, "lib");
|
||||
protected final Path mgmt = libDir.resolve("management.properties");
|
||||
private final String mp = "-Dcom.sun.management.config.file=" + mgmt.toFile().getAbsolutePath();
|
||||
private final String className = "Dummy";
|
||||
private int failures = 0;
|
||||
|
||||
protected final Path file2PermissionTest;
|
||||
|
||||
protected AbstractFilePermissionTest(String fileName2PermissionTest) {
|
||||
this.file2PermissionTest = libDir.resolve(fileName2PermissionTest);
|
||||
|
||||
try {
|
||||
MAX_GET_FREE_PORT_TRIES = Integer.parseInt(System.getProperty("test.getfreeport.max.tries", "10"));
|
||||
} catch (NumberFormatException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void createFile(Path path, String... content) throws IOException {
|
||||
if (Files.exists(path) && Files.isRegularFile(path)) {
|
||||
try {
|
||||
Files.delete(path);
|
||||
} catch (Exception ex) {
|
||||
System.out.println("WARNING: " + path.toFile().getAbsolutePath() + " already exists - unable to remove old copy");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
try (BufferedWriter bw = Files.newBufferedWriter(path, Charset.defaultCharset())) {
|
||||
for (String str : content) {
|
||||
bw.write(str, 0, str.length());
|
||||
bw.newLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean skipTest() {
|
||||
if ((TEST_CLASSES == null) || ("".equals(TEST_CLASSES))) {
|
||||
System.out.println("Test is designed to be run from jtreg only");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!Platform.isLinux() && !Platform.isSolaris()) {
|
||||
System.out.println("Test not designed to run on this operating system, skipping...");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected abstract void testSetup() throws IOException;
|
||||
|
||||
public void runTest(String[] args) throws Exception {
|
||||
|
||||
if (skipTest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Files.deleteIfExists(mgmt);
|
||||
Files.deleteIfExists(file2PermissionTest);
|
||||
libDir.toFile().mkdir();
|
||||
|
||||
testSetup();
|
||||
|
||||
try {
|
||||
test1();
|
||||
test2();
|
||||
|
||||
if (failures == 0) {
|
||||
System.out.println("All test(s) passed");
|
||||
} else {
|
||||
throw new Error(String.format("%d test(s) failed", failures));
|
||||
}
|
||||
} finally {
|
||||
resetPasswordFilePermission();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test 1 - SSL config file is secure - VM should start
|
||||
*/
|
||||
private void test1() throws Exception {
|
||||
final Set<PosixFilePermission> perms_0700 = new HashSet<>();
|
||||
perms_0700.add(PosixFilePermission.OWNER_WRITE);
|
||||
perms_0700.add(PosixFilePermission.OWNER_READ);
|
||||
perms_0700.add(PosixFilePermission.OWNER_EXECUTE);
|
||||
Files.setPosixFilePermissions(file2PermissionTest, perms_0700);
|
||||
|
||||
if (doTest() != 0) {
|
||||
++failures;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test 1 - SSL config file is secure - VM should start
|
||||
*/
|
||||
private void test2() throws Exception {
|
||||
final Set<PosixFilePermission> perms = Files.getPosixFilePermissions(file2PermissionTest);
|
||||
perms.add(PosixFilePermission.OTHERS_READ);
|
||||
perms.add(PosixFilePermission.OTHERS_EXECUTE);
|
||||
Files.setPosixFilePermissions(file2PermissionTest, perms);
|
||||
|
||||
if (doTest() == 0) {
|
||||
++failures;
|
||||
}
|
||||
}
|
||||
|
||||
private int doTest() throws Exception {
|
||||
|
||||
for (int i = 0; i < MAX_GET_FREE_PORT_TRIES; ++i) {
|
||||
final String pp = "-Dcom.sun.management.jmxremote.port=" + jdk.testlibrary.Utils.getFreePort();
|
||||
|
||||
List<String> command = new ArrayList<>();
|
||||
command.addAll(jdk.testlibrary.Utils.getVmOptions());
|
||||
command.add(mp);
|
||||
command.add(pp);
|
||||
command.add("-cp");
|
||||
command.add(TEST_CLASSES);
|
||||
command.add(className);
|
||||
|
||||
|
||||
ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder(
|
||||
command.toArray(new String[command.size()]));
|
||||
|
||||
System.out.println("test cmdline: " + Arrays.toString(processBuilder.command().toArray()).replace(",", ""));
|
||||
Process p = processBuilder.start();
|
||||
OutputAnalyzer output = new OutputAnalyzer(p);
|
||||
|
||||
System.out.println("test output:");
|
||||
System.out.println(output.getOutput());
|
||||
|
||||
if ((p.exitValue() == 0) ||
|
||||
!output.getOutput().contains("Exception thrown by the agent : " +
|
||||
"java.rmi.server.ExportException: Port already in use")) {
|
||||
return p.exitValue();
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
private void resetPasswordFilePermission() throws Exception {
|
||||
final Set<PosixFilePermission> perms_0777 = new HashSet<>();
|
||||
Arrays.asList(PosixFilePermission.values()).stream().forEach(p -> {
|
||||
perms_0777.add(p);
|
||||
});
|
||||
Files.setPosixFilePermissions(file2PermissionTest, perms_0777);
|
||||
}
|
||||
}
|
38
jdk/test/sun/management/jmxremote/bootstrap/Dummy.java
Normal file
38
jdk/test/sun/management/jmxremote/bootstrap/Dummy.java
Normal file
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 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.lang.management.ManagementFactory;
|
||||
import java.lang.management.RuntimeMXBean;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A dummy test "application" used by unit tests -
|
||||
* SSLConfigFilePermissionTest.java
|
||||
*
|
||||
* @author Taras Ledkov
|
||||
*/
|
||||
class Dummy {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Inside main method...");
|
||||
}
|
||||
}
|
@ -22,6 +22,7 @@
|
||||
*/
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.nio.file.FileSystem;
|
||||
@ -32,7 +33,6 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import jdk.testlibrary.ProcessTools;
|
||||
|
||||
/**
|
||||
* @test
|
||||
@ -43,15 +43,25 @@ import jdk.testlibrary.ProcessTools;
|
||||
* TestManager will attempt a connection to the address obtained from
|
||||
* both agent properties and jvmstat buffer.
|
||||
* @build jdk.testlibrary.ProcessTools
|
||||
* @build jdk.testlibrary.Utils
|
||||
* @build TestManager TestApplication
|
||||
* @run main/othervm/timeout=300 -XX:+UsePerfData LocalManagementTest
|
||||
*/
|
||||
|
||||
import jdk.testlibrary.ProcessTools;
|
||||
import jdk.testlibrary.Utils;
|
||||
|
||||
public class LocalManagementTest {
|
||||
private static final String TEST_CLASSPATH = System.getProperty("test.class.path");
|
||||
private static final String TEST_JDK = System.getProperty("test.jdk");
|
||||
private static final String TEST_CLASSPATH = System.getProperty("test.class.path");
|
||||
private static final String TEST_JDK = System.getProperty("test.jdk");
|
||||
private static int MAX_GET_FREE_PORT_TRIES = 10;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
try {
|
||||
MAX_GET_FREE_PORT_TRIES = Integer.parseInt(System.getProperty("test.getfreeport.max.tries", "10"));
|
||||
} catch (NumberFormatException ex) {
|
||||
}
|
||||
|
||||
int failures = 0;
|
||||
for(Method m : LocalManagementTest.class.getDeclaredMethods()) {
|
||||
if (Modifier.isStatic(m.getModifiers()) &&
|
||||
@ -103,29 +113,49 @@ public class LocalManagementTest {
|
||||
private static boolean test4() throws Exception {
|
||||
Path agentPath = findAgent();
|
||||
if (agentPath != null) {
|
||||
ProcessBuilder builder = ProcessTools.createJavaProcessBuilder(
|
||||
"-javaagent:" + agentPath.toString() +
|
||||
"=com.sun.management.jmxremote.port=7775," +
|
||||
"com.sun.management.jmxremote.authenticate=false," +
|
||||
"com.sun.management.jmxremote.ssl=false",
|
||||
"-cp",
|
||||
TEST_CLASSPATH,
|
||||
"TestApplication",
|
||||
"-exit"
|
||||
);
|
||||
|
||||
Process prc = null;
|
||||
try {
|
||||
prc = ProcessTools.startProcess(
|
||||
"TestApplication",
|
||||
builder
|
||||
for (int i = 0; i < MAX_GET_FREE_PORT_TRIES; ++i) {
|
||||
ProcessBuilder builder = ProcessTools.createJavaProcessBuilder(
|
||||
"-javaagent:" + agentPath.toString() +
|
||||
"=com.sun.management.jmxremote.port=" + Utils.getFreePort() + "," +
|
||||
"com.sun.management.jmxremote.authenticate=false," +
|
||||
"com.sun.management.jmxremote.ssl=false",
|
||||
"-cp",
|
||||
TEST_CLASSPATH,
|
||||
"TestApplication",
|
||||
"-exit"
|
||||
);
|
||||
int exitCode = prc.waitFor();
|
||||
return exitCode == 0;
|
||||
} finally {
|
||||
if (prc != null) {
|
||||
prc.destroy();
|
||||
|
||||
Process prc = null;
|
||||
final AtomicReference<Boolean> isBindExceptionThrown = new AtomicReference<>();
|
||||
isBindExceptionThrown.set(new Boolean(false));
|
||||
try {
|
||||
prc = ProcessTools.startProcess(
|
||||
"TestApplication",
|
||||
builder,
|
||||
(String line) -> {
|
||||
if (line.contains("Exception thrown by the agent : " +
|
||||
"java.rmi.server.ExportException: Port already in use")) {
|
||||
isBindExceptionThrown.set(new Boolean(true));
|
||||
}
|
||||
});
|
||||
|
||||
prc.waitFor();
|
||||
|
||||
if (prc.exitValue() == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isBindExceptionThrown.get().booleanValue()) {
|
||||
System.out.println("'Port already in use' error detected. Try again");
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} finally {
|
||||
if (prc != null) {
|
||||
prc.destroy();
|
||||
prc.waitFor();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -239,4 +269,4 @@ public class LocalManagementTest {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 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.IOException;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @library /lib/testlibrary
|
||||
* @bug 6557093
|
||||
* @summary Check SSL config file permission for out-of-the-box management
|
||||
* @build jdk.testlibrary.Utils
|
||||
* @build jdk.testlibrary.ProcessTools
|
||||
* @build jdk.testlibrary.OutputAnalyzer
|
||||
* @build AbstractFilePermissionTest
|
||||
* @build Dummy
|
||||
* @run main/timeout=300 PasswordFilePermissionTest
|
||||
*
|
||||
* @author Taras Ledkov
|
||||
*/
|
||||
public class PasswordFilePermissionTest extends AbstractFilePermissionTest {
|
||||
|
||||
private PasswordFilePermissionTest() {
|
||||
super("jmxremote.passwordconfig");
|
||||
}
|
||||
|
||||
public void testSetup() throws IOException {
|
||||
createFile(mgmt,
|
||||
"# management.properties",
|
||||
"com.sun.management.jmxremote.ssl=false",
|
||||
"com.sun.management.jmxremote.password.file=" + file2PermissionTest.toFile().getAbsolutePath());
|
||||
|
||||
createFile(file2PermissionTest,
|
||||
"# jmxremote.password\n");
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
PasswordFilePermissionTest test = new PasswordFilePermissionTest();
|
||||
|
||||
test.runTest(args);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -1,134 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright (c) 2004, 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 5008047
|
||||
# @summary Check password file permission for out-of-the-box management
|
||||
#
|
||||
# @run shell PasswordFilePermissionTest.sh
|
||||
|
||||
createJavaFile()
|
||||
{
|
||||
cat << EOF > $1/$2.java
|
||||
class $2 {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Inside main method...");
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
createConfigFile() {
|
||||
cat << EOF > $1
|
||||
# management.properties
|
||||
com.sun.management.jmxremote.ssl=false
|
||||
com.sun.management.jmxremote.password.file=$2
|
||||
EOF
|
||||
}
|
||||
|
||||
createPasswordFile() {
|
||||
if [ -f "$1" ] ; then
|
||||
rm -f $1 || echo WARNING: $1 already exists - unable to remove old copy
|
||||
fi
|
||||
cat << EOF > $1
|
||||
# jmxremote.password
|
||||
EOF
|
||||
}
|
||||
|
||||
|
||||
# Check we are run from jtreg
|
||||
if [ -z "${TESTCLASSES}" ]; then
|
||||
echo "Test is designed to be run from jtreg only"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
# Test not suitable for Windows as chmod may not be able to
|
||||
# security the password file.
|
||||
|
||||
os=`uname -s`
|
||||
if [ "$os" != "Linux" -a "$os" != "SunOS" ]; then
|
||||
echo "Test not designed to run on this operating system, skipping..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
# Create configuration file and dummy password file
|
||||
|
||||
LIBDIR=${TESTCLASSES}/lib
|
||||
CONFIG=${LIBDIR}/management.properties
|
||||
PASSWD=${LIBDIR}/jmxremote.password
|
||||
rm -f ${CONFIG}
|
||||
rm -f ${PASSWD}
|
||||
mkdir ${LIBDIR} 2>&1
|
||||
createJavaFile ${TESTCLASSES} Null
|
||||
createConfigFile ${CONFIG} ${PASSWD}
|
||||
createPasswordFile ${PASSWD}
|
||||
|
||||
# Compile test
|
||||
|
||||
${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d ${TESTCLASSES} ${TESTCLASSES}/Null.java
|
||||
|
||||
|
||||
JAVA=${TESTJAVA}/bin/java
|
||||
CLASSPATH=${TESTCLASSES}
|
||||
export CLASSPATH
|
||||
|
||||
failures=0
|
||||
|
||||
mp=-Dcom.sun.management.config.file=${CONFIG}
|
||||
pp=-Dcom.sun.management.jmxremote.port=4888
|
||||
|
||||
go() {
|
||||
echo ''
|
||||
sh -xc "$JAVA ${TESTVMOPTS} $1 $2 $3 $4 $5 $6 $7 $8" 2>&1
|
||||
if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
|
||||
}
|
||||
|
||||
# Test 1 - password file is secure - VM should start
|
||||
chmod 700 ${PASSWD}
|
||||
sh -xc "$JAVA ${TESTVMOPTS} $mp $pp Null" 2>&1
|
||||
if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
|
||||
|
||||
# Test 2 - password file is not secure - VM should fail to start
|
||||
chmod o+rx ${PASSWD}
|
||||
sh -xc "$JAVA ${TESTVMOPTS} $mp $pp Null" 2>&1
|
||||
if [ $? = 0 ]; then failures=`expr $failures + 1`; fi
|
||||
|
||||
# Reset the file permissions on the generated password file
|
||||
chmod 777 ${PASSWD}
|
||||
|
||||
#
|
||||
# Results
|
||||
#
|
||||
echo ''
|
||||
if [ $failures -gt 0 ];
|
||||
then echo "$failures test(s) failed";
|
||||
else echo "All test(s) passed"; fi
|
||||
exit $failures
|
||||
|
||||
|
||||
|
@ -27,7 +27,6 @@ import java.io.FileInputStream;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.net.BindException;
|
||||
import java.net.ServerSocket;
|
||||
import java.rmi.server.ExportException;
|
||||
|
||||
import java.util.Properties;
|
||||
@ -43,8 +42,6 @@ import javax.management.*;
|
||||
|
||||
import sun.management.AgentConfigurationError;
|
||||
|
||||
import util.TestLogger;
|
||||
|
||||
/**
|
||||
* <p>This class implements unit test for RMI Bootstrap.
|
||||
* When called with no arguments main() looks in the directory indicated
|
||||
@ -71,17 +68,10 @@ import util.TestLogger;
|
||||
**/
|
||||
public class RmiBootstrapTest {
|
||||
// the number of consecutive ports to test for availability
|
||||
private static final int PORT_TEST_LEN = 800;
|
||||
private static int MAX_GET_FREE_PORT_TRIES = 10;
|
||||
static TestLogger log =
|
||||
new TestLogger("RmiBootstrapTest");
|
||||
|
||||
/**
|
||||
* When launching several registries, we increment the port number
|
||||
* to avoid falling into "port number already in use" problems.
|
||||
**/
|
||||
static int testPort = 0;
|
||||
static int basePort = 0;
|
||||
|
||||
/**
|
||||
* Default values for RMI configuration properties.
|
||||
**/
|
||||
@ -627,92 +617,100 @@ public class RmiBootstrapTest {
|
||||
* eventually cleans up by calling ConnectorBootstrap.terminate().
|
||||
* @return null if the test succeeds, an error message otherwise.
|
||||
**/
|
||||
private String testConfiguration(File file,int port) throws BindException {
|
||||
private String testConfiguration(File file) throws IOException, InterruptedException {
|
||||
|
||||
final String path;
|
||||
try {
|
||||
path=(file==null)?null:file.getCanonicalPath();
|
||||
} catch(IOException x) {
|
||||
final String err = "Failed to test configuration " + file +
|
||||
": " + x;
|
||||
log.trace("testConfiguration",err);
|
||||
log.debug("testConfiguration",x);
|
||||
return err;
|
||||
}
|
||||
final String config = (path==null)?"Default config file":path;
|
||||
|
||||
System.out.println("***");
|
||||
System.out.println("*** Testing configuration (port=" + port + "): "
|
||||
+ path);
|
||||
System.out.println("***");
|
||||
|
||||
System.setProperty("com.sun.management.jmxremote.port",
|
||||
Integer.toString(port));
|
||||
if (path != null)
|
||||
System.setProperty("com.sun.management.config.file", path);
|
||||
else
|
||||
System.getProperties().remove("com.sun.management.config.file");
|
||||
|
||||
log.trace("testConfiguration","com.sun.management.jmxremote.port="+port);
|
||||
if (path != null && log.isDebugOn())
|
||||
log.trace("testConfiguration",
|
||||
"com.sun.management.config.file="+path);
|
||||
|
||||
checkSslConfiguration();
|
||||
|
||||
final JMXConnectorServer cs;
|
||||
try {
|
||||
cs = ConnectorBootstrap.initialize();
|
||||
} catch (AgentConfigurationError x) {
|
||||
if (x.getCause() instanceof ExportException) {
|
||||
if (x.getCause().getCause() instanceof BindException) {
|
||||
throw (BindException)x.getCause().getCause();
|
||||
for (int i = 0; i < MAX_GET_FREE_PORT_TRIES; i++) {
|
||||
try {
|
||||
int port = jdk.testlibrary.Utils.getFreePort();
|
||||
final String path;
|
||||
try {
|
||||
path=(file==null)?null:file.getCanonicalPath();
|
||||
} catch(IOException x) {
|
||||
final String err = "Failed to test configuration " + file +
|
||||
": " + x;
|
||||
log.trace("testConfiguration",err);
|
||||
log.debug("testConfiguration",x);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
final String err = "Failed to initialize connector:" +
|
||||
"\n\tcom.sun.management.jmxremote.port=" + port +
|
||||
((path!=null)?"\n\tcom.sun.management.config.file="+path:
|
||||
"\n\t"+config) +
|
||||
"\n\tError is: " + x;
|
||||
log.trace("testConfiguration",err);
|
||||
log.debug("testConfiguration",x);
|
||||
return err;
|
||||
} catch (Exception x) {
|
||||
log.debug("testConfiguration",x);
|
||||
return x.toString();
|
||||
}
|
||||
final String config = (path==null)?"Default config file":path;
|
||||
|
||||
try {
|
||||
JMXServiceURL url =
|
||||
new JMXServiceURL("rmi",null,0,"/jndi/rmi://localhost:"+
|
||||
port+"/jmxrmi");
|
||||
System.out.println("***");
|
||||
System.out.println("*** Testing configuration (port=" + port + "): "
|
||||
+ path);
|
||||
System.out.println("***");
|
||||
|
||||
try {
|
||||
testCommunication(url);
|
||||
} catch (Exception x) {
|
||||
final String err = "Failed to connect to agent {url="+url+
|
||||
"}: " + x;
|
||||
log.trace("testConfiguration",err);
|
||||
log.debug("testConfiguration",x);
|
||||
return err;
|
||||
}
|
||||
} catch (Exception x) {
|
||||
final String err = "Failed to test configuration "+config+
|
||||
": "+x;
|
||||
log.trace("testConfiguration",err);
|
||||
log.debug("testConfiguration",x);
|
||||
return err;
|
||||
} finally {
|
||||
try {
|
||||
cs.stop();
|
||||
} catch (Exception x) {
|
||||
final String err = "Failed to terminate: "+x;
|
||||
log.trace("testConfiguration",err);
|
||||
log.debug("testConfiguration",x);
|
||||
System.setProperty("com.sun.management.jmxremote.port",
|
||||
Integer.toString(port));
|
||||
if (path != null)
|
||||
System.setProperty("com.sun.management.config.file", path);
|
||||
else
|
||||
System.getProperties().remove("com.sun.management.config.file");
|
||||
|
||||
log.trace("testConfiguration","com.sun.management.jmxremote.port="+port);
|
||||
if (path != null && log.isDebugOn())
|
||||
log.trace("testConfiguration",
|
||||
"com.sun.management.config.file="+path);
|
||||
|
||||
checkSslConfiguration();
|
||||
|
||||
final JMXConnectorServer cs;
|
||||
try {
|
||||
cs = ConnectorBootstrap.initialize();
|
||||
} catch (AgentConfigurationError x) {
|
||||
if (x.getCause() instanceof ExportException) {
|
||||
if (x.getCause().getCause() instanceof BindException) {
|
||||
throw (BindException)x.getCause().getCause();
|
||||
}
|
||||
}
|
||||
final String err = "Failed to initialize connector:" +
|
||||
"\n\tcom.sun.management.jmxremote.port=" + port +
|
||||
((path!=null)?"\n\tcom.sun.management.config.file="+path:
|
||||
"\n\t"+config) +
|
||||
"\n\tError is: " + x;
|
||||
log.trace("testConfiguration",err);
|
||||
log.debug("testConfiguration",x);
|
||||
return err;
|
||||
} catch (Exception x) {
|
||||
log.debug("testConfiguration",x);
|
||||
return x.toString();
|
||||
}
|
||||
|
||||
try {
|
||||
JMXServiceURL url =
|
||||
new JMXServiceURL("rmi",null,0,"/jndi/rmi://localhost:"+
|
||||
port+"/jmxrmi");
|
||||
|
||||
try {
|
||||
testCommunication(url);
|
||||
} catch (Exception x) {
|
||||
final String err = "Failed to connect to agent {url="+url+
|
||||
"}: " + x;
|
||||
log.trace("testConfiguration",err);
|
||||
log.debug("testConfiguration",x);
|
||||
return err;
|
||||
}
|
||||
} catch (Exception x) {
|
||||
final String err = "Failed to test configuration "+config+
|
||||
": "+x;
|
||||
log.trace("testConfiguration",err);
|
||||
log.debug("testConfiguration",x);
|
||||
return err;
|
||||
} finally {
|
||||
try {
|
||||
cs.stop();
|
||||
} catch (Exception x) {
|
||||
final String err = "Failed to terminate: "+x;
|
||||
log.trace("testConfiguration",err);
|
||||
log.debug("testConfiguration",x);
|
||||
}
|
||||
}
|
||||
System.out.println("Configuration " + config + " successfully tested");
|
||||
return null;
|
||||
} catch(BindException ex) {
|
||||
}
|
||||
}
|
||||
System.out.println("Configuration " + config + " successfully tested");
|
||||
return null;
|
||||
System.err.println("Cannot find a free port after " + MAX_GET_FREE_PORT_TRIES + " tries");
|
||||
return "Failed: cannot find a free port after " + MAX_GET_FREE_PORT_TRIES + " tries";
|
||||
}
|
||||
|
||||
/**
|
||||
@ -720,23 +718,16 @@ public class RmiBootstrapTest {
|
||||
* The test is assumed to have succeeded if the bootstrap fails.
|
||||
* @return null if the test succeeds, an error message otherwise.
|
||||
**/
|
||||
private String testConfigurationKo(File conf,int port) {
|
||||
private String testConfigurationKo(File conf) throws InterruptedException, IOException {
|
||||
String errStr = null;
|
||||
for (int i = 0; i < PORT_TEST_LEN; i++) {
|
||||
try {
|
||||
errStr = testConfiguration(conf,port+testPort++);
|
||||
break;
|
||||
} catch (BindException e) {
|
||||
// port conflict; try another port
|
||||
}
|
||||
}
|
||||
errStr = testConfiguration(conf);
|
||||
if (errStr == null) {
|
||||
return "Configuration " +
|
||||
conf + " should have failed!";
|
||||
}
|
||||
System.out.println("Configuration " +
|
||||
conf + " failed as expected");
|
||||
log.debug("runko","Error was: " + errStr);
|
||||
log.debug("runko", "Error was: " + errStr);
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -747,26 +738,16 @@ public class RmiBootstrapTest {
|
||||
* *ko.properties: bootstrap or connection should fail.
|
||||
* @return null if the test succeeds, an error message otherwise.
|
||||
**/
|
||||
private String testConfigurationFile(String fileName) {
|
||||
private String testConfigurationFile(String fileName) throws InterruptedException, IOException {
|
||||
File file = new File(fileName);
|
||||
final String portStr = System.getProperty("rmi.port",null);
|
||||
final int port = portStr != null ?
|
||||
Integer.parseInt(portStr) : basePort;
|
||||
|
||||
if (fileName.endsWith("ok.properties")) {
|
||||
String errStr = null;
|
||||
for (int i = 0; i < PORT_TEST_LEN; i++) {
|
||||
try {
|
||||
errStr = testConfiguration(file,port+testPort++);
|
||||
return errStr;
|
||||
} catch (BindException e) {
|
||||
// port conflict; try another port
|
||||
}
|
||||
}
|
||||
return "Can not locate available port";
|
||||
errStr = testConfiguration(file);
|
||||
return errStr;
|
||||
}
|
||||
if (fileName.endsWith("ko.properties")) {
|
||||
return testConfigurationKo(file,port+testPort++);
|
||||
return testConfigurationKo(file);
|
||||
}
|
||||
return fileName +
|
||||
": test file suffix must be one of [ko|ok].properties";
|
||||
@ -777,17 +758,14 @@ public class RmiBootstrapTest {
|
||||
* (see findConfigurationFilesKo() and testConfigurationKo())
|
||||
* @throws RuntimeException if the test fails.
|
||||
**/
|
||||
public void runko() {
|
||||
final String portStr = System.getProperty("rmi.port",null);
|
||||
final int port = portStr != null ?
|
||||
Integer.parseInt(portStr) : basePort;
|
||||
public void runko() throws InterruptedException, IOException {
|
||||
final File[] conf = findConfigurationFilesKo();
|
||||
if ((conf == null)||(conf.length == 0))
|
||||
throw new RuntimeException("No configuration found");
|
||||
|
||||
String errStr;
|
||||
for (int i=0;i<conf.length;i++) {
|
||||
errStr = testConfigurationKo(conf[i],port+testPort++);
|
||||
errStr = testConfigurationKo(conf[i]);
|
||||
if (errStr != null) {
|
||||
throw new RuntimeException(errStr);
|
||||
}
|
||||
@ -800,24 +778,14 @@ public class RmiBootstrapTest {
|
||||
* (see findConfigurationFilesOk() and testConfiguration())
|
||||
* @throws RuntimeException if the test fails.
|
||||
**/
|
||||
public void runok() {
|
||||
final String portStr = System.getProperty("rmi.port",null);
|
||||
final int port = portStr != null ?
|
||||
Integer.parseInt(portStr) : basePort;
|
||||
public void runok() throws InterruptedException, IOException {
|
||||
final File[] conf = findConfigurationFilesOk();
|
||||
if ((conf == null)||(conf.length == 0))
|
||||
throw new RuntimeException("No configuration found");
|
||||
|
||||
String errStr = null;
|
||||
for (int i=0;i<conf.length;i++) {
|
||||
for (int j = 0; j < PORT_TEST_LEN; i++) {
|
||||
try {
|
||||
errStr = testConfiguration(conf[i],port+testPort++);
|
||||
break;
|
||||
} catch (BindException e) {
|
||||
// port conflict; try another port
|
||||
}
|
||||
}
|
||||
errStr = testConfiguration(conf[i]);
|
||||
if (errStr != null) {
|
||||
throw new RuntimeException(errStr);
|
||||
}
|
||||
@ -840,7 +808,7 @@ public class RmiBootstrapTest {
|
||||
* (see runko() and runok()).
|
||||
* @throws RuntimeException if the test fails.
|
||||
**/
|
||||
public void run() {
|
||||
public void run() throws InterruptedException, IOException {
|
||||
runok();
|
||||
runko();
|
||||
}
|
||||
@ -854,7 +822,7 @@ public class RmiBootstrapTest {
|
||||
* indicated by the System property "test.src".
|
||||
* @throws RuntimeException if the test fails.
|
||||
**/
|
||||
public void run(String args[]) {
|
||||
public void run(String args[]) throws InterruptedException, IOException {
|
||||
if (args.length == 0) {
|
||||
run() ; return;
|
||||
}
|
||||
@ -871,7 +839,11 @@ public class RmiBootstrapTest {
|
||||
* exit(1) if the test fails.
|
||||
**/
|
||||
public static void main(String args[]) throws Exception {
|
||||
setupBasePort();
|
||||
try {
|
||||
MAX_GET_FREE_PORT_TRIES = Integer.parseInt(System.getProperty("test.getfreeport.max.tries", "10"));
|
||||
} catch (NumberFormatException ex) {
|
||||
}
|
||||
|
||||
RmiBootstrapTest manager = new RmiBootstrapTest();
|
||||
try {
|
||||
manager.run(args);
|
||||
@ -886,9 +858,4 @@ public class RmiBootstrapTest {
|
||||
System.out.println("**** Test RmiBootstrap Passed ****");
|
||||
}
|
||||
|
||||
private static void setupBasePort() throws IOException {
|
||||
try (ServerSocket s = new ServerSocket(0)) {
|
||||
basePort = s.getLocalPort() + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,7 +26,12 @@
|
||||
# @bug 6528083
|
||||
# @summary Test RMI Bootstrap
|
||||
#
|
||||
# @build TestLogger RmiBootstrapTest Utils
|
||||
# @library /lib/testlibrary
|
||||
# @library /lib/testlibrary
|
||||
# @build jdk.testlibrary.Utils
|
||||
# @build TestLogger
|
||||
# @build Utils
|
||||
# @build RmiBootstrapTest
|
||||
# @run shell/timeout=300 RmiBootstrapTest.sh
|
||||
|
||||
# Define the Java class test name
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 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
|
||||
@ -21,69 +21,193 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.rmi.registry.LocateRegistry;
|
||||
import java.rmi.registry.Registry;
|
||||
import javax.rmi.ssl.SslRMIClientSocketFactory;
|
||||
import jdk.testlibrary.OutputAnalyzer;
|
||||
import jdk.testlibrary.ProcessTools;
|
||||
import jdk.testlibrary.Utils;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.IOException;
|
||||
import java.net.BindException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.file.FileSystem;
|
||||
import java.nio.file.FileSystems;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @library /lib/testlibrary
|
||||
* @bug 6228231
|
||||
* @summary Test that RMI registry uses SSL.
|
||||
* @build jdk.testlibrary.Utils
|
||||
* @build jdk.testlibrary.ProcessTools
|
||||
* @build jdk.testlibrary.OutputAnalyzer
|
||||
* @build RmiRegistrySslTestApp
|
||||
* @run main/timeout=300 RmiRegistrySslTest
|
||||
* @author Luis-Miguel Alventosa, Taras Ledkov
|
||||
*/
|
||||
public class RmiRegistrySslTest {
|
||||
private final String TEST_CLASS_PATH = System.getProperty("test.class.path");
|
||||
private final String TEST_CLASSES = System.getProperty("test.classes");
|
||||
private final String TEST_SRC = System.getProperty("test.src");
|
||||
private final FileSystem FS = FileSystems.getDefault();
|
||||
|
||||
static final String ok = "OK: Found jmxrmi entry in RMIRegistry!";
|
||||
static final String ko = "KO: Did not find jmxrmi entry in RMIRegistry!";
|
||||
static final String ko2 = "KO: Did not get expected exception!";
|
||||
static final String okException = "OK: Got expected exception!";
|
||||
static final String koException = "KO: Got unexpected exception!";
|
||||
private final Path libDir = FS.getPath(TEST_CLASSES, "lib");
|
||||
private final Path rmiRegistryTemplate = FS.getPath(TEST_SRC, "rmiregistry.properties");
|
||||
private final Path rmiRegistrySslTemplate = FS.getPath(TEST_SRC, "rmiregistryssl.properties");
|
||||
private final Path rmiRegistryFile = libDir.resolve("rmiregistry.properties");
|
||||
private final Path rmiRegistrySslFile = libDir.resolve("rmiregistryssl.properties");
|
||||
private final String className = "RmiRegistrySslTestApp";
|
||||
private int failures = 0;
|
||||
private int port = 4444;
|
||||
private static int MAX_GET_FREE_PORT_TRIES = 10;
|
||||
private Map<String, Object> model = new HashMap<>();
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
private RmiRegistrySslTest() {
|
||||
try {
|
||||
MAX_GET_FREE_PORT_TRIES = Integer.parseInt(System.getProperty("test.getfreeport.max.tries", "10"));
|
||||
} catch (NumberFormatException ex) {
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("RmiRegistry lookup...");
|
||||
private void initPort() {
|
||||
try {
|
||||
port = Utils.getFreePort();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
model.put("${getFreePort}", new Integer(port));
|
||||
}
|
||||
|
||||
String testID = System.getProperty("testID");
|
||||
private void initTestEnvironment() throws IOException {
|
||||
initPort();
|
||||
|
||||
if ("Test1".equals(testID)) {
|
||||
Files.deleteIfExists(rmiRegistryFile);
|
||||
Files.deleteIfExists(rmiRegistrySslFile);
|
||||
libDir.toFile().mkdir();
|
||||
createFileByTemplate(rmiRegistryTemplate, rmiRegistryFile, model);
|
||||
createFileByTemplate(rmiRegistrySslTemplate, rmiRegistrySslFile, model);
|
||||
}
|
||||
|
||||
public static void createFileByTemplate(Path template, Path out, Map<String, Object> model) throws IOException {
|
||||
if (Files.exists(out) && Files.isRegularFile(out)) {
|
||||
try {
|
||||
Registry registry = LocateRegistry.getRegistry(4444);
|
||||
String[] list = registry.list();
|
||||
if ("jmxrmi".equals(list[0])) {
|
||||
System.out.println(ok);
|
||||
} else {
|
||||
System.out.println(ko);
|
||||
throw new IllegalArgumentException(ko);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println(koException);
|
||||
e.printStackTrace(System.out);
|
||||
throw e;
|
||||
Files.delete(out);
|
||||
} catch (Exception ex) {
|
||||
System.out.println("WARNING: " + out.toFile().getAbsolutePath() + " already exists - unable to remove old copy");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if ("Test2".equals(testID)) {
|
||||
try {
|
||||
Registry registry = LocateRegistry.getRegistry(4444);
|
||||
String[] list = registry.list();
|
||||
throw new IllegalArgumentException(ko2);
|
||||
} catch (Exception e) {
|
||||
System.out.println(okException);
|
||||
e.printStackTrace(System.out);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ("Test3".equals(testID)) {
|
||||
try {
|
||||
Registry registry = LocateRegistry.getRegistry(
|
||||
null, 4444, new SslRMIClientSocketFactory());
|
||||
String[] list = registry.list();
|
||||
if ("jmxrmi".equals(list[0])) {
|
||||
System.out.println(ok);
|
||||
} else {
|
||||
System.out.println(ko);
|
||||
throw new IllegalArgumentException(ko);
|
||||
try (BufferedReader br = Files.newBufferedReader(template, Charset.defaultCharset());
|
||||
BufferedWriter bw = Files.newBufferedWriter(out, Charset.defaultCharset())) {
|
||||
String line;
|
||||
while ((line = br.readLine()) != null) {
|
||||
if (model != null) {
|
||||
for (Map.Entry<String, Object> macro : model.entrySet()) {
|
||||
line = line.replaceAll(Pattern.quote(macro.getKey()), macro.getValue().toString());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println(koException);
|
||||
e.printStackTrace(System.out);
|
||||
throw e;
|
||||
|
||||
bw.write(line, 0, line.length());
|
||||
bw.newLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void runTest(String[] args) throws Exception {
|
||||
|
||||
test1();
|
||||
test2();
|
||||
test3();
|
||||
|
||||
if (failures == 0) {
|
||||
System.out.println("All test(s) passed");
|
||||
} else {
|
||||
throw new Error(String.format("%d test(s) failed", failures));
|
||||
}
|
||||
}
|
||||
|
||||
private void test1() throws Exception {
|
||||
System.out.println("-------------------------------------------------------------");
|
||||
System.out.println(getClass().getName() + " : Non SSL RMIRegistry - Non SSL Lookup");
|
||||
System.out.println("-------------------------------------------------------------");
|
||||
|
||||
int res = doTest("-DtestID=Test1",
|
||||
"-Dcom.sun.management.config.file=" + rmiRegistryFile.toFile().getAbsolutePath());
|
||||
|
||||
if (res != 0) {
|
||||
++failures;
|
||||
}
|
||||
}
|
||||
|
||||
private void test2() throws Exception {
|
||||
System.out.println("-------------------------------------------------------------");
|
||||
System.out.println(getClass().getName() + " : SSL RMIRegistry - Non SSL Lookup");
|
||||
System.out.println("-------------------------------------------------------------");
|
||||
|
||||
int res = doTest("-DtestID=Test2",
|
||||
"-Dcom.sun.management.config.file=" + rmiRegistrySslFile.toFile().getAbsolutePath());
|
||||
|
||||
if (res != 0) {
|
||||
++failures;
|
||||
}
|
||||
}
|
||||
|
||||
private void test3() throws Exception {
|
||||
|
||||
System.out.println("-------------------------------------------------------------");
|
||||
System.out.println(getClass().getName() + " : SSL RMIRegistry - SSL Lookup");
|
||||
System.out.println("-------------------------------------------------------------");
|
||||
|
||||
int res = doTest("-DtestID=Test3",
|
||||
"-Djavax.net.ssl.keyStore=" + FS.getPath(TEST_SRC, "ssl", "keystore").toFile().getAbsolutePath(),
|
||||
"-Djavax.net.ssl.keyStorePassword=password",
|
||||
"-Djavax.net.ssl.trustStore=" + FS.getPath(TEST_SRC, "ssl", "truststore").toFile().getAbsolutePath(),
|
||||
"-Djavax.net.ssl.trustStorePassword=trustword",
|
||||
"-Dcom.sun.management.config.file=" + rmiRegistrySslFile.toFile().getAbsolutePath());
|
||||
|
||||
if (res != 0) {
|
||||
++failures;
|
||||
}
|
||||
}
|
||||
|
||||
private int doTest(String... args) throws Exception {
|
||||
|
||||
for (int i = 0; i < MAX_GET_FREE_PORT_TRIES; ++i) {
|
||||
|
||||
initTestEnvironment();
|
||||
|
||||
List<String> command = new ArrayList<>();
|
||||
command.addAll(Utils.getVmOptions());
|
||||
command.add("-Dtest.src=" + TEST_SRC);
|
||||
command.add("-Dtest.rmi.port=" + port);
|
||||
command.addAll(Arrays.asList(args));
|
||||
command.add("-cp");
|
||||
command.add(TEST_CLASS_PATH);
|
||||
command.add(className);
|
||||
|
||||
ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder(command.toArray(new String[command.size()]));
|
||||
|
||||
Process p = processBuilder.start();
|
||||
OutputAnalyzer output = new OutputAnalyzer(p);
|
||||
|
||||
System.out.println("test output:");
|
||||
System.out.println(output.getOutput());
|
||||
|
||||
if (!output.getOutput().contains("Exception thrown by the agent : " +
|
||||
"java.rmi.server.ExportException: Port already in use")) {
|
||||
return p.exitValue();
|
||||
}
|
||||
}
|
||||
throw new Error("Cannot find free port");
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
RmiRegistrySslTest test = new RmiRegistrySslTest();
|
||||
|
||||
test.runTest(args);
|
||||
}
|
||||
}
|
||||
|
@ -1,64 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 2005, 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 6228231
|
||||
# @summary Test that RMI registry uses SSL.
|
||||
# @author Luis-Miguel Alventosa
|
||||
# @run clean RmiRegistrySslTest
|
||||
# @run build RmiRegistrySslTest
|
||||
# @run shell/timeout=300 RmiRegistrySslTest.sh
|
||||
|
||||
echo -------------------------------------------------------------
|
||||
echo `basename $0 .sh` : Non SSL RMIRegistry - Non SSL Lookup
|
||||
echo -------------------------------------------------------------
|
||||
|
||||
${TESTJAVA}/bin/java ${TESTVMOPTS} -classpath ${TESTCLASSES} \
|
||||
-Dtest.src=${TESTSRC} \
|
||||
-DtestID=Test1 \
|
||||
-Dcom.sun.management.config.file=${TESTSRC}/rmiregistry.properties \
|
||||
RmiRegistrySslTest || exit $?
|
||||
|
||||
echo -------------------------------------------------------------
|
||||
echo `basename $0 .sh` : SSL RMIRegistry - Non SSL Lookup
|
||||
echo -------------------------------------------------------------
|
||||
|
||||
${TESTJAVA}/bin/java ${TESTVMOPTS} -classpath ${TESTCLASSES} \
|
||||
-Dtest.src=${TESTSRC} \
|
||||
-DtestID=Test2 \
|
||||
-Dcom.sun.management.config.file=${TESTSRC}/rmiregistryssl.properties \
|
||||
RmiRegistrySslTest || exit $?
|
||||
|
||||
echo -------------------------------------------------------------
|
||||
echo `basename $0 .sh` : SSL RMIRegistry - SSL Lookup
|
||||
echo -------------------------------------------------------------
|
||||
|
||||
${TESTJAVA}/bin/java ${TESTVMOPTS} -classpath ${TESTCLASSES} \
|
||||
-Dtest.src=${TESTSRC} \
|
||||
-DtestID=Test3 \
|
||||
-Djavax.net.ssl.keyStore=${TESTSRC}/ssl/keystore \
|
||||
-Djavax.net.ssl.keyStorePassword=password \
|
||||
-Djavax.net.ssl.trustStore=${TESTSRC}/ssl/truststore \
|
||||
-Djavax.net.ssl.trustStorePassword=trustword \
|
||||
-Dcom.sun.management.config.file=${TESTSRC}/rmiregistryssl.properties \
|
||||
RmiRegistrySslTest || exit $?
|
@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 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.rmi.registry.LocateRegistry;
|
||||
import java.rmi.registry.Registry;
|
||||
import javax.rmi.ssl.SslRMIClientSocketFactory;
|
||||
import jdk.testlibrary.Utils;
|
||||
|
||||
|
||||
public class RmiRegistrySslTestApp {
|
||||
|
||||
static final String ok = "OK: Found jmxrmi entry in RMIRegistry!";
|
||||
static final String ko = "KO: Did not find jmxrmi entry in RMIRegistry!";
|
||||
static final String ko2 = "KO: Did not get expected exception!";
|
||||
static final String okException = "OK: Got expected exception!";
|
||||
static final String koException = "KO: Got unexpected exception!";
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
|
||||
System.out.println("RmiRegistry lookup...");
|
||||
|
||||
String testID = System.getProperty("testID");
|
||||
int port = Integer.parseInt(System.getProperty("test.rmi.port"));
|
||||
|
||||
if ("Test1".equals(testID)) {
|
||||
try {
|
||||
Registry registry = LocateRegistry.getRegistry(port);
|
||||
String[] list = registry.list();
|
||||
if ("jmxrmi".equals(list[0])) {
|
||||
System.out.println(ok);
|
||||
} else {
|
||||
System.out.println(ko);
|
||||
throw new IllegalArgumentException(ko);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println(koException);
|
||||
e.printStackTrace(System.out);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
if ("Test2".equals(testID)) {
|
||||
try {
|
||||
Registry registry = LocateRegistry.getRegistry(port);
|
||||
String[] list = registry.list();
|
||||
throw new IllegalArgumentException(ko2);
|
||||
} catch (Exception e) {
|
||||
System.out.println(okException);
|
||||
e.printStackTrace(System.out);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ("Test3".equals(testID)) {
|
||||
try {
|
||||
Registry registry = LocateRegistry.getRegistry(
|
||||
null, port, new SslRMIClientSocketFactory());
|
||||
String[] list = registry.list();
|
||||
if ("jmxrmi".equals(list[0])) {
|
||||
System.out.println(ok);
|
||||
} else {
|
||||
System.out.println(ko);
|
||||
throw new IllegalArgumentException(ko);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println(koException);
|
||||
e.printStackTrace(System.out);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -26,7 +26,11 @@
|
||||
# @bug 6528083
|
||||
# @summary Test RMI Bootstrap with SSL
|
||||
#
|
||||
# @build TestLogger RmiBootstrapTest Utils
|
||||
# @library /lib/testlibrary
|
||||
# @build jdk.testlibrary.Utils
|
||||
# @build TestLogger
|
||||
# @build Utils
|
||||
# @build RmiBootstrapTest
|
||||
# @run shell/timeout=300 RmiSslBootstrapTest.sh
|
||||
|
||||
# Define the Java class test name
|
||||
|
@ -45,8 +45,6 @@ import javax.management.*;
|
||||
|
||||
import sun.management.AgentConfigurationError;
|
||||
|
||||
import util.TestLogger;
|
||||
|
||||
/**
|
||||
* <p>This class implements unit test for RMI Bootstrap.
|
||||
* When called with no arguments main() looks in the directory indicated
|
||||
|
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 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.IOException;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @library /lib/testlibrary
|
||||
* @bug 6557093
|
||||
* @bug 6557093
|
||||
* @build jdk.testlibrary.Utils
|
||||
* @build jdk.testlibrary.ProcessTools
|
||||
* @build jdk.testlibrary.OutputAnalyzer
|
||||
* @build Dummy
|
||||
* @build AbstractFilePermissionTest
|
||||
* @summary Check SSL config file permission for out-of-the-box management
|
||||
* @run main/timeout=300 SSLConfigFilePermissionTest
|
||||
*
|
||||
* @author Taras Ledkov
|
||||
*/
|
||||
public class SSLConfigFilePermissionTest extends AbstractFilePermissionTest {
|
||||
|
||||
private final String TEST_SRC = System.getProperty("test.src");
|
||||
|
||||
private SSLConfigFilePermissionTest() {
|
||||
super("jmxremote.ssl.config");
|
||||
}
|
||||
|
||||
public void testSetup() throws IOException {
|
||||
createFile(mgmt,
|
||||
"# management.properties",
|
||||
"com.sun.management.jmxremote.authenticate=false",
|
||||
"com.sun.management.jmxremote.ssl.config.file=" + file2PermissionTest.toFile().getAbsolutePath());
|
||||
|
||||
createFile(file2PermissionTest,
|
||||
"# management.properties",
|
||||
"javax.net.ssl.keyStore = " +
|
||||
FS.getPath(TEST_SRC, "ssl", "keystore").toFile().getAbsolutePath(),
|
||||
"javax.net.ssl.keyStorePassword = password");
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
SSLConfigFilePermissionTest test = new SSLConfigFilePermissionTest();
|
||||
|
||||
test.runTest(args);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,128 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright (c) 2007, 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 6557093
|
||||
# @summary Check SSL config file permission for out-of-the-box management
|
||||
#
|
||||
# @run shell SSLConfigFilePermissionTest.sh
|
||||
|
||||
createJavaFile()
|
||||
{
|
||||
cat << EOF > $1/$2.java
|
||||
class $2 {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Inside main method...");
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
createManagementConfigFile() {
|
||||
cat << EOF > $1
|
||||
# management.properties
|
||||
com.sun.management.jmxremote.authenticate=false
|
||||
com.sun.management.jmxremote.ssl.config.file=$2
|
||||
EOF
|
||||
}
|
||||
|
||||
createSSLConfigFile() {
|
||||
if [ -f "$1" ] ; then
|
||||
rm -f $1 || echo WARNING: $1 already exists - unable to remove old copy
|
||||
fi
|
||||
cat << EOF > $1
|
||||
javax.net.ssl.keyStore=$2
|
||||
javax.net.ssl.keyStorePassword=password
|
||||
EOF
|
||||
}
|
||||
|
||||
# Check we are run from jtreg
|
||||
if [ -z "${TESTCLASSES}" ]; then
|
||||
echo "Test is designed to be run from jtreg only"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Test not suitable for Windows as chmod may not be able to
|
||||
# security the password file.
|
||||
|
||||
os=`uname -s`
|
||||
if [ "$os" != "Linux" -a "$os" != "SunOS" ]; then
|
||||
echo "Test not designed to run on this operating system, skipping..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Create management and SSL configuration files
|
||||
|
||||
LIBDIR=${TESTCLASSES}/lib
|
||||
MGMT=${LIBDIR}/management.properties
|
||||
SSL=${LIBDIR}/jmxremote.ssl.config
|
||||
rm -f ${MGMT}
|
||||
rm -f ${SSL}
|
||||
mkdir ${LIBDIR} 2>&1
|
||||
createJavaFile ${TESTCLASSES} Dummy
|
||||
createManagementConfigFile ${MGMT} ${SSL}
|
||||
createSSLConfigFile ${SSL} ${TESTSRC}/ssl/keystore
|
||||
|
||||
# Compile test
|
||||
|
||||
${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d ${TESTCLASSES} ${TESTCLASSES}/Dummy.java
|
||||
|
||||
JAVA=${TESTJAVA}/bin/java
|
||||
CLASSPATH=${TESTCLASSES}
|
||||
export CLASSPATH
|
||||
|
||||
failures=0
|
||||
|
||||
mp=-Dcom.sun.management.config.file=${MGMT}
|
||||
pp=-Dcom.sun.management.jmxremote.port=4999
|
||||
|
||||
go() {
|
||||
echo ''
|
||||
sh -xc "$JAVA ${TESTVMOPTS} $1 $2 $3 $4 $5 $6 $7 $8" 2>&1
|
||||
if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
|
||||
}
|
||||
|
||||
# Test 1 - SSL config file is secure - VM should start
|
||||
chmod 700 ${SSL}
|
||||
sh -xc "$JAVA ${TESTVMOPTS} $mp $pp Dummy" 2>&1
|
||||
if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
|
||||
|
||||
# Test 2 - SSL config file is not secure - VM should fail to start
|
||||
chmod o+rx ${SSL}
|
||||
sh -xc "$JAVA ${TESTVMOPTS} $mp $pp Dummy" 2>&1
|
||||
if [ $? = 0 ]; then failures=`expr $failures + 1`; fi
|
||||
|
||||
# Reset the file permissions on the generated SSL config file
|
||||
chmod 777 ${SSL}
|
||||
|
||||
#
|
||||
# Results
|
||||
#
|
||||
echo ''
|
||||
if [ $failures -gt 0 ];
|
||||
then echo "$failures test(s) failed";
|
||||
else echo "All test(s) passed"; fi
|
||||
exit $failures
|
@ -20,7 +20,6 @@
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package util;
|
||||
|
||||
import java.util.logging.Logger;
|
||||
import java.util.logging.Level;
|
||||
|
@ -24,7 +24,7 @@
|
||||
# ################ Management Agent Port #########################
|
||||
#
|
||||
# For setting the JMX RMI agent port use the following line
|
||||
com.sun.management.jmxremote.port=4444
|
||||
com.sun.management.jmxremote.port=${getFreePort}
|
||||
#
|
||||
# For setting the SNMP agent port use the following line
|
||||
# com.sun.management.snmp.port=<port-number>
|
||||
|
@ -24,7 +24,7 @@
|
||||
# ################ Management Agent Port #########################
|
||||
#
|
||||
# For setting the JMX RMI agent port use the following line
|
||||
com.sun.management.jmxremote.port=4444
|
||||
com.sun.management.jmxremote.port=${getFreePort}
|
||||
#
|
||||
# For setting the SNMP agent port use the following line
|
||||
# com.sun.management.snmp.port=<port-number>
|
||||
|
Loading…
x
Reference in New Issue
Block a user