1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.web.socket.sockjs.transport.handler;
18
19 import java.sql.Date;
20
21 import org.junit.Before;
22 import org.junit.Test;
23
24 import org.springframework.scheduling.TaskScheduler;
25 import org.springframework.web.socket.AbstractHttpRequestTests;
26 import org.springframework.web.socket.WebSocketHandler;
27 import org.springframework.web.socket.sockjs.frame.SockJsFrame;
28 import org.springframework.web.socket.sockjs.frame.SockJsFrameFormat;
29 import org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession;
30 import org.springframework.web.socket.sockjs.transport.session.PollingSockJsSession;
31 import org.springframework.web.socket.sockjs.transport.session.StreamingSockJsSession;
32 import org.springframework.web.socket.sockjs.transport.session.StubSockJsServiceConfig;
33
34 import static org.junit.Assert.*;
35 import static org.mockito.Mockito.*;
36
37
38
39
40
41
42 public class HttpSendingTransportHandlerTests extends AbstractHttpRequestTests {
43
44 private WebSocketHandler webSocketHandler;
45
46 private StubSockJsServiceConfig sockJsConfig;
47
48 private TaskScheduler taskScheduler;
49
50
51 @Override
52 @Before
53 public void setUp() {
54 super.setUp();
55
56 this.webSocketHandler = mock(WebSocketHandler.class);
57 this.taskScheduler = mock(TaskScheduler.class);
58
59 this.sockJsConfig = new StubSockJsServiceConfig();
60 this.sockJsConfig.setTaskScheduler(this.taskScheduler);
61
62 setRequest("POST", "/");
63 }
64
65 @Test
66 public void handleRequestXhr() throws Exception {
67
68 XhrPollingTransportHandler transportHandler = new XhrPollingTransportHandler();
69 transportHandler.initialize(this.sockJsConfig);
70
71 AbstractSockJsSession session = transportHandler.createSession("1", this.webSocketHandler, null);
72 transportHandler.handleRequest(this.request, this.response, this.webSocketHandler, session);
73
74 assertEquals("application/javascript;charset=UTF-8", this.response.getHeaders().getContentType().toString());
75 assertEquals("o\n", this.servletResponse.getContentAsString());
76 assertFalse("Polling request should complete after open frame", this.servletRequest.isAsyncStarted());
77 verify(this.webSocketHandler).afterConnectionEstablished(session);
78
79 resetRequestAndResponse();
80 transportHandler.handleRequest(this.request, this.response, this.webSocketHandler, session);
81
82 assertTrue("Polling request should remain open", this.servletRequest.isAsyncStarted());
83 verify(this.taskScheduler).schedule(any(Runnable.class), any(Date.class));
84
85 resetRequestAndResponse();
86 transportHandler.handleRequest(this.request, this.response, this.webSocketHandler, session);
87
88 assertFalse("Request should have been rejected", this.servletRequest.isAsyncStarted());
89 assertEquals("c[2010,\"Another connection still open\"]\n", this.servletResponse.getContentAsString());
90 }
91
92 @Test
93 public void jsonpTransport() throws Exception {
94
95 JsonpPollingTransportHandler transportHandler = new JsonpPollingTransportHandler();
96 transportHandler.initialize(this.sockJsConfig);
97 PollingSockJsSession session = transportHandler.createSession("1", this.webSocketHandler, null);
98
99 transportHandler.handleRequest(this.request, this.response, this.webSocketHandler, session);
100
101 assertEquals(500, this.servletResponse.getStatus());
102 assertEquals("\"callback\" parameter required", this.servletResponse.getContentAsString());
103
104 resetRequestAndResponse();
105 setRequest("POST", "/");
106 this.servletRequest.setQueryString("c=callback");
107 this.servletRequest.addParameter("c", "callback");
108 transportHandler.handleRequest(this.request, this.response, this.webSocketHandler, session);
109
110 assertEquals("application/javascript;charset=UTF-8", this.response.getHeaders().getContentType().toString());
111 assertFalse("Polling request should complete after open frame", this.servletRequest.isAsyncStarted());
112 verify(this.webSocketHandler).afterConnectionEstablished(session);
113 }
114
115 @Test
116 public void handleRequestXhrStreaming() throws Exception {
117
118 XhrStreamingTransportHandler transportHandler = new XhrStreamingTransportHandler();
119 transportHandler.initialize(this.sockJsConfig);
120 AbstractSockJsSession session = transportHandler.createSession("1", this.webSocketHandler, null);
121
122 transportHandler.handleRequest(this.request, this.response, this.webSocketHandler, session);
123
124 assertEquals("application/javascript;charset=UTF-8", this.response.getHeaders().getContentType().toString());
125 assertTrue("Streaming request not started", this.servletRequest.isAsyncStarted());
126 verify(this.webSocketHandler).afterConnectionEstablished(session);
127 }
128
129 @Test
130 public void htmlFileTransport() throws Exception {
131
132 HtmlFileTransportHandler transportHandler = new HtmlFileTransportHandler();
133 transportHandler.initialize(this.sockJsConfig);
134 StreamingSockJsSession session = transportHandler.createSession("1", this.webSocketHandler, null);
135
136 transportHandler.handleRequest(this.request, this.response, this.webSocketHandler, session);
137
138 assertEquals(500, this.servletResponse.getStatus());
139 assertEquals("\"callback\" parameter required", this.servletResponse.getContentAsString());
140
141 resetRequestAndResponse();
142 setRequest("POST", "/");
143 this.servletRequest.setQueryString("c=callback");
144 this.servletRequest.addParameter("c", "callback");
145 transportHandler.handleRequest(this.request, this.response, this.webSocketHandler, session);
146
147 assertEquals("text/html;charset=UTF-8", this.response.getHeaders().getContentType().toString());
148 assertTrue("Streaming request not started", this.servletRequest.isAsyncStarted());
149 verify(this.webSocketHandler).afterConnectionEstablished(session);
150 }
151
152 @Test
153 public void eventSourceTransport() throws Exception {
154
155 EventSourceTransportHandler transportHandler = new EventSourceTransportHandler();
156 transportHandler.initialize(this.sockJsConfig);
157 StreamingSockJsSession session = transportHandler.createSession("1", this.webSocketHandler, null);
158
159 transportHandler.handleRequest(this.request, this.response, this.webSocketHandler, session);
160
161 assertEquals("text/event-stream;charset=UTF-8", this.response.getHeaders().getContentType().toString());
162 assertTrue("Streaming request not started", this.servletRequest.isAsyncStarted());
163 verify(this.webSocketHandler).afterConnectionEstablished(session);
164 }
165
166 @Test
167 public void frameFormats() throws Exception {
168
169 this.servletRequest.setQueryString("c=callback");
170 this.servletRequest.addParameter("c", "callback");
171
172 SockJsFrame frame = SockJsFrame.openFrame();
173
174 SockJsFrameFormat format = new XhrPollingTransportHandler().getFrameFormat(this.request);
175 String formatted = format.format(frame);
176 assertEquals(frame.getContent() + "\n", formatted);
177
178 format = new XhrStreamingTransportHandler().getFrameFormat(this.request);
179 formatted = format.format(frame);
180 assertEquals(frame.getContent() + "\n", formatted);
181
182 format = new HtmlFileTransportHandler().getFrameFormat(this.request);
183 formatted = format.format(frame);
184 assertEquals("<script>\np(\"" + frame.getContent() + "\");\n</script>\r\n", formatted);
185
186 format = new EventSourceTransportHandler().getFrameFormat(this.request);
187 formatted = format.format(frame);
188 assertEquals("data: " + frame.getContent() + "\r\n\r\n", formatted);
189
190 format = new JsonpPollingTransportHandler().getFrameFormat(this.request);
191 formatted = format.format(frame);
192 assertEquals("callback(\"" + frame.getContent() + "\");\r\n", formatted);
193 }
194
195 }