package io.vertx.ext.shell.command.base; import io.vertx.core.AbstractVerticle; import io.vertx.core.Context; import io.vertx.core.Vertx; import io.vertx.ext.shell.Shell; import io.vertx.ext.shell.ShellServer; import io.vertx.ext.shell.system.ExecStatus; import io.vertx.ext.shell.system.Job; import io.vertx.ext.shell.term.Pty; 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; import java.util.concurrent.atomic.AtomicReference; /** * @author <a href="mailto:emad.albloushi@gmail.com">Emad Alblueshi</a> */ @RunWith(VertxUnitRunner.class) public class DeployVerticleTest { Vertx vertx; ShellServer server; static AtomicReference<Context> ctx; static public class SomeVerticle extends AbstractVerticle { @Override public void start() throws Exception { ctx.set(this.vertx.getOrCreateContext()); } } @Before public void before(TestContext context) throws Exception { ctx = new AtomicReference<>(null); vertx = Vertx.vertx(); server = ShellServer.create(vertx) .registerCommandResolver(new BaseCommandPack(vertx)).listen(context.asyncAssertSuccess()); } @After public void after(TestContext context) { vertx.close(context.asyncAssertSuccess()); } @Test public void testDeploy(TestContext context) { String cmd = "verticle-deploy io.vertx.ext.shell.command.base.DeployVerticleTest$SomeVerticle"; String result = testDeployCmd(context, cmd); context.assertNotNull(ctx.get()); context.assertEquals(result, "Deployed " + ctx.get().deploymentID()); context.assertEquals(1, ctx.get().getInstanceCount()); } @Test public void testDeployWithOptionsAsEmptyString(TestContext context) { String cmd = "verticle-deploy io.vertx.ext.shell.command.base.DeployVerticleTest$SomeVerticle ''"; String result = testDeployCmd(context, cmd); context.assertNotNull(ctx.get()); context.assertEquals(result, "Deployed " + ctx.get().deploymentID()); context.assertEquals(1, ctx.get().getInstanceCount()); } @Test public void testDeployWithOptionsAsJsonInstance(TestContext context) { String cmd = "verticle-deploy io.vertx.ext.shell.command.base.DeployVerticleTest$SomeVerticle '{\"instances\" : 8}'"; String result = testDeployCmd(context, cmd); context.assertNotNull(ctx.get()); context.assertEquals(result, "Deployed " + ctx.get().deploymentID()); context.assertEquals(8, ctx.get().getInstanceCount()); } @Test public void testDeployWithOptionsAsJsonConfig(TestContext context) { String cmd = "verticle-deploy io.vertx.ext.shell.command.base.DeployVerticleTest$SomeVerticle '{\"config\":{\"ok\":true}}'"; String result = testDeployCmd(context, cmd); context.assertNotNull(ctx.get()); context.assertEquals(result, "Deployed " + ctx.get().deploymentID()); context.assertEquals(1, ctx.get().getInstanceCount()); context.assertNotNull(ctx.get().config()); context.assertTrue(ctx.get().config().containsKey("ok")); context.assertEquals(true, ctx.get().config().getBoolean("ok")); } @Test public void testDeployWithOptionsAsEmptyJsonString(TestContext context) { String cmd = "verticle-deploy io.vertx.ext.shell.command.base.DeployVerticleTest$SomeVerticle '{}'"; String result = testDeployCmd(context, cmd); context.assertNotNull(ctx.get()); context.assertEquals(result, "Deployed " + ctx.get().deploymentID()); context.assertEquals(1, ctx.get().getInstanceCount()); } @Test public void testDeployWithOptionsAsInvalidJsonString(TestContext context) { String cmd = "verticle-deploy io.vertx.ext.shell.command.base.DeployVerticleTest$SomeVerticle '{'"; String result = testDeployCmd(context, cmd); String msg = "Could not deploy io.vertx.ext.shell.command.base.DeployVerticleTest$SomeVerticle with deployment options"; context.assertNull(ctx.get()); context.assertTrue(result.startsWith(msg)); } private String testDeployCmd(TestContext context, String cmd) { Async async = context.async(); Shell shell = server.createShell(); Pty pty = Pty.create(); StringBuffer result = new StringBuffer(); pty.stdoutHandler(result::append); Job job = shell.createJob(cmd) .setTty(pty.slave()); job.statusUpdateHandler(status -> { if (status == ExecStatus.TERMINATED) { async.complete(); } }); job.run(); async.awaitSuccess(5000); shell.close(); return result.toString().trim(); } }