/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.camel.component.websocket;
import java.util.HashMap;
import java.util.Map;
import org.apache.camel.Endpoint;
import org.apache.camel.impl.DefaultCamelContext;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.when;
/**
*
*/
@RunWith(MockitoJUnitRunner.class)
public class WebsocketComponentTest {
private static final String PATH_ONE = "foo";
private static final String PATH_TWO = "bar";
private static final String PATH_SPEC_ONE = "/" + PATH_ONE + "/*";
@Mock
private WebsocketConsumer consumer;
@Mock
private NodeSynchronization sync;
@Mock
private WebsocketComponentServlet servlet;
@Mock
private Map<String, WebsocketComponentServlet> servlets;
@Mock
private ServletContextHandler handler;
private WebsocketComponent component;
private WebsocketProducer producer;
private Server server;
@Before
public void setUp() throws Exception {
component = new WebsocketComponent();
component.setCamelContext(new DefaultCamelContext());
System.out.println("Server : " + server.isStarted());
server = component.createServer();
System.out.println("Server : " + server.isStarted());
ServerConnector connector = new ServerConnector(server);
connector.setHost("localhost");
connector.setPort(1988);
server.addConnector(connector);
WebsocketEndpoint endpoint = (WebsocketEndpoint) component.createEndpoint("websocket://x");
producer = (WebsocketProducer) endpoint.createProducer();
component.connect(producer);
// wire the consumer with the endpoint so that WebSocketComponent.getConnectorKey() works without throwing NPE
when(consumer.getEndpoint()).thenReturn(endpoint);
}
@Test
public void testCreateContext() throws Exception {
ServletContextHandler handler = component.createContext(server, server.getConnectors()[0], null);
assertNotNull(handler);
}
@Test
public void testCreateServerWithoutStaticContent() throws Exception {
ServletContextHandler handler = component.createContext(server, server.getConnectors()[0], null);
assertEquals(1, server.getConnectors().length);
assertEquals("localhost", ((ServerConnector) server.getConnectors()[0]).getHost());
assertEquals(1988, ((ServerConnector) server.getConnectors()[0]).getPort());
assertFalse(server.getConnectors()[0].isStarted());
assertEquals(handler, server.getHandler());
assertEquals(1, server.getHandlers().length);
assertEquals(handler, server.getHandlers()[0]);
assertEquals("/", handler.getContextPath());
assertNull(handler.getSessionHandler());
assertNull(handler.getResourceBase());
assertNull(handler.getServletHandler().getHolderEntry("/"));
}
@Test
public void testCreateServerWithStaticContent() throws Exception {
ServletContextHandler handler = component.createContext(server, server.getConnectors()[0], null);
Server server = component.createStaticResourcesServer(handler, "localhost", 1988, "classpath:public");
assertEquals(1, server.getConnectors().length);
assertEquals("localhost", ((ServerConnector) server.getConnectors()[0]).getHost());
assertEquals(1988, ((ServerConnector) server.getConnectors()[0]).getPort());
assertFalse(server.getConnectors()[0].isStarted());
assertEquals(handler, server.getHandler());
assertEquals(1, server.getHandlers().length);
assertEquals(handler, server.getHandlers()[0]);
assertEquals("/", handler.getContextPath());
assertNotNull(handler.getSessionHandler());
assertNotNull(handler.getResourceBase());
assertTrue(handler.getResourceBase().startsWith(JettyClassPathResource.class.getName()));
assertNotNull(handler.getServletHandler().getHolderEntry("/"));
}
@Test
public void testCreateEndpoint() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
Endpoint e1 = component.createEndpoint("websocket://foo", "foo", parameters);
Endpoint e2 = component.createEndpoint("websocket://foo", "foo", parameters);
Endpoint e3 = component.createEndpoint("websocket://bar", "bar", parameters);
assertNotNull(e1);
assertNotNull(e1);
assertNotNull(e1);
assertEquals(e1, e2);
assertNotSame(e1, e3);
assertNotSame(e2, e3);
}
@Test
public void testCreateServlet() throws Exception {
component.createServlet(sync, PATH_SPEC_ONE, servlets, handler);
InOrder inOrder = inOrder(servlet, consumer, sync, servlets, handler);
ArgumentCaptor<WebsocketComponentServlet> servletCaptor = ArgumentCaptor.forClass(WebsocketComponentServlet.class);
inOrder.verify(servlets, times(1)).put(eq(PATH_SPEC_ONE), servletCaptor.capture());
ArgumentCaptor<ServletHolder> holderCaptor = ArgumentCaptor.forClass(ServletHolder.class);
inOrder.verify(handler, times(1)).addServlet(holderCaptor.capture(), eq(PATH_SPEC_ONE));
inOrder.verifyNoMoreInteractions();
assertEquals(servletCaptor.getValue(), holderCaptor.getValue().getServlet());
}
@Test
public void testAddServletProducersOnly() throws Exception {
WebsocketComponentServlet s1 = component.addServlet(sync, producer, PATH_ONE);
WebsocketComponentServlet s2 = component.addServlet(sync, producer, PATH_TWO);
assertNotNull(s1);
assertNotNull(s2);
assertNotSame(s1, s2);
assertNull(s1.getConsumer());
assertNull(s2.getConsumer());
}
@Test
public void testAddServletConsumersOnly() throws Exception {
WebsocketComponentServlet s1 = component.addServlet(sync, consumer, PATH_ONE);
WebsocketComponentServlet s2 = component.addServlet(sync, consumer, PATH_TWO);
assertNotNull(s1);
assertNotNull(s2);
assertNotSame(s1, s2);
assertEquals(consumer, s1.getConsumer());
assertEquals(consumer, s2.getConsumer());
}
@Test
public void testAddServletProducerAndConsumer() throws Exception {
WebsocketComponentServlet s1 = component.addServlet(sync, producer, PATH_ONE);
WebsocketComponentServlet s2 = component.addServlet(sync, consumer, PATH_ONE);
assertNotNull(s1);
assertNotNull(s2);
assertEquals(s1, s2);
assertEquals(consumer, s1.getConsumer());
}
@Test
public void testAddServletConsumerAndProducer() throws Exception {
WebsocketComponentServlet s1 = component.addServlet(sync, consumer, PATH_ONE);
WebsocketComponentServlet s2 = component.addServlet(sync, producer, PATH_ONE);
assertNotNull(s1);
assertNotNull(s2);
assertEquals(s1, s2);
assertEquals(consumer, s1.getConsumer());
}
}