1
1
/*
2
- * Copyright 2002-2014 the original author or authors.
2
+ * Copyright 2002-2015 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
17
17
package org .springframework .web .socket ;
18
18
19
19
20
+ import static org .junit .Assert .*;
21
+
20
22
import java .net .URI ;
23
+ import java .util .ArrayList ;
21
24
import java .util .Arrays ;
25
+ import java .util .List ;
26
+ import java .util .concurrent .CountDownLatch ;
27
+ import java .util .concurrent .TimeUnit ;
22
28
23
29
import org .junit .Test ;
24
30
import org .junit .runner .RunWith ;
32
38
import org .springframework .web .socket .config .annotation .EnableWebSocket ;
33
39
import org .springframework .web .socket .config .annotation .WebSocketConfigurer ;
34
40
import org .springframework .web .socket .config .annotation .WebSocketHandlerRegistry ;
41
+ import org .springframework .web .socket .handler .AbstractWebSocketHandler ;
35
42
import org .springframework .web .socket .handler .TextWebSocketHandler ;
36
43
import org .springframework .web .socket .server .support .DefaultHandshakeHandler ;
37
44
38
- import static org .junit .Assert .*;
39
45
40
46
/**
41
47
* Client and server-side WebSocket integration tests.
@@ -67,6 +73,24 @@ public void subProtocolNegotiation() throws Exception {
67
73
URI url = new URI (getWsBaseUrl () + "/ws" );
68
74
WebSocketSession session = this .webSocketClient .doHandshake (new TextWebSocketHandler (), headers , url ).get ();
69
75
assertEquals ("foo" , session .getAcceptedProtocol ());
76
+ session .close ();
77
+ }
78
+
79
+ // SPR-12727
80
+
81
+ @ Test
82
+ public void unsolicitedPongWithEmptyPayload () throws Exception {
83
+ TestWebSocketHandler serverHandler = this .wac .getBean (TestWebSocketHandler .class );
84
+ serverHandler .setWaitMessageCount (1 );
85
+
86
+ String url = getWsBaseUrl () + "/ws" ;
87
+ WebSocketSession session = this .webSocketClient .doHandshake (new AbstractWebSocketHandler () {}, url ).get ();
88
+ session .sendMessage (new PongMessage ());
89
+
90
+ serverHandler .await ();
91
+ assertNull (serverHandler .getTransportError ());
92
+ assertEquals (1 , serverHandler .getReceivedMessages ().size ());
93
+ assertEquals (PongMessage .class , serverHandler .getReceivedMessages ().get (0 ).getClass ());
70
94
}
71
95
72
96
@@ -84,8 +108,51 @@ public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
84
108
}
85
109
86
110
@ Bean
87
- public TextWebSocketHandler handler () {
88
- return new TextWebSocketHandler ();
111
+ public TestWebSocketHandler handler () {
112
+ return new TestWebSocketHandler ();
113
+ }
114
+
115
+ }
116
+
117
+ private static class TestWebSocketHandler extends AbstractWebSocketHandler {
118
+
119
+ private List <WebSocketMessage > receivedMessages = new ArrayList <>();
120
+
121
+ private int waitMessageCount ;
122
+
123
+ private final CountDownLatch latch = new CountDownLatch (1 );
124
+
125
+ private Throwable transportError ;
126
+
127
+
128
+ public void setWaitMessageCount (int waitMessageCount ) {
129
+ this .waitMessageCount = waitMessageCount ;
130
+ }
131
+
132
+ public List <WebSocketMessage > getReceivedMessages () {
133
+ return this .receivedMessages ;
134
+ }
135
+
136
+ public Throwable getTransportError () {
137
+ return this .transportError ;
138
+ }
139
+
140
+ @ Override
141
+ public void handleMessage (WebSocketSession session , WebSocketMessage <?> message ) throws Exception {
142
+ this .receivedMessages .add (message );
143
+ if (this .receivedMessages .size () >= this .waitMessageCount ) {
144
+ this .latch .countDown ();
145
+ }
146
+ }
147
+
148
+ @ Override
149
+ public void handleTransportError (WebSocketSession session , Throwable exception ) throws Exception {
150
+ this .transportError = exception ;
151
+ this .latch .countDown ();
152
+ }
153
+
154
+ public void await () throws InterruptedException {
155
+ this .latch .await (5 , TimeUnit .SECONDS );
89
156
}
90
157
}
91
158
0 commit comments