/* * JBoss, Home of Professional Open Source * Copyright 2012, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.arquillian.daemon.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.util.logging.Logger; import org.jboss.arquillian.daemon.protocol.wire.WireProtocol; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.Assert; import org.junit.Test; /** * Test cases to ensure the {@link NettyServer} is working as contracted * * @author <a href="mailto:alr@jboss.org">Andrew Lee Rubinger</a> */ public class NettyServerTest { private static final Logger log = Logger.getLogger(NettyServerTest.class.getName()); @Test public void isNotRunningAfterCreate() throws ServerLifecycleException { final Server server = Servers.create(null, 0); Assert.assertFalse(server.isRunning()); } @Test public void start() throws ServerLifecycleException { final Server server = Servers.create(null, 0); server.start(); Assert.assertTrue(server.isRunning()); server.stop(); } @Test public void stop() throws ServerLifecycleException { final Server server = Servers.create(null, 0); server.start(); server.stop(); Assert.assertFalse(server.isRunning()); } @Test public void restart() throws ServerLifecycleException { final Server server = Servers.create(null, 0); try { server.start(); server.stop(); server.start(); Assert.assertTrue(server.isRunning()); } finally { if (server.isRunning()) { server.stop(); } } } @Test public void startProhibitedIfRunning() throws ServerLifecycleException { final Server server = Servers.create(null, 0); server.start(); boolean gotExpectedException = false; try { try { server.start(); } catch (final IllegalStateException ise) { gotExpectedException = true; } Assert.assertTrue("Server should not be able to be started while running", gotExpectedException); } finally { server.stop(); } } @Test public void stopProhibitedIfNotRunning() throws ServerLifecycleException { final Server server = Servers.create(null, 0); boolean gotExpectedException = false; try { server.stop(); } catch (final IllegalStateException ise) { gotExpectedException = true; } Assert.assertTrue("Server should not be able to be stopped if not running", gotExpectedException); } @Test public void deploy() throws Exception { // Create the server final Server server = Servers.create(null, 12345); server.start(); // Make an archive final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "myarchive.jar").addClass(this.getClass()); Socket socket = null; BufferedReader reader = null; try { socket = new Socket("localhost", 12345); final OutputStream socketOutstream = socket.getOutputStream(); final PrintWriter writer = new PrintWriter(new OutputStreamWriter(socketOutstream, WireProtocol.CHARSET), true); // Write the deploy command prefix and flush it writer.print(WireProtocol.COMMAND_DEPLOY_PREFIX); writer.flush(); // Now write the archive archive.as(ZipExporter.class).exportTo(socketOutstream); socketOutstream.flush(); // Terminate the command writer.write(WireProtocol.COMMAND_EOF_DELIMITER); writer.flush(); // Read and check the response final InputStream responseStream = socket.getInputStream(); reader = new BufferedReader(new InputStreamReader(responseStream)); final String response = reader.readLine(); log.info("Got response: " + response); Assert.assertTrue(response.startsWith(WireProtocol.RESPONSE_OK_PREFIX)); } finally { if (socket != null) { try { socket.close(); } catch (final IOException ignore) { } } if (reader != null) { try { reader.close(); } catch (final IOException ignore) { } } // Stop server.stop(); } } @Test public void stopOverWireProtocol() throws Exception { // Create the server final Server server = Servers.create(null, 12345); server.start(); Socket socket = null; BufferedReader reader = null; try { socket = new Socket("localhost", 12345); final OutputStream socketOutstream = socket.getOutputStream(); final PrintWriter writer = new PrintWriter(new OutputStreamWriter(socketOutstream, WireProtocol.CHARSET), true); // Write the deploy command prefix and flush it writer.print(WireProtocol.COMMAND_STOP); writer.print(WireProtocol.COMMAND_EOF_DELIMITER); writer.flush(); // Read and check the response final InputStream responseStream = socket.getInputStream(); reader = new BufferedReader(new InputStreamReader(responseStream)); final String response = reader.readLine(); log.info("Got response: " + response); Assert.assertTrue(response.startsWith(WireProtocol.RESPONSE_OK_PREFIX)); final long current = System.currentTimeMillis(); // Try for 10s while (current < current + (10 * 1000)) { if (!server.isRunning()) { log.info("Server shutdown over wire protocol"); return; } Thread.sleep(300); } Assert.fail("Server did not shut down via wire protocol request in the alloted time"); } finally { if (socket != null) { try { socket.close(); } catch (final IOException ignore) { } } if (reader != null) { try { reader.close(); } catch (final IOException ignore) { } } // Stop if (server.isRunning()) { server.stop(); } } } }