/*
* Copyright (c) 2008-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.cometd.demo;
import java.lang.management.ManagementFactory;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.websocket.ContainerProvider;
import javax.websocket.WebSocketContainer;
import org.cometd.client.BayeuxClient;
import org.cometd.client.transport.LongPollingTransport;
import org.cometd.websocket.client.JettyWebSocketTransport;
import org.cometd.websocket.client.WebSocketTransport;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.websocket.client.WebSocketClient;
import org.junit.Assert;
import org.junit.Test;
public class DemoTest {
@Test
public void testDemo() throws Exception {
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
sslContextFactory.setKeyStorePassword("storepwd");
sslContextFactory.setKeyManagerPassword("keypwd");
// Start the Server.
Server server = Demo.start();
// Starts the HTTP client.
HttpClient httpClient = new HttpClient(sslContextFactory);
httpClient.start();
// Starts the WebSocket client.
// NOTE: due to limitations of the JSR specification, this client only works over clear-text.
WebSocketContainer jsrWebSocketClient = ContainerProvider.getWebSocketContainer();
// Jetty's WebSocket client works also over TLS.
WebSocketClient jettyWebSocketClient = new WebSocketClient(sslContextFactory);
jettyWebSocketClient.start();
try {
// Test clear-text communication.
String clearTextURL = "http://localhost:" + Demo.HTTP_PORT + Demo.CONTEXT_PATH + "/cometd";
BayeuxClient client = new BayeuxClient(clearTextURL, new WebSocketTransport(null, null, jsrWebSocketClient));
client.handshake();
Assert.assertTrue(client.waitFor(5000, BayeuxClient.State.CONNECTED));
client.disconnect();
Assert.assertTrue(client.waitFor(5000, BayeuxClient.State.DISCONNECTED));
// Test confidential communication.
String confidentialURL = "https://localhost:" + Demo.HTTPS_PORT + Demo.CONTEXT_PATH + "/cometd";
client = new BayeuxClient(confidentialURL, new LongPollingTransport(null, httpClient));
client.handshake();
Assert.assertTrue(client.waitFor(5000, BayeuxClient.State.CONNECTED));
client.disconnect();
Assert.assertTrue(client.waitFor(5000, BayeuxClient.State.DISCONNECTED));
client = new BayeuxClient(confidentialURL, new JettyWebSocketTransport(null, null, jettyWebSocketClient));
client.handshake();
Assert.assertTrue(client.waitFor(5000, BayeuxClient.State.CONNECTED));
client.disconnect();
Assert.assertTrue(client.waitFor(5000, BayeuxClient.State.DISCONNECTED));
// Test JMX.
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectInstance> objectInstances = mbeanServer.queryMBeans(ObjectName.getInstance("org.cometd.server:*"), null);
Assert.assertFalse(objectInstances.isEmpty());
} finally {
jettyWebSocketClient.stop();
if (jsrWebSocketClient instanceof LifeCycle) {
((LifeCycle)jsrWebSocketClient).stop();
}
httpClient.stop();
server.stop();
}
}
}