// Copyright (c) 2010 Shardul Deo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. package com.googlecode.protobuf.socketrpc; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import javax.net.ServerSocketFactory; import com.google.protobuf.ByteString; import com.googlecode.protobuf.socketrpc.RpcConnectionFactory.Connection; import com.googlecode.protobuf.socketrpc.SocketRpcProtos.Request; import com.googlecode.protobuf.socketrpc.SocketRpcProtos.Response; import junit.framework.TestCase; /** * Tests for {@link SocketServerRpcConnectionFactory}. * * @author Shardul Deo */ public class SocketServerRpcConnectionFactoryTest extends TestCase { private FakeServerSocketFactory fakeSocketFactory; private SocketServerRpcConnectionFactory socketServerConnectionFactory; private boolean closed = false; @Override protected void setUp() throws Exception { super.setUp(); fakeSocketFactory = new FakeServerSocketFactory(); socketServerConnectionFactory = new SocketServerRpcConnectionFactory(0, 0, null, true, fakeSocketFactory); } public void testCreateConnection() throws IOException { Request request1 = createRequest(1); FakeSocket socket1 = new FakeSocket(true).withRequest(request1); fakeSocketFactory.returnsSocket(socket1); Connection connection1 = socketServerConnectionFactory.createConnection(); Request request2 = createRequest(1); FakeSocket socket2 = new FakeSocket(true).withRequest(request2); fakeSocketFactory.returnsSocket(socket2); Connection connection2 = socketServerConnectionFactory.createConnection(); Request.Builder builder = Request.newBuilder(); connection1.receiveProtoMessage(builder); assertEquals(request1, builder.build()); builder = Request.newBuilder(); connection2.receiveProtoMessage(builder); assertEquals(request2, builder.build()); Response response1 = createResponse(1); connection1.sendProtoMessage(response1); Response response2 = createResponse(2); connection2.sendProtoMessage(response2); assertEquals(response1, socket1.getResponse()); assertEquals(response2, socket2.getResponse()); } public void testClosed() throws IOException { FakeSocket socket = new FakeSocket(true).withRequest(createRequest(1)); fakeSocketFactory.returnsSocket(socket); socketServerConnectionFactory.createConnection(); assertFalse(closed); socketServerConnectionFactory.close(); assertTrue(closed); } private Request createRequest(int index) { Request request = Request.newBuilder() .setMethodName("method" + index) .setServiceName("service" + index) .setRequestProto(ByteString.EMPTY) .build(); return request; } private Response createResponse(int index) { Response response = Response.newBuilder() .setError("Error" + index) .build(); return response; } private class FakeServerSocketFactory extends ServerSocketFactory { private FakeSocket socket; private FakeServerSocketFactory returnsSocket(FakeSocket fakeSocket) { this.socket = fakeSocket; return this; } @Override public ServerSocket createServerSocket(int port) throws IOException { return createServerSocket(port, 0); } @Override public ServerSocket createServerSocket(int port, int backlog) throws IOException { return createServerSocket(port, backlog, null); } @Override public ServerSocket createServerSocket(int port, int backlog, InetAddress ifAddress) throws IOException { return new ServerSocket() { @Override public Socket accept() { return socket; } @Override public void close() { closed = true; } @Override public boolean isClosed() { return closed; } }; } } }