View Javadoc
1   /*
2    * Copyright 2002-2014 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.springframework.web.socket.config.annotation;
18  
19  import java.util.Arrays;
20  import java.util.concurrent.CountDownLatch;
21  import java.util.concurrent.TimeUnit;
22  
23  import org.junit.Test;
24  import org.junit.runner.RunWith;
25  import org.junit.runners.Parameterized;
26  import org.junit.runners.Parameterized.Parameters;
27  
28  import org.springframework.beans.factory.annotation.Autowired;
29  import org.springframework.context.annotation.Bean;
30  import org.springframework.context.annotation.Configuration;
31  import org.springframework.web.socket.AbstractWebSocketIntegrationTests;
32  import org.springframework.web.socket.JettyWebSocketTestServer;
33  import org.springframework.web.socket.TomcatWebSocketTestServer;
34  import org.springframework.web.socket.UndertowTestServer;
35  import org.springframework.web.socket.WebSocketSession;
36  import org.springframework.web.socket.client.jetty.JettyWebSocketClient;
37  import org.springframework.web.socket.client.standard.StandardWebSocketClient;
38  import org.springframework.web.socket.handler.AbstractWebSocketHandler;
39  import org.springframework.web.socket.server.HandshakeHandler;
40  import org.springframework.web.socket.sockjs.transport.handler.WebSocketTransportHandler;
41  
42  import static org.junit.Assert.*;
43  
44  /**
45   * Integration tests for WebSocket Java server-side configuration.
46   *
47   * @author Rossen Stoyanchev
48   */
49  @RunWith(Parameterized.class)
50  public class WebSocketConfigurationTests extends AbstractWebSocketIntegrationTests {
51  
52  	@Parameters
53  	public static Iterable<Object[]> arguments() {
54  		return Arrays.asList(new Object[][] {
55  				{new JettyWebSocketTestServer(), new JettyWebSocketClient()},
56  				{new TomcatWebSocketTestServer(), new StandardWebSocketClient()},
57  				{new UndertowTestServer(), new StandardWebSocketClient()}
58  		});
59  	}
60  
61  
62  	@Override
63  	protected Class<?>[] getAnnotatedConfigClasses() {
64  		return new Class<?>[] { TestConfig.class };
65  	}
66  
67  	@Test
68  	public void registerWebSocketHandler() throws Exception {
69  		WebSocketSession session = this.webSocketClient.doHandshake(
70  				new AbstractWebSocketHandler() {}, getWsBaseUrl() + "/ws").get();
71  
72  		TestHandler serverHandler = this.wac.getBean(TestHandler.class);
73  		assertTrue(serverHandler.connectLatch.await(2, TimeUnit.SECONDS));
74  
75  		session.close();
76  	}
77  
78  	@Test
79  	public void registerWebSocketHandlerWithSockJS() throws Exception {
80  		WebSocketSession session = this.webSocketClient.doHandshake(
81  				new AbstractWebSocketHandler() {}, getWsBaseUrl() + "/sockjs/websocket").get();
82  
83  		TestHandler serverHandler = this.wac.getBean(TestHandler.class);
84  		assertTrue(serverHandler.connectLatch.await(2, TimeUnit.SECONDS));
85  
86  		session.close();
87  	}
88  
89  
90  	@Configuration
91  	@EnableWebSocket
92  	static class TestConfig implements WebSocketConfigurer {
93  
94  		@Autowired
95  		private HandshakeHandler handshakeHandler; // can't rely on classpath for server detection
96  
97  		@Override
98  		public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
99  			registry.addHandler(serverHandler(), "/ws")
100 				.setHandshakeHandler(this.handshakeHandler);
101 			registry.addHandler(serverHandler(), "/sockjs").withSockJS()
102 				.setTransportHandlerOverrides(new WebSocketTransportHandler(this.handshakeHandler));
103 		}
104 
105 		@Bean
106 		public TestHandler serverHandler() {
107 			return new TestHandler();
108 		}
109 	}
110 
111 	private static class TestHandler extends AbstractWebSocketHandler {
112 
113 		private CountDownLatch connectLatch = new CountDownLatch(1);
114 
115 		@Override
116 		public void afterConnectionEstablished(WebSocketSession session) throws Exception {
117 			this.connectLatch.countDown();
118 		}
119 	}
120 
121 }