/*
* Copyright 2014 NAVER Corp.
*
* 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 com.navercorp.pinpoint.rpc.client;
import com.navercorp.pinpoint.rpc.PinpointSocket;
import com.navercorp.pinpoint.rpc.TestAwaitTaskUtils;
import com.navercorp.pinpoint.rpc.TestAwaitUtils;
import com.navercorp.pinpoint.rpc.server.PinpointServerAcceptor;
import com.navercorp.pinpoint.rpc.server.SimpleServerMessageListener;
import com.navercorp.pinpoint.rpc.util.PinpointRPCTestUtils;
import com.navercorp.pinpoint.rpc.util.PinpointRPCTestUtils.EchoClientListener;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.SocketUtils;
import java.io.IOException;
import java.util.List;
/**
* @author Taejin Koo
*/
public class ClientMessageListenerTest {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private static int bindPort;
private final TestAwaitUtils awaitUtils = new TestAwaitUtils(100, 2000);
@BeforeClass
public static void setUp() throws IOException {
bindPort = SocketUtils.findAvailableTcpPort();
}
@Test
public void clientMessageListenerTest1() throws InterruptedException {
PinpointServerAcceptor serverAcceptor = PinpointRPCTestUtils.createPinpointServerFactory(bindPort, SimpleServerMessageListener.DUPLEX_INSTANCE);
EchoClientListener echoMessageListener = new EchoClientListener();
PinpointClientFactory clientSocketFactory = PinpointRPCTestUtils.createClientFactory(PinpointRPCTestUtils.getParams(), echoMessageListener);
try {
PinpointClient client = clientSocketFactory.connect("127.0.0.1", bindPort);
assertAvaiableWritableSocket(serverAcceptor, 1);
List<PinpointSocket> writableServerList = serverAcceptor.getWritableSocketList();
PinpointSocket writableServer = writableServerList.get(0);
assertSendMessage(writableServer, "simple", echoMessageListener);
assertRequestMessage(writableServer, "request", echoMessageListener);
PinpointRPCTestUtils.close(client);
} finally {
clientSocketFactory.release();
PinpointRPCTestUtils.close(serverAcceptor);
}
}
@Test
public void clientMessageListenerTest2() throws InterruptedException {
PinpointServerAcceptor serverAcceptor = PinpointRPCTestUtils.createPinpointServerFactory(bindPort, SimpleServerMessageListener.DUPLEX_INSTANCE);
EchoClientListener echoMessageListener1 = PinpointRPCTestUtils.createEchoClientListener();
PinpointClientFactory clientSocketFactory1 = PinpointRPCTestUtils.createClientFactory(PinpointRPCTestUtils.getParams(), echoMessageListener1);
EchoClientListener echoMessageListener2 = PinpointRPCTestUtils.createEchoClientListener();
PinpointClientFactory clientSocketFactory2 = PinpointRPCTestUtils.createClientFactory(PinpointRPCTestUtils.getParams(), echoMessageListener2);
try {
PinpointClient client = clientSocketFactory1.connect("127.0.0.1", bindPort);
PinpointClient client2 = clientSocketFactory2.connect("127.0.0.1", bindPort);
assertAvaiableWritableSocket(serverAcceptor, 2);
List<PinpointSocket> writableServerList = serverAcceptor.getWritableSocketList();
PinpointSocket writableServer = writableServerList.get(0);
assertRequestMessage(writableServer, "socket1", null);
PinpointSocket writableServer2 = writableServerList.get(1);
assertRequestMessage(writableServer2, "socket2", null);
Assert.assertEquals(1, echoMessageListener1.getRequestPacketRepository().size());
Assert.assertEquals(1, echoMessageListener2.getRequestPacketRepository().size());
PinpointRPCTestUtils.close(client, client2);
} finally {
clientSocketFactory1.release();
clientSocketFactory2.release();
PinpointRPCTestUtils.close(serverAcceptor);
}
}
private void assertSendMessage(PinpointSocket writableServer, String message, EchoClientListener echoMessageListener) throws InterruptedException {
writableServer.send(message.getBytes());
Thread.sleep(100);
Assert.assertEquals(message, new String(echoMessageListener.getSendPacketRepository().get(0).getPayload()));
}
private void assertRequestMessage(PinpointSocket writableServer, String message, EchoClientListener echoMessageListener) throws InterruptedException {
byte[] response = PinpointRPCTestUtils.request(writableServer, message.getBytes());
Assert.assertEquals(message, new String(response));
if (echoMessageListener != null) {
Assert.assertEquals(message, new String(echoMessageListener.getRequestPacketRepository().get(0).getPayload()));
}
}
private void assertAvaiableWritableSocket(final PinpointServerAcceptor serverAcceptor, final int expectedWritableSocketSize) {
boolean pass = awaitUtils.await(new TestAwaitTaskUtils() {
@Override
public boolean checkCompleted() {
return serverAcceptor.getWritableSocketList().size() == expectedWritableSocketSize;
}
});
Assert.assertTrue(pass);
}
}