1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
46
47
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;
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 }