Merged branch 'jetty-9.4.x' into 'master'.

This commit is contained in:
Simone Bordet 2017-05-02 11:29:35 +02:00
commit 46a53b8a9b
6 changed files with 166 additions and 120 deletions

View File

@ -192,8 +192,14 @@ Examples:
[source, screen, subs="{sub-order}"]
----
service:jmx:rmi:///jndi/rmi:///jmxrmi
rmi_server_host = any address
rmi_server_host = local host address
rmi_server_port = randomly chosen
rmi_registry_host = local host address
rmi_registry_port = 1099
service:jmx:rmi://0.0.0.0:1099/jndi/rmi://0.0.0.0:1099/jmxrmi
rmi_server_host = any address
rmi_server_port = 1099
rmi_registry_host = any address
rmi_registry_port = 1099

View File

@ -95,6 +95,7 @@
<appendOutput>false</appendOutput>
<outputFile>${project.build.directory}/deps.txt</outputFile>
<sort>true</sort>
<excludeGroupIds>org.eclipse.jetty</excludeGroupIds>
<prependGroupId>true</prependGroupId>
<includeScope>runtime</includeScope>
</configuration>

View File

@ -232,7 +232,7 @@ public class ConnectorServer extends AbstractLifeCycle
@Override
public ServerSocket createServerSocket(int port) throws IOException
{
InetAddress address = _host == null || _host.isEmpty() ? null : InetAddress.getByName(_host);
InetAddress address = _host == null || _host.isEmpty() ? InetAddress.getLocalHost() : InetAddress.getByName(_host);
ServerSocket server = createServerSocket(address, port);
_portConsumer.accept(server.getLocalPort());
return server;

View File

@ -73,42 +73,63 @@ public class ConnectorServerTest
}
@Test
public void testNoRegistryHostBindsToAny() throws Exception
public void testNoRegistryHostBindsToHost() throws Exception
{
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi:///jmxrmi"), objectName);
connectorServer.start();
// Verify that I can connect to the RMI registry using a non-loopback address.
new Socket(InetAddress.getLocalHost(), 1099).close();
// Verify that I can connect to the RMI registry using the loopback address.
new Socket(InetAddress.getLoopbackAddress(), 1099).close();
try
{
// Verify that I cannot connect to the RMI registry using the loopback address.
new Socket(InetAddress.getLoopbackAddress(), 1099).close();
Assert.fail();
}
catch (ConnectException ignored)
{
// Ignored.
}
}
@Test
public void testNoRegistryHostNonDefaultRegistryPort() throws Exception
{
int registryPort = 1299;
ServerSocket serverSocket = new ServerSocket(0);
int registryPort = serverSocket.getLocalPort();
serverSocket.close();
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:" + registryPort + "/jmxrmi"), objectName);
connectorServer.start();
// Verify that I can connect to the RMI registry using a non-loopback address.
new Socket(InetAddress.getLocalHost(), registryPort).close();
try
{
// Verify that I cannot connect to the RMI registry using the loopback address.
new Socket(InetAddress.getLoopbackAddress(), registryPort).close();
Assert.fail();
}
catch (ConnectException ignored)
{
// Ignored.
}
}
@Test
public void testAnyRegistryHostBindsToAny() throws Exception
{
ServerSocket serverSocket = new ServerSocket(0);
int registryPort = serverSocket.getLocalPort();
serverSocket.close();
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://0.0.0.0:" + registryPort + "/jmxrmi"), objectName);
connectorServer.start();
// Verify that I can connect to the RMI registry using a non-loopback address.
new Socket(InetAddress.getLocalHost(), registryPort).close();
// Verify that I can connect to the RMI registry using the loopback address.
new Socket(InetAddress.getLoopbackAddress(), registryPort).close();
}
@Test
public void testNoRMIHostBindsToAny() throws Exception
{
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi:///jmxrmi"), objectName);
connectorServer.start();
// Verify that I can connect to the RMI server using a non-loopback address.
new Socket(InetAddress.getLocalHost(), connectorServer.getAddress().getPort()).close();
// Verify that I can connect to the RMI server using the loopback address.
new Socket(InetAddress.getLoopbackAddress(), connectorServer.getAddress().getPort()).close();
}
@Test
public void testLocalhostRegistryBindsToLoopback() throws Exception
{
@ -134,6 +155,38 @@ public class ConnectorServerTest
new Socket(loopback, 1099).close();
}
@Test
public void testNoRMIHostBindsToHost() throws Exception
{
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi:///jmxrmi"), objectName);
connectorServer.start();
// Verify that I can connect to the RMI server using a non-loopback address.
new Socket(InetAddress.getLocalHost(), connectorServer.getAddress().getPort()).close();
try
{
// Verify that I cannot connect to the RMI server using the loopback address.
new Socket(InetAddress.getLoopbackAddress(), connectorServer.getAddress().getPort()).close();
Assert.fail();
}
catch (ConnectException ignored)
{
// Ignored.
}
}
@Test
public void testAnyRMIHostBindsToAny() throws Exception
{
connectorServer = new ConnectorServer(new JMXServiceURL("service:jmx:rmi://0.0.0.0/jndi/rmi:///jmxrmi"), objectName);
connectorServer.start();
// Verify that I can connect to the RMI server using a non-loopback address.
new Socket(InetAddress.getLocalHost(), connectorServer.getAddress().getPort()).close();
// Verify that I can connect to the RMI server using the loopback address.
new Socket(InetAddress.getLoopbackAddress(), connectorServer.getAddress().getPort()).close();
}
@Test
public void testLocalhostRMIBindsToLoopback() throws Exception
{
@ -187,7 +240,10 @@ public class ConnectorServerTest
// that can listen to 192.168.0.1:1099 and 127.0.0.1:1099 without problems.
String host = "localhost";
int port = 1399;
ServerSocket serverSocket = new ServerSocket(0);
int port = serverSocket.getLocalPort();
serverSocket.close();
connectorServer = new ConnectorServer(new JMXServiceURL("rmi", host, port, "/jndi/rmi://" + host + ":" + port + "/jmxrmi"), objectName);
connectorServer.start();

View File

@ -56,26 +56,14 @@
<includeArtifactIds>jmx-webapp</includeArtifactIds>
<includeScope>runtime</includeScope>
<includeTypes>war</includeTypes>
<overwriteSnapshots>true</overwriteSnapshots>
<overwriteReleases>true</overwriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
<overWriteReleases>true</overWriteReleases>
<stripVersion>true</stripVersion>
<outputDirectory>${test-base-dir}/webapps</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -18,17 +18,13 @@
package org.eclipse.jetty.test.jmx;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assert.assertThat;
import java.io.File;
import java.io.InputStream;
import java.lang.management.ManagementFactory;
import java.net.HttpURLConnection;
import java.net.ServerSocket;
import java.net.URI;
import java.util.concurrent.CountDownLatch;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
@ -44,120 +40,119 @@ import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.util.IO;
import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.WebAppContext;
import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.jmx.ConnectorServer;
import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.server.NetworkConnector;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
/**
* Some JMX information tests.
*/
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assert.assertThat;
@Ignore
public class JmxIT
{
private static JMXConnector __jmxc;
private static MBeanServerConnection __mbsc;
private static Server __server;
private static int __port;
private Server _server;
private JMXConnector _jmxc;
private MBeanServerConnection _mbsc;
private int _httpPort;
private JMXServiceURL _jmxURL;
@BeforeClass
public static void connectToMBeanServer() throws Exception
@Before
public void connectToMBeanServer() throws Exception
{
startJetty();
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://localhost:1099/jndi/rmi://localhost:1099/jmxrmi");
__jmxc = JMXConnectorFactory.connect(url,null);
__mbsc = __jmxc.getMBeanServerConnection();
new CountDownLatch(1).await();
_jmxc = JMXConnectorFactory.connect(_jmxURL);
_mbsc = _jmxc.getMBeanServerConnection();
}
@AfterClass
public static void disconnectFromMBeanServer() throws Exception
@After
public void disconnectFromMBeanServer() throws Exception
{
_jmxc.close();
stopJetty();
__jmxc.close();
}
public static void startJetty() throws Exception
public void startJetty() throws Exception
{
File target = MavenTestingUtils.getTargetDir();
File jettyBase = new File (target, "test-base");
File webapps = new File (jettyBase, "webapps");
File war = new File (webapps, "jmx-webapp.war");
File jettyBase = new File(target, "test-base");
File webapps = new File(jettyBase, "webapps");
File war = new File(webapps, "jmx-webapp.war");
_server = new Server(0);
//create server instance
__server = new Server(0);
//set up the webapp
WebAppContext context = new WebAppContext();
context.setWar(war.getCanonicalPath());
context.setContextPath("/jmx-webapp");
context.addConfiguration(new AnnotationConfiguration());
context.setAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$");
__server.setHandler(context);
//set up jmx remote
context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$");
_server.setHandler(context);
MBeanContainer mbContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
__server.addBean(mbContainer);
_server.addBean(mbContainer);
JMXServiceURL serviceUrl = new JMXServiceURL("rmi", "localhost", 1099, "/jndi/rmi://localhost:1099/jmxrmi");
ConnectorServer jmxConnServer = new ConnectorServer(serviceUrl, "org.eclipse.jetty.jmx:name=rmiconnectorserver");
__server.addBean(jmxConnServer);
ServerSocket serverSocket = new ServerSocket(0);
int jmxPort = serverSocket.getLocalPort();
serverSocket.close();
//start server
__server.start();
//remember chosen port
__port = ((NetworkConnector)__server.getConnectors()[0]).getLocalPort();
_jmxURL = new JMXServiceURL("rmi", "0.0.0.0", jmxPort, "/jndi/rmi://0.0.0.0:" + jmxPort + "/jmxrmi");
ConnectorServer jmxConnServer = new ConnectorServer(_jmxURL, "org.eclipse.jetty.jmx:name=rmiconnectorserver");
_server.addBean(jmxConnServer);
_server.start();
_httpPort = ((NetworkConnector)_server.getConnectors()[0]).getLocalPort();
}
public static void stopJetty () throws Exception
public void stopJetty() throws Exception
{
if (__server != null)
__server.stop();
if (_server != null)
_server.stop();
}
private String getStringAttribute(ObjectName objName, String attrName) throws Exception
{
Object val = __mbsc.getAttribute(objName,attrName);
assertThat(attrName,val,notNullValue());
assertThat(attrName,val,instanceOf(String.class));
Object val = _mbsc.getAttribute(objName, attrName);
assertThat(attrName, val, notNullValue());
assertThat(attrName, val, instanceOf(String.class));
return (String)val;
}
private int getIntegerAttribute(ObjectName objName, String attrName) throws Exception
{
Object val = __mbsc.getAttribute(objName,attrName);
assertThat(attrName,val,notNullValue());
assertThat(attrName,val,instanceOf(Integer.class));
Object val = _mbsc.getAttribute(objName, attrName);
assertThat(attrName, val, notNullValue());
assertThat(attrName, val, instanceOf(Integer.class));
return (Integer)val;
}
@Test
public void testBasic() throws Exception
{
URI serverURI = new URI("http://localhost:"+String.valueOf(__port)+"/jmx-webapp/");
HttpURLConnection http = (HttpURLConnection) serverURI.resolve("ping").toURL().openConnection();
assertThat("http response", http.getResponseCode(), is(200));
try(InputStream inputStream = http.getInputStream())
URI serverURI = new URI("http://localhost:" + String.valueOf(_httpPort) + "/jmx-webapp/");
HttpURLConnection http = (HttpURLConnection)serverURI.resolve("ping").toURL().openConnection();
try (InputStream inputStream = http.getInputStream())
{
assertThat("http response", http.getResponseCode(), is(200));
String resp = IO.toString(inputStream);
assertThat(resp,startsWith("Servlet Pong at "));
assertThat(resp, startsWith("Servlet Pong at "));
}
}
@Test
public void testObtainRunningServerVersion() throws Exception
{
ObjectName serverName = new ObjectName("org.eclipse.jetty.server:type=server,id=0");
String version = getStringAttribute(serverName,"version");
assertThat("Version",version,startsWith("10.0."));
String version = getStringAttribute(serverName, "version");
assertThat("Version", version, startsWith("10.0."));
}
@Test
@ -165,11 +160,11 @@ public class JmxIT
{
ObjectName webappName = new ObjectName("org.eclipse.jetty.webapp:context=jmx-webapp,type=webappcontext,id=0");
String contextPath = getStringAttribute(webappName,"contextPath");
String displayName = getStringAttribute(webappName,"displayName");
String contextPath = getStringAttribute(webappName, "contextPath");
assertThat("Context Path", contextPath, is("/jmx-webapp"));
assertThat("Context Path",contextPath,is("/jmx-webapp"));
assertThat("Display Name",displayName,is("Test JMX WebApp"));
String displayName = getStringAttribute(webappName, "displayName");
assertThat("Display Name", displayName, is("Test JMX WebApp"));
}
/**
@ -179,8 +174,8 @@ public class JmxIT
public void testAccessToCommonComponent() throws Exception
{
ObjectName commonName = new ObjectName("org.eclipse.jetty.test.jmx:type=commoncomponent,context=jmx-webapp,id=0");
String name = getStringAttribute(commonName,"name");
assertThat("Name",name,is("i am common"));
String name = getStringAttribute(commonName, "name");
assertThat("Name", name, is("i am common"));
}
/**
@ -192,14 +187,14 @@ public class JmxIT
{
ObjectName pingerName = new ObjectName("org.eclipse.jetty.test.jmx:type=pinger,context=jmx-webapp,id=0");
// Get initial count
int count = getIntegerAttribute(pingerName,"count");
int count = getIntegerAttribute(pingerName, "count");
// Operations
Object val = __mbsc.invoke(pingerName,"ping",null,null);
assertThat("ping() return",val.toString(),startsWith("Pong"));
Object val = _mbsc.invoke(pingerName, "ping", null, null);
assertThat("ping() return", val.toString(), startsWith("Pong"));
// Attributes
assertThat("count",getIntegerAttribute(pingerName,"count"),is(count+1));
assertThat("count", getIntegerAttribute(pingerName, "count"), is(count + 1));
}
/**
* Test for POJO (annotated) that is merged with a MBean that
* declares more annotations.
@ -209,12 +204,12 @@ public class JmxIT
{
ObjectName echoerName = new ObjectName("org.eclipse.jetty.test.jmx:type=echoer,context=jmx-webapp,id=0");
// Get initial count
int count = getIntegerAttribute(echoerName,"count");
int count = getIntegerAttribute(echoerName, "count");
// Operations
Object val = __mbsc.invoke(echoerName,"echo",new Object[]{"Its Me"},new String[]{String.class.getName()});
assertThat("echo() return",val.toString(),is("Its Me"));
Object val = _mbsc.invoke(echoerName, "echo", new Object[]{"Its Me"}, new String[]{String.class.getName()});
assertThat("echo() return", val.toString(), is("Its Me"));
// Attributes
assertThat("count",getIntegerAttribute(echoerName,"count"),is(count+1));
assertThat("foo",getStringAttribute(echoerName,"foo"),is("foo-ish"));
assertThat("count", getIntegerAttribute(echoerName, "count"), is(count + 1));
assertThat("foo", getStringAttribute(echoerName, "foo"), is("foo-ish"));
}
}