1616
1717package io .vertx .ext .stomp .impl ;
1818
19+ import io .vertx .core .Future ;
20+ import io .vertx .core .Handler ;
1921import io .vertx .core .Vertx ;
2022import 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 ;
2127import io .vertx .core .net .NetSocket ;
2228import io .vertx .ext .auth .User ;
2329import io .vertx .ext .auth .authentication .AuthenticationProvider ;
3844import org .junit .Test ;
3945import org .junit .runner .RunWith ;
4046
47+ import java .util .Arrays ;
48+
4149/**
4250 * Tests STOMP server with security.
4351 *
4452 * @author <a href="http://escoffier.me">Clement Escoffier</a>
4553 */
4654@ RunWith (VertxUnitRunner .class )
4755public class SecuredServerConnectionTest {
56+
4857 private Vertx vertx ;
4958 private StompServer server ;
59+ private HttpServer wsServer ;
60+ private HttpClient wsClient ;
61+ private StompClient client ;
5062
5163 @ Rule
5264 public RunTestOnContext rule = new RunTestOnContext ();
@@ -55,9 +67,17 @@ public class SecuredServerConnectionTest {
5567 public void setUp (TestContext context ) {
5668 vertx = rule .vertx ();
5769 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- server .listen ().onComplete (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" ));
6181 }
6282
6383 @ After
@@ -162,11 +182,66 @@ public void testClientConnectRejection(TestContext context) {
162182 }
163183
164184 void validate (TestContext context , Buffer buffer ) {
165- context .assertTrue (buffer .toString ().contains ("CONNECTED" ));
185+ context .assertTrue (buffer .toString ().contains ("CONNECTED" ), "Was expected <" + buffer . toString () + "> to contain 'CONNECTED'" );
166186 context .assertTrue (buffer .toString ().contains ("version:1.2" ));
167187
168188 User user = server .stompHandler ().getUserBySession (extractSession (buffer .toString ()));
169189 context .assertNotNull (user );
170190 }
171191
192+ @ Test
193+ public void testTCPClientMustBeConnected (TestContext context ) {
194+ Async async = context .async ();
195+ NetClient client = vertx .createNetClient ();
196+ testClientMustBeConnected (context , v -> {
197+ client .connect (server .actualPort (), "0.0.0.0" ).onComplete (context .asyncAssertSuccess (so -> {
198+ Buffer received = Buffer .buffer ();
199+ so .handler (received ::appendBuffer );
200+ so .write (
201+ "SEND\n " +
202+ "destination:/test\n " +
203+ "\n " +
204+ "hello" +
205+ FrameParser .NULL );
206+ so .endHandler (v2 -> {
207+ context .assertTrue (received .toString ().startsWith ("ERROR\n " ));
208+ async .complete ();
209+ });
210+ }));
211+ });
212+ }
213+
214+ @ Test
215+ public void testWebSocketClientMustBeConnected (TestContext context ) {
216+ Async async = context .async ();
217+ testClientMustBeConnected (context , v -> {
218+ wsClient .webSocket (8080 , "localhost" , "/stomp" ).onComplete (context .asyncAssertSuccess (ws -> {
219+ Buffer received = Buffer .buffer ();
220+ ws .binaryMessageHandler (received ::appendBuffer );
221+ ws .writeBinaryMessage (
222+ Buffer .buffer ("SEND\n " +
223+ "destination:/test\n " +
224+ "\n " +
225+ "hello" +
226+ FrameParser .NULL ));
227+ ws .endHandler (v2 -> {
228+ context .assertTrue (received .toString ().startsWith ("ERROR\n " ));
229+ async .complete ();
230+ });
231+ }));
232+ });
233+ }
234+
235+ private void testClientMustBeConnected (TestContext context , Handler <Void > cont ) {
236+ client
237+ .connect (server .actualPort (), "localhost" )
238+ .onComplete (context .asyncAssertSuccess (conn -> {
239+ Future <String > fut = conn .subscribe ("/test" , frame -> {
240+ context .fail ("Should not receive a messsage" );
241+ });
242+ fut .onComplete (context .asyncAssertSuccess (v2 -> {
243+ cont .handle (null );
244+ }));
245+ }));
246+ }
172247}
0 commit comments