16
16
17
17
package io .vertx .ext .stomp .impl ;
18
18
19
+ import io .vertx .core .Future ;
20
+ import io .vertx .core .Handler ;
19
21
import io .vertx .core .Vertx ;
20
22
import io .vertx .core .buffer .Buffer ;
23
+ import io .vertx .core .http .HttpClient ;
24
+ import io .vertx .core .http .HttpServer ;
25
+ import io .vertx .core .http .HttpServerOptions ;
26
+ import io .vertx .core .net .NetClient ;
21
27
import io .vertx .core .net .NetSocket ;
22
28
import io .vertx .ext .auth .User ;
23
29
import io .vertx .ext .auth .authentication .AuthenticationProvider ;
38
44
import org .junit .Test ;
39
45
import org .junit .runner .RunWith ;
40
46
47
+ import java .util .Arrays ;
48
+
41
49
/**
42
50
* Tests STOMP server with security.
43
51
*
44
52
* @author <a href="http://escoffier.me">Clement Escoffier</a>
45
53
*/
46
54
@ RunWith (VertxUnitRunner .class )
47
55
public class SecuredServerConnectionTest {
56
+
48
57
private Vertx vertx ;
49
58
private StompServer server ;
59
+ private HttpServer wsServer ;
60
+ private HttpClient wsClient ;
61
+ private StompClient client ;
50
62
51
63
@ Rule
52
64
public RunTestOnContext rule = new RunTestOnContext ();
@@ -55,9 +67,17 @@ public class SecuredServerConnectionTest {
55
67
public void setUp (TestContext context ) {
56
68
vertx = rule .vertx ();
57
69
AuthenticationProvider provider = PropertyFileAuthentication .create (vertx , "test-auth.properties" );
58
- server = StompServer .create (vertx , new StompServerOptions ().setSecured (true ))
59
- .handler (StompServerHandler .create (vertx ).authProvider (provider ))
60
- .listen (context .asyncAssertSuccess ());
70
+ server = StompServer .create (vertx , new StompServerOptions ()
71
+ .setSecured (true )
72
+ .setWebsocketBridge (true )
73
+ .setWebsocketPath ("/stomp" ))
74
+ .handler (StompServerHandler .create (vertx ).authProvider (provider ));
75
+ server .listen (StompServerOptions .DEFAULT_STOMP_PORT ).onComplete (context .asyncAssertSuccess ());
76
+ wsServer = vertx .createHttpServer (new HttpServerOptions ().setWebSocketSubProtocols (Arrays .asList ("v10.stomp" , "v11.stomp" )))
77
+ .webSocketHandler (server .webSocketHandler ());
78
+ wsServer .listen (8080 ).onComplete (context .asyncAssertSuccess ());
79
+ wsClient = vertx .createHttpClient ();
80
+ client = StompClient .create (vertx , new StompClientOptions ().setLogin ("admin" ).setPasscode ("admin" ));
61
81
}
62
82
63
83
@ After
@@ -158,11 +178,66 @@ public void testFailedAuthenticationWithClient(TestContext context) {
158
178
}
159
179
160
180
void validate (TestContext context , Buffer buffer ) {
161
- context .assertTrue (buffer .toString ().contains ("CONNECTED" ));
181
+ context .assertTrue (buffer .toString ().contains ("CONNECTED" ), "Was expected <" + buffer . toString () + "> to contain 'CONNECTED'" );
162
182
context .assertTrue (buffer .toString ().contains ("version:1.2" ));
163
183
164
184
User user = server .stompHandler ().getUserBySession (extractSession (buffer .toString ()));
165
185
context .assertNotNull (user );
166
186
}
167
187
188
+ @ Test
189
+ public void testTCPClientMustBeConnected (TestContext context ) {
190
+ Async async = context .async ();
191
+ NetClient client = vertx .createNetClient ();
192
+ testClientMustBeConnected (context , v -> {
193
+ client .connect (server .actualPort (), "0.0.0.0" ).onComplete (context .asyncAssertSuccess (so -> {
194
+ Buffer received = Buffer .buffer ();
195
+ so .handler (received ::appendBuffer );
196
+ so .write (
197
+ "SEND\n " +
198
+ "destination:/test\n " +
199
+ "\n " +
200
+ "hello" +
201
+ FrameParser .NULL );
202
+ so .endHandler (v2 -> {
203
+ context .assertTrue (received .toString ().startsWith ("ERROR\n " ));
204
+ async .complete ();
205
+ });
206
+ }));
207
+ });
208
+ }
209
+
210
+ @ Test
211
+ public void testWebSocketClientMustBeConnected (TestContext context ) {
212
+ Async async = context .async ();
213
+ testClientMustBeConnected (context , v -> {
214
+ wsClient .webSocket (8080 , "localhost" , "/stomp" ).onComplete (context .asyncAssertSuccess (ws -> {
215
+ Buffer received = Buffer .buffer ();
216
+ ws .binaryMessageHandler (received ::appendBuffer );
217
+ ws .writeBinaryMessage (
218
+ Buffer .buffer ("SEND\n " +
219
+ "destination:/test\n " +
220
+ "\n " +
221
+ "hello" +
222
+ FrameParser .NULL ));
223
+ ws .endHandler (v2 -> {
224
+ context .assertTrue (received .toString ().startsWith ("ERROR\n " ));
225
+ async .complete ();
226
+ });
227
+ }));
228
+ });
229
+ }
230
+
231
+ private void testClientMustBeConnected (TestContext context , Handler <Void > cont ) {
232
+ client
233
+ .connect (server .actualPort (), "localhost" )
234
+ .onComplete (context .asyncAssertSuccess (conn -> {
235
+ Future <String > fut = conn .subscribe ("/test" , frame -> {
236
+ context .fail ("Should not receive a messsage" );
237
+ });
238
+ fut .onComplete (context .asyncAssertSuccess (v2 -> {
239
+ cont .handle (null );
240
+ }));
241
+ }));
242
+ }
168
243
}
0 commit comments