DS-Lab / src / test / java / dslab / transfer / TransferServerTest.java
TransferServerTest.java
Raw
package dslab.transfer;

import dslab.ComponentFactory;
import dslab.Constants;
import dslab.Sockets;
import dslab.TestBase;
import dslab.monitoring.MonitoringServerTest;
import dslab.routing.DeliveryService;
import dslab.util.ComponentId;
import dslab.util.Config;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;

import java.net.SocketTimeoutException;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;

/**
 * TransferServerTest.
 */
public class TransferServerTest extends TestBase {

    private static final Log LOG = LogFactory.getLog(MonitoringServerTest.class);

    @Test
    public void runAndShutdownTransferServer_createsAndStopsTcpSocketCorrectly() throws Exception {
        ITransferServer component = new TransferServer(
                in, out, new MockComponentFactory(new ComponentId("transfer-1"), new Config("transfer-1")));

        int port = new Config("transfer-1").getInt("tcp.port");

        assertThat(component, is(notNullValue()));

        Thread componentThread = new Thread(component);
        LOG.info("Starting thread with component " + component);
        componentThread.start();

        try {
            LOG.info("Waiting for socket to open on port " + port);
            Sockets.waitForSocket("localhost", port, Constants.COMPONENT_STARTUP_WAIT);
        } catch (SocketTimeoutException e) {
            err.addError(new AssertionError("Expected a TCP server socket on port " + port, e));
        }

        LOG.info("Shutting down component " + component);
        in.addLine("shutdown"); // send "shutdown" command to command line
        Thread.sleep(Constants.COMPONENT_TEARDOWN_WAIT);

        try {
            LOG.info("Waiting for thread to stop for component " + component);
            componentThread.join();
        } catch (InterruptedException e) {
            err.addError(new AssertionError("Monitoring server was not terminated correctly"));
        }

        err.checkThat("Expected tcp socket on port " + port + " to be closed after shutdown",
                Sockets.isServerSocketOpen(port), is(false));
    }

    private static class MockComponentFactory extends ComponentFactory {
        public MockComponentFactory(ComponentId componentId, Config config) {
            super(componentId, config);
        }
        @Override
        public synchronized DeliveryService getDeliveryService() {
            return mock(DeliveryService.class);
        }
    }

}