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
|
# jdk_management
|
||||||
|
|
||||||
# 8028150
|
|
||||||
sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh windows-all
|
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
|
|
||||||
# jdk_jmx
|
# jdk_jmx
|
||||||
|
@ -25,9 +25,9 @@
|
|||||||
# No need to compile (now done by JTReg tags in calling file)
|
# No need to compile (now done by JTReg tags in calling file)
|
||||||
#
|
#
|
||||||
echo ${TESTJAVA}/bin/java ${TESTVMOPTS} -Dtest.src=${TESTCLASSES} \
|
echo ${TESTJAVA}/bin/java ${TESTVMOPTS} -Dtest.src=${TESTCLASSES} \
|
||||||
-classpath ${TESTCLASSES} $* || exit 20
|
-classpath ${TESTCLASSPATH} $* || exit 20
|
||||||
|
|
||||||
${TESTJAVA}/bin/java ${TESTVMOPTS} -Dtest.src=${TESTCLASSES} \
|
${TESTJAVA}/bin/java ${TESTVMOPTS} -Dtest.src=${TESTCLASSES} \
|
||||||
-classpath ${TESTCLASSES} $* || exit 20
|
-classpath ${TESTCLASSPATH} $* || exit 20
|
||||||
|
|
||||||
exit 0
|
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.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.nio.file.FileSystem;
|
import java.nio.file.FileSystem;
|
||||||
@ -32,7 +33,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import jdk.testlibrary.ProcessTools;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @test
|
* @test
|
||||||
@ -43,15 +43,25 @@ import jdk.testlibrary.ProcessTools;
|
|||||||
* TestManager will attempt a connection to the address obtained from
|
* TestManager will attempt a connection to the address obtained from
|
||||||
* both agent properties and jvmstat buffer.
|
* both agent properties and jvmstat buffer.
|
||||||
* @build jdk.testlibrary.ProcessTools
|
* @build jdk.testlibrary.ProcessTools
|
||||||
|
* @build jdk.testlibrary.Utils
|
||||||
* @build TestManager TestApplication
|
* @build TestManager TestApplication
|
||||||
* @run main/othervm/timeout=300 -XX:+UsePerfData LocalManagementTest
|
* @run main/othervm/timeout=300 -XX:+UsePerfData LocalManagementTest
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import jdk.testlibrary.ProcessTools;
|
||||||
|
import jdk.testlibrary.Utils;
|
||||||
|
|
||||||
public class LocalManagementTest {
|
public class LocalManagementTest {
|
||||||
private static final String TEST_CLASSPATH = System.getProperty("test.class.path");
|
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_JDK = System.getProperty("test.jdk");
|
||||||
|
private static int MAX_GET_FREE_PORT_TRIES = 10;
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
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;
|
int failures = 0;
|
||||||
for(Method m : LocalManagementTest.class.getDeclaredMethods()) {
|
for(Method m : LocalManagementTest.class.getDeclaredMethods()) {
|
||||||
if (Modifier.isStatic(m.getModifiers()) &&
|
if (Modifier.isStatic(m.getModifiers()) &&
|
||||||
@ -103,29 +113,49 @@ public class LocalManagementTest {
|
|||||||
private static boolean test4() throws Exception {
|
private static boolean test4() throws Exception {
|
||||||
Path agentPath = findAgent();
|
Path agentPath = findAgent();
|
||||||
if (agentPath != null) {
|
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;
|
for (int i = 0; i < MAX_GET_FREE_PORT_TRIES; ++i) {
|
||||||
try {
|
ProcessBuilder builder = ProcessTools.createJavaProcessBuilder(
|
||||||
prc = ProcessTools.startProcess(
|
"-javaagent:" + agentPath.toString() +
|
||||||
"TestApplication",
|
"=com.sun.management.jmxremote.port=" + Utils.getFreePort() + "," +
|
||||||
builder
|
"com.sun.management.jmxremote.authenticate=false," +
|
||||||
|
"com.sun.management.jmxremote.ssl=false",
|
||||||
|
"-cp",
|
||||||
|
TEST_CLASSPATH,
|
||||||
|
"TestApplication",
|
||||||
|
"-exit"
|
||||||
);
|
);
|
||||||
int exitCode = prc.waitFor();
|
|
||||||
return exitCode == 0;
|
Process prc = null;
|
||||||
} finally {
|
final AtomicReference<Boolean> isBindExceptionThrown = new AtomicReference<>();
|
||||||
if (prc != null) {
|
isBindExceptionThrown.set(new Boolean(false));
|
||||||
prc.destroy();
|
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();
|
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.FilenameFilter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.BindException;
|
import java.net.BindException;
|
||||||
import java.net.ServerSocket;
|
|
||||||
import java.rmi.server.ExportException;
|
import java.rmi.server.ExportException;
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
@ -43,8 +42,6 @@ import javax.management.*;
|
|||||||
|
|
||||||
import sun.management.AgentConfigurationError;
|
import sun.management.AgentConfigurationError;
|
||||||
|
|
||||||
import util.TestLogger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>This class implements unit test for RMI Bootstrap.
|
* <p>This class implements unit test for RMI Bootstrap.
|
||||||
* When called with no arguments main() looks in the directory indicated
|
* When called with no arguments main() looks in the directory indicated
|
||||||
@ -71,17 +68,10 @@ import util.TestLogger;
|
|||||||
**/
|
**/
|
||||||
public class RmiBootstrapTest {
|
public class RmiBootstrapTest {
|
||||||
// the number of consecutive ports to test for availability
|
// 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 =
|
static TestLogger log =
|
||||||
new TestLogger("RmiBootstrapTest");
|
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.
|
* Default values for RMI configuration properties.
|
||||||
**/
|
**/
|
||||||
@ -627,92 +617,100 @@ public class RmiBootstrapTest {
|
|||||||
* eventually cleans up by calling ConnectorBootstrap.terminate().
|
* eventually cleans up by calling ConnectorBootstrap.terminate().
|
||||||
* @return null if the test succeeds, an error message otherwise.
|
* @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;
|
for (int i = 0; i < MAX_GET_FREE_PORT_TRIES; i++) {
|
||||||
try {
|
try {
|
||||||
path=(file==null)?null:file.getCanonicalPath();
|
int port = jdk.testlibrary.Utils.getFreePort();
|
||||||
} catch(IOException x) {
|
final String path;
|
||||||
final String err = "Failed to test configuration " + file +
|
try {
|
||||||
": " + x;
|
path=(file==null)?null:file.getCanonicalPath();
|
||||||
log.trace("testConfiguration",err);
|
} catch(IOException x) {
|
||||||
log.debug("testConfiguration",x);
|
final String err = "Failed to test configuration " + file +
|
||||||
return err;
|
": " + x;
|
||||||
}
|
log.trace("testConfiguration",err);
|
||||||
final String config = (path==null)?"Default config file":path;
|
log.debug("testConfiguration",x);
|
||||||
|
return err;
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
}
|
final String config = (path==null)?"Default config file":path;
|
||||||
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 {
|
System.out.println("***");
|
||||||
JMXServiceURL url =
|
System.out.println("*** Testing configuration (port=" + port + "): "
|
||||||
new JMXServiceURL("rmi",null,0,"/jndi/rmi://localhost:"+
|
+ path);
|
||||||
port+"/jmxrmi");
|
System.out.println("***");
|
||||||
|
|
||||||
try {
|
System.setProperty("com.sun.management.jmxremote.port",
|
||||||
testCommunication(url);
|
Integer.toString(port));
|
||||||
} catch (Exception x) {
|
if (path != null)
|
||||||
final String err = "Failed to connect to agent {url="+url+
|
System.setProperty("com.sun.management.config.file", path);
|
||||||
"}: " + x;
|
else
|
||||||
log.trace("testConfiguration",err);
|
System.getProperties().remove("com.sun.management.config.file");
|
||||||
log.debug("testConfiguration",x);
|
|
||||||
return err;
|
log.trace("testConfiguration","com.sun.management.jmxremote.port="+port);
|
||||||
}
|
if (path != null && log.isDebugOn())
|
||||||
} catch (Exception x) {
|
log.trace("testConfiguration",
|
||||||
final String err = "Failed to test configuration "+config+
|
"com.sun.management.config.file="+path);
|
||||||
": "+x;
|
|
||||||
log.trace("testConfiguration",err);
|
checkSslConfiguration();
|
||||||
log.debug("testConfiguration",x);
|
|
||||||
return err;
|
final JMXConnectorServer cs;
|
||||||
} finally {
|
try {
|
||||||
try {
|
cs = ConnectorBootstrap.initialize();
|
||||||
cs.stop();
|
} catch (AgentConfigurationError x) {
|
||||||
} catch (Exception x) {
|
if (x.getCause() instanceof ExportException) {
|
||||||
final String err = "Failed to terminate: "+x;
|
if (x.getCause().getCause() instanceof BindException) {
|
||||||
log.trace("testConfiguration",err);
|
throw (BindException)x.getCause().getCause();
|
||||||
log.debug("testConfiguration",x);
|
}
|
||||||
|
}
|
||||||
|
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");
|
System.err.println("Cannot find a free port after " + MAX_GET_FREE_PORT_TRIES + " tries");
|
||||||
return null;
|
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.
|
* The test is assumed to have succeeded if the bootstrap fails.
|
||||||
* @return null if the test succeeds, an error message otherwise.
|
* @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;
|
String errStr = null;
|
||||||
for (int i = 0; i < PORT_TEST_LEN; i++) {
|
errStr = testConfiguration(conf);
|
||||||
try {
|
|
||||||
errStr = testConfiguration(conf,port+testPort++);
|
|
||||||
break;
|
|
||||||
} catch (BindException e) {
|
|
||||||
// port conflict; try another port
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (errStr == null) {
|
if (errStr == null) {
|
||||||
return "Configuration " +
|
return "Configuration " +
|
||||||
conf + " should have failed!";
|
conf + " should have failed!";
|
||||||
}
|
}
|
||||||
System.out.println("Configuration " +
|
System.out.println("Configuration " +
|
||||||
conf + " failed as expected");
|
conf + " failed as expected");
|
||||||
log.debug("runko","Error was: " + errStr);
|
log.debug("runko", "Error was: " + errStr);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -747,26 +738,16 @@ public class RmiBootstrapTest {
|
|||||||
* *ko.properties: bootstrap or connection should fail.
|
* *ko.properties: bootstrap or connection should fail.
|
||||||
* @return null if the test succeeds, an error message otherwise.
|
* @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);
|
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")) {
|
if (fileName.endsWith("ok.properties")) {
|
||||||
String errStr = null;
|
String errStr = null;
|
||||||
for (int i = 0; i < PORT_TEST_LEN; i++) {
|
errStr = testConfiguration(file);
|
||||||
try {
|
return errStr;
|
||||||
errStr = testConfiguration(file,port+testPort++);
|
|
||||||
return errStr;
|
|
||||||
} catch (BindException e) {
|
|
||||||
// port conflict; try another port
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "Can not locate available port";
|
|
||||||
}
|
}
|
||||||
if (fileName.endsWith("ko.properties")) {
|
if (fileName.endsWith("ko.properties")) {
|
||||||
return testConfigurationKo(file,port+testPort++);
|
return testConfigurationKo(file);
|
||||||
}
|
}
|
||||||
return fileName +
|
return fileName +
|
||||||
": test file suffix must be one of [ko|ok].properties";
|
": test file suffix must be one of [ko|ok].properties";
|
||||||
@ -777,17 +758,14 @@ public class RmiBootstrapTest {
|
|||||||
* (see findConfigurationFilesKo() and testConfigurationKo())
|
* (see findConfigurationFilesKo() and testConfigurationKo())
|
||||||
* @throws RuntimeException if the test fails.
|
* @throws RuntimeException if the test fails.
|
||||||
**/
|
**/
|
||||||
public void runko() {
|
public void runko() throws InterruptedException, IOException {
|
||||||
final String portStr = System.getProperty("rmi.port",null);
|
|
||||||
final int port = portStr != null ?
|
|
||||||
Integer.parseInt(portStr) : basePort;
|
|
||||||
final File[] conf = findConfigurationFilesKo();
|
final File[] conf = findConfigurationFilesKo();
|
||||||
if ((conf == null)||(conf.length == 0))
|
if ((conf == null)||(conf.length == 0))
|
||||||
throw new RuntimeException("No configuration found");
|
throw new RuntimeException("No configuration found");
|
||||||
|
|
||||||
String errStr;
|
String errStr;
|
||||||
for (int i=0;i<conf.length;i++) {
|
for (int i=0;i<conf.length;i++) {
|
||||||
errStr = testConfigurationKo(conf[i],port+testPort++);
|
errStr = testConfigurationKo(conf[i]);
|
||||||
if (errStr != null) {
|
if (errStr != null) {
|
||||||
throw new RuntimeException(errStr);
|
throw new RuntimeException(errStr);
|
||||||
}
|
}
|
||||||
@ -800,24 +778,14 @@ public class RmiBootstrapTest {
|
|||||||
* (see findConfigurationFilesOk() and testConfiguration())
|
* (see findConfigurationFilesOk() and testConfiguration())
|
||||||
* @throws RuntimeException if the test fails.
|
* @throws RuntimeException if the test fails.
|
||||||
**/
|
**/
|
||||||
public void runok() {
|
public void runok() throws InterruptedException, IOException {
|
||||||
final String portStr = System.getProperty("rmi.port",null);
|
|
||||||
final int port = portStr != null ?
|
|
||||||
Integer.parseInt(portStr) : basePort;
|
|
||||||
final File[] conf = findConfigurationFilesOk();
|
final File[] conf = findConfigurationFilesOk();
|
||||||
if ((conf == null)||(conf.length == 0))
|
if ((conf == null)||(conf.length == 0))
|
||||||
throw new RuntimeException("No configuration found");
|
throw new RuntimeException("No configuration found");
|
||||||
|
|
||||||
String errStr = null;
|
String errStr = null;
|
||||||
for (int i=0;i<conf.length;i++) {
|
for (int i=0;i<conf.length;i++) {
|
||||||
for (int j = 0; j < PORT_TEST_LEN; i++) {
|
errStr = testConfiguration(conf[i]);
|
||||||
try {
|
|
||||||
errStr = testConfiguration(conf[i],port+testPort++);
|
|
||||||
break;
|
|
||||||
} catch (BindException e) {
|
|
||||||
// port conflict; try another port
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (errStr != null) {
|
if (errStr != null) {
|
||||||
throw new RuntimeException(errStr);
|
throw new RuntimeException(errStr);
|
||||||
}
|
}
|
||||||
@ -840,7 +808,7 @@ public class RmiBootstrapTest {
|
|||||||
* (see runko() and runok()).
|
* (see runko() and runok()).
|
||||||
* @throws RuntimeException if the test fails.
|
* @throws RuntimeException if the test fails.
|
||||||
**/
|
**/
|
||||||
public void run() {
|
public void run() throws InterruptedException, IOException {
|
||||||
runok();
|
runok();
|
||||||
runko();
|
runko();
|
||||||
}
|
}
|
||||||
@ -854,7 +822,7 @@ public class RmiBootstrapTest {
|
|||||||
* indicated by the System property "test.src".
|
* indicated by the System property "test.src".
|
||||||
* @throws RuntimeException if the test fails.
|
* @throws RuntimeException if the test fails.
|
||||||
**/
|
**/
|
||||||
public void run(String args[]) {
|
public void run(String args[]) throws InterruptedException, IOException {
|
||||||
if (args.length == 0) {
|
if (args.length == 0) {
|
||||||
run() ; return;
|
run() ; return;
|
||||||
}
|
}
|
||||||
@ -871,7 +839,11 @@ public class RmiBootstrapTest {
|
|||||||
* exit(1) if the test fails.
|
* exit(1) if the test fails.
|
||||||
**/
|
**/
|
||||||
public static void main(String args[]) throws Exception {
|
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();
|
RmiBootstrapTest manager = new RmiBootstrapTest();
|
||||||
try {
|
try {
|
||||||
manager.run(args);
|
manager.run(args);
|
||||||
@ -886,9 +858,4 @@ public class RmiBootstrapTest {
|
|||||||
System.out.println("**** Test RmiBootstrap Passed ****");
|
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
|
# @bug 6528083
|
||||||
# @summary Test RMI Bootstrap
|
# @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
|
# @run shell/timeout=300 RmiBootstrapTest.sh
|
||||||
|
|
||||||
# Define the Java class test name
|
# 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.
|
* 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
|
||||||
@ -21,69 +21,193 @@
|
|||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.rmi.registry.LocateRegistry;
|
import jdk.testlibrary.OutputAnalyzer;
|
||||||
import java.rmi.registry.Registry;
|
import jdk.testlibrary.ProcessTools;
|
||||||
import javax.rmi.ssl.SslRMIClientSocketFactory;
|
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 {
|
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!";
|
private final Path libDir = FS.getPath(TEST_CLASSES, "lib");
|
||||||
static final String ko = "KO: Did not find jmxrmi entry in RMIRegistry!";
|
private final Path rmiRegistryTemplate = FS.getPath(TEST_SRC, "rmiregistry.properties");
|
||||||
static final String ko2 = "KO: Did not get expected exception!";
|
private final Path rmiRegistrySslTemplate = FS.getPath(TEST_SRC, "rmiregistryssl.properties");
|
||||||
static final String okException = "OK: Got expected exception!";
|
private final Path rmiRegistryFile = libDir.resolve("rmiregistry.properties");
|
||||||
static final String koException = "KO: Got unexpected exception!";
|
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 {
|
try {
|
||||||
Registry registry = LocateRegistry.getRegistry(4444);
|
Files.delete(out);
|
||||||
String[] list = registry.list();
|
} catch (Exception ex) {
|
||||||
if ("jmxrmi".equals(list[0])) {
|
System.out.println("WARNING: " + out.toFile().getAbsolutePath() + " already exists - unable to remove old copy");
|
||||||
System.out.println(ok);
|
ex.printStackTrace();
|
||||||
} 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 (BufferedReader br = Files.newBufferedReader(template, Charset.defaultCharset());
|
||||||
try {
|
BufferedWriter bw = Files.newBufferedWriter(out, Charset.defaultCharset())) {
|
||||||
Registry registry = LocateRegistry.getRegistry(4444);
|
String line;
|
||||||
String[] list = registry.list();
|
while ((line = br.readLine()) != null) {
|
||||||
throw new IllegalArgumentException(ko2);
|
if (model != null) {
|
||||||
} catch (Exception e) {
|
for (Map.Entry<String, Object> macro : model.entrySet()) {
|
||||||
System.out.println(okException);
|
line = line.replaceAll(Pattern.quote(macro.getKey()), macro.getValue().toString());
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
|
||||||
System.out.println(koException);
|
bw.write(line, 0, line.length());
|
||||||
e.printStackTrace(System.out);
|
bw.newLine();
|
||||||
throw e;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
# @bug 6528083
|
||||||
# @summary Test RMI Bootstrap with SSL
|
# @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
|
# @run shell/timeout=300 RmiSslBootstrapTest.sh
|
||||||
|
|
||||||
# Define the Java class test name
|
# Define the Java class test name
|
||||||
|
@ -45,8 +45,6 @@ import javax.management.*;
|
|||||||
|
|
||||||
import sun.management.AgentConfigurationError;
|
import sun.management.AgentConfigurationError;
|
||||||
|
|
||||||
import util.TestLogger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>This class implements unit test for RMI Bootstrap.
|
* <p>This class implements unit test for RMI Bootstrap.
|
||||||
* When called with no arguments main() looks in the directory indicated
|
* 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
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
package util;
|
|
||||||
|
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
# ################ Management Agent Port #########################
|
# ################ Management Agent Port #########################
|
||||||
#
|
#
|
||||||
# For setting the JMX RMI agent port use the following line
|
# 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
|
# For setting the SNMP agent port use the following line
|
||||||
# com.sun.management.snmp.port=<port-number>
|
# com.sun.management.snmp.port=<port-number>
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
# ################ Management Agent Port #########################
|
# ################ Management Agent Port #########################
|
||||||
#
|
#
|
||||||
# For setting the JMX RMI agent port use the following line
|
# 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
|
# For setting the SNMP agent port use the following line
|
||||||
# com.sun.management.snmp.port=<port-number>
|
# com.sun.management.snmp.port=<port-number>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user