package netflix.ocelli.loadbalancer.weighting;
import java.util.ArrayList;
import java.util.List;
import netflix.ocelli.LoadBalancer;
import org.junit.Ignore;
import rx.exceptions.OnErrorNotImplementedException;
import rx.functions.Action1;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
@Ignore
public class BaseWeightingStrategyTest {
/**
* Creates a list of clients
*
* @param weights
* @return
*/
static List<IntClientAndMetrics> create(Integer... weights) {
List<IntClientAndMetrics> cam = new ArrayList<IntClientAndMetrics>(weights.length);
int counter = 0;
for (int i = 0; i < weights.length; i++) {
cam.add(new IntClientAndMetrics(counter++, weights[i]));
}
return cam;
}
/**
* Get an array of weights with indexes matching the list of clients.
* @param caw
* @return
*/
static int[] getWeights(ClientsAndWeights<IntClientAndMetrics> caw) {
int[] weights = new int[caw.size()];
for (int i = 0; i < caw.size(); i++) {
weights[i] = caw.getWeight(i);
}
return weights;
}
/**
* Run a simulation of 'count' selects and update the clients
* @param strategy
* @param N
* @param count
* @return
* @throws Throwable
*/
static Integer[] simulate(LoadBalancer<IntClientAndMetrics> lb, int N, int count) throws Throwable {
// Set up array of counts
final Integer[] counts = new Integer[N];
for (int i = 0; i < N; i++) {
counts[i] = 0;
}
// Run simulation
for (int i = 0; i < count; i++) {
try {
lb.toObservable().subscribe(new Action1<IntClientAndMetrics>() {
@Override
public void call(IntClientAndMetrics t1) {
counts[t1.getClient()] = counts[t1.getClient()] + 1;
}
});
}
catch (OnErrorNotImplementedException e) {
throw e.getCause();
}
}
return counts;
}
static Integer[] roundToNearest(Integer[] counts, int amount) {
int middle = amount / 2;
for (int i = 0; i < counts.length; i++) {
counts[i] = amount * ((counts[i] + middle) / amount);
}
return counts;
}
static String printClients(IntClientAndMetrics[] clients) {
return Joiner.on(", ").join(Collections2.transform(Lists.newArrayList(clients), new Function<IntClientAndMetrics, Integer>() {
@Override
public Integer apply(IntClientAndMetrics arg0) {
return arg0.getClient();
}
}));
}
static String printMetrics(IntClientAndMetrics[] clients) {
return Joiner.on(", ").join(Collections2.transform(Lists.newArrayList(clients), new Function<IntClientAndMetrics, Integer>() {
@Override
public Integer apply(IntClientAndMetrics arg0) {
return arg0.getMetrics();
}
}));
}
}