view src/test/java/net/borgac/clusterrpc/client/SocketWrapperTest.java @ 6:0e608c466a58

Implement ClientChannel/SocketWrapper and add logging and tests
author Lewin Bormann <lbo@spheniscida.de>
date Sat, 24 Sep 2016 16:42:13 +0200
parents
children 593822c857b7
line wrap: on
line source

package net.borgac.clusterrpc.client;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.zeromq.ZMQ;
import org.zeromq.ZMsg;

/**
 * Test SocketWrapper using inproc sockets.
 *
 * @author lbo
 */
public class SocketWrapperTest {

    private ZMQ.Socket server;
    private SocketWrapper sw;

    private static final PeerAddress ADDRESS = new PeerAddress("sock-wrapper-test");

    public SocketWrapperTest() {
    }

    @BeforeClass
    public static void setUpClass() {
    }

    @AfterClass
    public static void tearDownClass() {
    }

    @Before
    public void setUp() {
        server = GlobalContextProvider.socket(ZMQ.ROUTER);
        server.bind(ADDRESS.getConnectAddress());

        sw = new SocketWrapper(new StderrLogger(Logger.Loglevel.DEBUG));
        sw.connect(ADDRESS);
    }

    @After
    public void tearDown() {
        server.close();
        server = null;

        sw.close();
        sw = null;
    }

    @Test
    public void testClientServerCommunication() {
        sw.send("TestMessage");

        ZMsg msgs = ZMsg.recvMsg(server);

        Assert.assertEquals(4, msgs.size());

        byte[] clientId = msgs.pop().getData();

        Assert.assertArrayEquals(sw.getInner().getIdentity(), clientId);

        byte[] requestId = msgs.pop().getData();

        Assert.assertEquals(5, requestId.length);

        byte[] empty = msgs.pop().getData();

        Assert.assertEquals(0, empty.length);

        byte[] payload = msgs.pop().getData();

        Assert.assertArrayEquals("TestMessage".getBytes(), payload);
    }

    @Test
    public void testSendReceive() {
        sw.send("TestMessage");

        ZMsg msgs = ZMsg.recvMsg(server);
        Assert.assertEquals(4, msgs.size());

        ZMsg response = new ZMsg();
        response.add(msgs.pop());
        response.add(msgs.pop());
        response.add(msgs.pop());
        response.add("ServerResponse");

        response.send(server);

        byte[] fromServer = sw.recv();

        Assert.assertArrayEquals("ServerResponse".getBytes(), fromServer);
    }

    @Test
    public void testSendReceiveWithBadRequestId() {
        sw.send("TestMessage");

        byte[] clientId, requestId;

        ZMsg msgs = ZMsg.recvMsg(server);
        Assert.assertEquals(4, msgs.size());

        ZMsg response = new ZMsg();
        clientId = msgs.pop().getData();
        requestId = msgs.pop().getData();

        response.add(clientId);
        response.add("xyz1"); // respond with bad request id
        response.add(new byte[0]);
        response.add("BadServerResponse");

        response.send(server);

        response.destroy();
        response.add(clientId);
        response.add(requestId); // correct request id
        response.add(new byte[0]);
        response.add("GoodServerResponse");

        response.send(server);

        // Expectation: Client discards first response.
        byte[] fromServer = sw.recv();
        Assert.assertArrayEquals("GoodServerResponse".getBytes(), fromServer);
    }
}