提交 24eba4bc 编写于 作者: J jbachorik

8027058: sun/management/jmxremote/bootstrap/RmiBootstrapTest.sh Failed to initialize connector

Summary: Dynamically discover the first available port instead of hard-coding one
Reviewed-by: sla, chegar, dfuchs
上级 bf49f4a8
/* /*
* Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 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
...@@ -24,14 +24,15 @@ import sun.management.jmxremote.ConnectorBootstrap; ...@@ -24,14 +24,15 @@ import sun.management.jmxremote.ConnectorBootstrap;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.InputStream;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.io.IOException; import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.rmi.server.ExportException;
import java.util.Properties; import java.util.Properties;
import java.util.Iterator; import java.util.Iterator;
import java.util.Set; import java.util.Set;
import java.util.Arrays;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
...@@ -54,7 +55,7 @@ import util.TestLogger; ...@@ -54,7 +55,7 @@ import util.TestLogger;
* bootstrap & connection test will fail.</p> * bootstrap & connection test will fail.</p>
* *
* <p>The rmi port number can be specified with the "rmi.port" system property. * <p>The rmi port number can be specified with the "rmi.port" system property.
* If not, this test will use 12424</p> * If not, this test will use the first available port</p>
* *
* <p>When called with some argument, the main() will interprete its args to * <p>When called with some argument, the main() will interprete its args to
* be Java M&M configuration file names. The filenames are expected to end * be Java M&M configuration file names. The filenames are expected to end
...@@ -69,7 +70,8 @@ import util.TestLogger; ...@@ -69,7 +70,8 @@ import util.TestLogger;
* <p>Debug traces are logged in "sun.management.test"</p> * <p>Debug traces are logged in "sun.management.test"</p>
**/ **/
public class RmiBootstrapTest { public class RmiBootstrapTest {
// the number of consecutive ports to test for availability
private static final int PORT_TEST_LEN = 800;
static TestLogger log = static TestLogger log =
new TestLogger("RmiBootstrapTest"); new TestLogger("RmiBootstrapTest");
...@@ -78,6 +80,7 @@ public class RmiBootstrapTest { ...@@ -78,6 +80,7 @@ public class RmiBootstrapTest {
* to avoid falling into "port number already in use" problems. * to avoid falling into "port number already in use" problems.
**/ **/
static int testPort = 0; static int testPort = 0;
static int basePort = 0;
/** /**
* Default values for RMI configuration properties. * Default values for RMI configuration properties.
...@@ -624,7 +627,7 @@ public class RmiBootstrapTest { ...@@ -624,7 +627,7 @@ 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) { private String testConfiguration(File file,int port) throws BindException {
final String path; final String path;
try { try {
...@@ -661,6 +664,11 @@ public class RmiBootstrapTest { ...@@ -661,6 +664,11 @@ public class RmiBootstrapTest {
try { try {
cs = ConnectorBootstrap.initialize(); cs = ConnectorBootstrap.initialize();
} catch (AgentConfigurationError x) { } 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:" + final String err = "Failed to initialize connector:" +
"\n\tcom.sun.management.jmxremote.port=" + port + "\n\tcom.sun.management.jmxremote.port=" + port +
((path!=null)?"\n\tcom.sun.management.config.file="+path: ((path!=null)?"\n\tcom.sun.management.config.file="+path:
...@@ -713,7 +721,15 @@ public class RmiBootstrapTest { ...@@ -713,7 +721,15 @@ public class RmiBootstrapTest {
* @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,int port) {
final String errStr = testConfiguration(conf,port+testPort++); 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
}
}
if (errStr == null) { if (errStr == null) {
return "Configuration " + return "Configuration " +
conf + " should have failed!"; conf + " should have failed!";
...@@ -733,11 +749,21 @@ public class RmiBootstrapTest { ...@@ -733,11 +749,21 @@ public class RmiBootstrapTest {
**/ **/
private String testConfigurationFile(String fileName) { private String testConfigurationFile(String fileName) {
File file = new File(fileName); File file = new File(fileName);
final String portStr = System.getProperty("rmi.port","12424"); final String portStr = System.getProperty("rmi.port",null);
final int port = Integer.parseInt(portStr); final int port = portStr != null ?
Integer.parseInt(portStr) : basePort;
if (fileName.endsWith("ok.properties")) { if (fileName.endsWith("ok.properties")) {
return testConfiguration(file,port+testPort++); 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";
} }
if (fileName.endsWith("ko.properties")) { if (fileName.endsWith("ko.properties")) {
return testConfigurationKo(file,port+testPort++); return testConfigurationKo(file,port+testPort++);
...@@ -752,8 +778,9 @@ public class RmiBootstrapTest { ...@@ -752,8 +778,9 @@ public class RmiBootstrapTest {
* @throws RuntimeException if the test fails. * @throws RuntimeException if the test fails.
**/ **/
public void runko() { public void runko() {
final String portStr = System.getProperty("rmi.port","12424"); final String portStr = System.getProperty("rmi.port",null);
final int port = Integer.parseInt(portStr); 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");
...@@ -774,15 +801,23 @@ public class RmiBootstrapTest { ...@@ -774,15 +801,23 @@ public class RmiBootstrapTest {
* @throws RuntimeException if the test fails. * @throws RuntimeException if the test fails.
**/ **/
public void runok() { public void runok() {
final String portStr = System.getProperty("rmi.port","12424"); final String portStr = System.getProperty("rmi.port",null);
final int port = Integer.parseInt(portStr); 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; 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++) {
try {
errStr = testConfiguration(conf[i],port+testPort++); 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);
} }
...@@ -835,7 +870,8 @@ public class RmiBootstrapTest { ...@@ -835,7 +870,8 @@ public class RmiBootstrapTest {
* Calls run(args[]). * Calls run(args[]).
* exit(1) if the test fails. * exit(1) if the test fails.
**/ **/
public static void main(String args[]) { public static void main(String args[]) throws Exception {
setupBasePort();
RmiBootstrapTest manager = new RmiBootstrapTest(); RmiBootstrapTest manager = new RmiBootstrapTest();
try { try {
manager.run(args); manager.run(args);
...@@ -850,4 +886,9 @@ public class RmiBootstrapTest { ...@@ -850,4 +886,9 @@ 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;
}
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册