/* * Copyright (c) 2011-2015 The original author or authors * ------------------------------------------------------ * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php * * You may elect to redistribute this code under either of these licenses. */ package io.vertx.ext.stomp.impl; import io.vertx.core.AsyncResult; import io.vertx.core.Vertx; import io.vertx.ext.stomp.*; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; /** * test the {@link StompServerImpl}. * * @author <a href="http://escoffier.me">Clement Escoffier</a> */ @RunWith(VertxUnitRunner.class) public class StompServerImplTest { private Vertx vertx; @Before public void setUp() { vertx = Vertx.vertx(); } @After public void tearDown() { vertx.close(); } @Test public void testStartStop(TestContext context) { final Async async = context.async(); StompServer.create(vertx) .handler(StompServerHandler.create(vertx)) .listen(ar -> { ensureListening(context, ar); ar.result().close(ar2 -> { ensureClosed(context, ar2, ar.result()); async.complete(); }); }); } @Test public void testStartReceiveStop(TestContext context) { final Async async = context.async(); StompServer server = StompServer.create(vertx); server.handler(StompServerHandler.create(vertx) .connectHandler( sf -> { Frame frame = sf.frame(); context.assertTrue(frame.getCommand() == Frame.Command.CONNECT); context.assertTrue(frame.getHeader("login").equals("system")); server.close(ar2 -> { ensureClosed(context, ar2, server); async.complete(); }); } ) ).listen(ar -> { ensureListening(context, ar); writeMessage(vertx); }); } @Test public void testStartReceiveStopWithTrailingSpaces(TestContext context) { final Async async = context.async(); StompServer server = StompServer.create(vertx, new StompServerOptions().setTrailingLine(true)); server.handler(StompServerHandler.create(vertx) .connectHandler( sf -> { Frame frame = sf.frame(); context.assertTrue(frame.getCommand() == Frame.Command.CONNECT); context.assertTrue(frame.getHeader("login").equals("system")); server.close(ar2 -> { ensureClosed(context, ar2, server); async.complete(); }); } ) ).listen(ar -> { ensureListening(context, ar); writeMessageWithTrailingLine(vertx); }); } @Test public void testWithStompServerHandler(TestContext context) { final Async async = context.async(); StompServer server = StompServer.create(vertx); server.handler( StompServerHandler.create(vertx).connectHandler( sf -> { Frame frame = sf.frame(); context.assertTrue(frame.getCommand() == Frame.Command.CONNECT); context.assertTrue(frame.getHeader("login").equals("system")); server.close(ar2 -> { ensureClosed(context, ar2, server); async.complete(); }); } )).listen(ar -> { ensureListening(context, ar); writeMessage(vertx); }); } @Test public void testWithStompServerHandlerWithTrailingLine(TestContext context) { final Async async = context.async(); StompServer server = StompServer.create(vertx, new StompServerOptions().setTrailingLine(true)); server.handler( StompServerHandler.create(vertx).connectHandler( sf -> { Frame frame = sf.frame(); context.assertTrue(frame.getCommand() == Frame.Command.CONNECT); context.assertTrue(frame.getHeader("login").equals("system")); server.close(ar2 -> { ensureClosed(context, ar2, server); async.complete(); }); } )).listen(ar -> { ensureListening(context, ar); writeMessageWithTrailingLine(vertx); }); } @Test public void testWhenPortIsSetToMinusOneInOptions(TestContext context) { final Async async = context.async(); StompServer.create(vertx, new StompServerOptions().setPort(-1)).handler(StompServerHandler .create(vertx)) .listen(ar -> { if (!ar.failed()) { context.fail("Error expected"); } else { // Create a client and check it cannot connect StompClient.create(vertx).connect(61613, "localhost", x -> { if (!x.failed()) { context.fail("Error expected on the client side"); } async.complete(); }); } }); } @Test public void testWhenPortIsSetToMinusOneInListen(TestContext context) { final Async async = context.async(); StompServer.create(vertx).handler(StompServerHandler .create(vertx)) .listen(-1, ar -> { if (!ar.failed()) { context.fail("Error expected"); } else { // Create a client and check it cannot connect StompClient.create(vertx).connect(61613, "localhost", x -> { if (!x.failed()) { context.fail("Error expected on the client side"); } async.complete(); }); } }); } private void writeMessage(Vertx vertx) { vertx.createNetClient().connect(StompServerOptions.DEFAULT_STOMP_PORT, "0.0.0.0", ar -> ar.result().write("CONNECT\n" + "login:system\n" + "passcode:manager\n\n" + FrameParser.NULL)); } private void writeMessageWithTrailingLine(Vertx vertx) { vertx.createNetClient().connect(StompServerOptions.DEFAULT_STOMP_PORT, "0.0.0.0", ar -> ar.result().write("CONNECT\n" + "login:system\n" + "passcode:manager\n\n" + FrameParser.NULL + "\n")); } private void ensureClosed(TestContext context, AsyncResult<Void> ar, StompServer server) { context.assertTrue(ar.succeeded()); context.assertFalse(server.isListening()); } private void ensureListening(TestContext context, AsyncResult<StompServer> ar) { context.assertTrue(ar.succeeded()); context.assertNotNull(ar.result()); context.assertTrue(ar.result().isListening()); } }