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.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   * Test fixture for {@link AbstractHttpSendingTransportHandler} and sub-classes.
39   *
40   * @author Rossen Stoyanchev
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 }