/*
* 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.cluster.loadbalance;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import junit.framework.Assert;
import org.junit.Test;
import com.weibo.api.motan.mock.MockReferer;
import com.weibo.api.motan.protocol.example.IHello;
import com.weibo.api.motan.rpc.DefaultRequest;
import com.weibo.api.motan.rpc.Referer;
import com.weibo.api.motan.rpc.URL;
/**
* @author chengya1
* @author zhanglei
*/
public class ConfigurableWeightLoadBalanceTest {
private ConfigurableWeightLoadBalance<IHello> balance;
@Test
public void testDoSelect() {
int[] groupWeight = new int[] {2, 3, 5};
Map<String, AtomicInteger> counter = generate(3, groupWeight, new int[] {3, 4, 5});
for (int j = 0; j < 100; j++) {
int size = 100;
for (int i = 0; i < size; i++) {
Referer referer = balance.doSelect(new DefaultRequest());
String group = referer.getServiceUrl().getGroup();
counter.get(group).incrementAndGet();
}
for (String key : counter.keySet()) {
float total = size * (j + 1);
float ratio = counter.get(key).get() * 10 / total;
int weight = groupWeight[Integer.parseInt(key.substring("group".length()))];
Assert.assertTrue(Math.abs(weight - ratio) < 2); // 权重误差不超过阈值。
}
}
}
@Test
public void testDoSelectToHolder() {
generate(3, new int[] {2, 3, 5}, new int[] {3, 4, 5});
List<Referer<IHello>> list = new ArrayList<Referer<IHello>>();
balance.doSelectToHolder(new DefaultRequest(), list);
assertTrue(list.size() > 0 && list.size() <= ConfigurableWeightLoadBalance.MAX_REFERER_COUNT);
}
private Map<String, AtomicInteger> generate(int groupNum, int[] groupWeight, int[] groupSize) {
StringBuilder sb = new StringBuilder();
List<Referer<IHello>> list = new ArrayList<Referer<IHello>>();
Map<String, AtomicInteger> counterMap = new HashMap<String, AtomicInteger>();
for (int i = 0; i < groupNum; i++) {
// build weight
sb.append("group").append(i).append(":").append(groupWeight[i]).append(",");
// build counter
counterMap.put("group" + i, new AtomicInteger(0));
// build param map
Map<String, String> param = new HashMap<String, String>();
param.put("group", "group" + i);
// build referers
for (int j = 0; j < groupSize[i]; j++) {
list.add(new MockReferer<IHello>(new URL("motan", "localhost", i * 100 + j, "com.weibo.Hello", param)));
}
}
balance = new ConfigurableWeightLoadBalance();
balance.setWeightString(sb.substring(0, sb.length() - 1));
balance.onRefresh(list);
return counterMap;
}
}