/*
* Copyright 2009-2016 Weibo, Inc.
*
* 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.weibo.api.motan.transport.netty;
import junit.framework.Assert;
import junit.framework.TestCase;
import org.junit.Test;
import com.weibo.api.motan.common.URLParamType;
import com.weibo.api.motan.rpc.URL;
import com.weibo.api.motan.transport.Client;
import com.weibo.api.motan.transport.Endpoint;
import com.weibo.api.motan.transport.MessageHandler;
import com.weibo.api.motan.transport.ProviderMessageRouter;
import com.weibo.api.motan.transport.Server;
import com.weibo.api.motan.transport.support.HeartbeatClientEndpointManager;
/**
* @author maijunsheng
* @version 创建时间:2013-6-19
*
*/
public class NettyEndpointFactoryTest extends TestCase {
@Test
public void testCreateServer() {
testNotShareChannel(true);
testNotShareChannel(false);
testShareChannel(true);
testShareChannel(false);
}
private void testNotShareChannel(boolean isServer) {
NettyEndpointFactory factory = new NettyEndpointFactory();
MessageHandler handler = new ProviderMessageRouter();
URL url = new URL("motan", "localhost", 18080, "com.weibo.api.motan.procotol.example.IHello");
Endpoint endpoint = createEndpoint(url, handler, isServer, factory);
Assert.assertEquals(endpoint.getUrl().getUri(), url.getUri());
url = new URL("motan", "localhost", 18081, "com.weibo.api.motan.procotol.example.IHello");
endpoint = createEndpoint(url, handler, isServer, factory);
Assert.assertEquals(endpoint.getUrl().getUri(), url.getUri());
Assert.assertTrue(endpoint != createEndpoint(new URL("motan", "localhost", 18081, "com.weibo.api.motan.procotol.example.IHello"),
handler, isServer, factory));
if (isServer) {
Assert.assertEquals(factory.getShallServerChannels().size(), 0);
}
if (isServer) {
factory.safeReleaseResource((Server) endpoint, url);
} else {
Assert.assertEquals(((HeartbeatClientEndpointManager) factory.getEndpointManager()).getClients().size(), 3);
factory.safeReleaseResource((Client) endpoint, url);
Assert.assertEquals(((HeartbeatClientEndpointManager) factory.getEndpointManager()).getClients().size(), 2);
}
}
private void testShareChannel(boolean isServer) {
NettyEndpointFactory factory = new NettyEndpointFactory();
MessageHandler handler = new ProviderMessageRouter();
URL url1 = new URL("motan", "localhost", 18080, "com.weibo.api.motan.procotol.example.IHello");
url1.addParameter(URLParamType.shareChannel.getName(), "true");
Endpoint endpoint1 = createEndpoint(url1, handler, isServer, factory);
Assert.assertEquals(endpoint1.getUrl().getServerPortStr(), url1.getServerPortStr());
URL url2 = new URL("motan", "localhost", 18081, "com.weibo.api.motan.protocol.example.IHello1");
url2.addParameter(URLParamType.shareChannel.getName(), "true");
Endpoint endpoint2 = createEndpoint(url2, handler, isServer, factory);
Assert.assertEquals(endpoint2.getUrl().getServerPortStr(), url2.getServerPortStr());
URL url3 = new URL("motan", "localhost", 18081, "com.weibo.api.motan.protocol.example.IHello2");
url3.addParameter(URLParamType.shareChannel.getName(), "true");
Endpoint endpoint3 = createEndpoint(url3, handler, isServer, factory);
if (isServer) {
Assert.assertTrue(endpoint2 == endpoint3);
} else {
Assert.assertTrue(endpoint2 != endpoint3);
}
URL url4 = new URL("injvm", "localhost", 18081, "com.weibo.api.motan.protocol.example.IHello3");
url4.addParameter(URLParamType.shareChannel.getName(), "true");
Endpoint endpoint4 = null;
if (isServer) {
try {
endpoint4 = createEndpoint(url4, handler, isServer, factory);
Assert.assertTrue(false);
} catch (Exception e) {
Assert.assertTrue(true);
}
} else {
try {
endpoint4 = createEndpoint(url4, handler, isServer, factory);
Assert.assertTrue(true);
} catch (Exception e) {
Assert.assertTrue(false);
}
}
if (isServer) {
Assert.assertEquals(factory.getShallServerChannels().size(), 2);
}
if (isServer) {
factory.safeReleaseResource((Server) endpoint1, url1);
factory.safeReleaseResource((Server) endpoint2, url2);
factory.safeReleaseResource((Server) endpoint3, url3);
Assert.assertEquals(factory.getShallServerChannels().size(), 0);
} else {
Assert.assertEquals(((HeartbeatClientEndpointManager) factory.getEndpointManager()).getClients().size(), 4);
factory.safeReleaseResource((Client) endpoint1, url1);
Assert.assertEquals(((HeartbeatClientEndpointManager) factory.getEndpointManager()).getClients().size(), 3);
factory.safeReleaseResource((Client) endpoint2, url2);
Assert.assertEquals(((HeartbeatClientEndpointManager) factory.getEndpointManager()).getClients().size(), 2);
factory.safeReleaseResource((Client) endpoint3, url3);
Assert.assertEquals(((HeartbeatClientEndpointManager) factory.getEndpointManager()).getClients().size(), 1);
factory.safeReleaseResource((Client) endpoint4, url4);
Assert.assertEquals(((HeartbeatClientEndpointManager) factory.getEndpointManager()).getClients().size(), 0);
}
}
private Endpoint createEndpoint(URL url, MessageHandler messageHandler, boolean isServer, NettyEndpointFactory factory) {
if (isServer) {
return (Endpoint) factory.createServer(url, messageHandler);
} else {
return (Endpoint) factory.createClient(url);
}
}
}