/*
* 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.config;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Test;
import com.weibo.api.motan.BaseTestCase;
import com.weibo.api.motan.common.MotanConstants;
import com.weibo.api.motan.mock.MockClient;
import com.weibo.api.motan.protocol.example.Hello;
import com.weibo.api.motan.protocol.example.IHello;
import com.weibo.api.motan.rpc.URL;
/**
* @author maijunsheng
* @author zhanlgei
* @version 创建时间:2013-6-23
*
*/
public class MotanMultiConfigTest extends BaseTestCase {
ServiceConfig<IHello> serviceConfig1 = null;
ServiceConfig<IHello> serviceConfig2 = null;
RefererConfig<IHello> refererConfig1 = null;
RefererConfig<IHello> refererConfig2 = null;
RegistryConfig registryConfig = null;
int port1 = 18080;
int port2 = 18081;
@Override
public void setUp() throws Exception {
super.setUp();
MockClient.urlMap.clear();
String group = "test-yf";
String version = "0.1";
registryConfig = createLocalRegistryConfig("local", "local");
serviceConfig1 =
createServiceConfig(IHello.class, new Hello(), group, version, mockProtocolConfig(MotanConstants.PROTOCOL_MOTAN),
registryConfig, MotanConstants.PROTOCOL_MOTAN + ":" + port1);
serviceConfig2 =
createServiceConfig(IHello.class, new Hello(), group, version, mockProtocolConfig(MotanConstants.PROTOCOL_MOTAN),
registryConfig, MotanConstants.PROTOCOL_MOTAN + ":" + port2);
refererConfig1 = createRefererConfig(IHello.class);
refererConfig1.setProtocol(mockProtocolConfig(MotanConstants.PROTOCOL_MOTAN));
refererConfig1.setVersion(version);
refererConfig1.setRegistry(registryConfig);
refererConfig2 = createRefererConfig(IHello.class);
refererConfig2.setProtocol(mockProtocolConfig(MotanConstants.PROTOCOL_MOTAN));
refererConfig2.setVersion(version);
refererConfig2.setRegistry(registryConfig);
}
@Override
public void tearDown() throws Exception {
super.tearDown();
if (serviceConfig1 != null) {
serviceConfig1.unexport();
}
if (serviceConfig2 != null) {
serviceConfig2.unexport();
}
if (refererConfig1 != null) {
refererConfig1.destroy();
}
if (refererConfig2 != null) {
refererConfig2.destroy();
}
}
@Test
public void testMultiService() {
try {
serviceConfig1.export();
serviceConfig2.export();
IHello hello = refererConfig1.getRef();
assertNotNull(hello);
assertEquals(2, MockClient.urlMap.size());
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
}
}
@Test
public void testMultiVersion() {
try {
serviceConfig1.setVersion("1.0");
serviceConfig1.setExport(MotanConstants.PROTOCOL_MOTAN + ":" + port1);
serviceConfig1.export();
serviceConfig2.setVersion("2.0");
serviceConfig2.setExport(MotanConstants.PROTOCOL_MOTAN + ":" + port2);
serviceConfig2.export();
refererConfig1.setVersion("1.0");
IHello hello1 = refererConfig1.getRef();
validateCall(port1, 3, hello1);
refererConfig2.setVersion("2.0");
IHello hello2 = refererConfig2.getRef();
validateCall(port2, 2, hello2);
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
}
}
@Test
public void testMultiGroup() {
try {
// 由于需要提供跨group访问rpc的能力,所以不再验证group是否一致。
serviceConfig1.setGroup("group1");
serviceConfig1.export();
refererConfig1.setGroup("group2");
IHello hello1 = refererConfig1.getRef();
validateCall(port1, 3, hello1);
serviceConfig1.unexport();
refererConfig1.destroy();
MockClient.urlMap.clear();
serviceConfig2.setGroup("group2");
serviceConfig2.export();
refererConfig2.setGroup("group1");
IHello hello2 = refererConfig2.getRef();
validateCall(port2, 3, hello2);
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
}
}
private void validateCall(int port, int callTimes, IHello hello) {
for (int i = 0; i < callTimes; i++) {
hello.hello();
}
boolean exist = false;
for (Entry<URL, AtomicInteger> entry : MockClient.urlMap.entrySet()) {
if (entry.getKey().getPort() == port) {
exist = true;
assertEquals(callTimes, entry.getValue().get());
}
}
assertTrue(exist);
}
}
class MockServiceConfig<T> extends ServiceConfig<T> {
private static final long serialVersionUID = 3429358644364996318L;
protected boolean serviceExists(URL url) {
return false;
}
}