package org.ow2.choreos.selector;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.ow2.choreos.selectors.NotSelectedException;
import org.ow2.choreos.selectors.SingletonSelector;
import org.ow2.choreos.utils.Concurrency;
public class SingletonSelectorTest {
private SingletonSelector<String, String> selector;
private StringFactory factory = new StringFactory();
private String requirements = "requirements";
private Logger logger = Logger.getLogger(SingletonSelectorTest.class);
@Test
public void shouldAlwaysReturnTheSameObject() throws NotSelectedException {
selector = new SingletonSelector<String, String>(factory);
String object1 = selector.select(requirements, 1).get(0);
String object2 = selector.select(requirements, 1).get(0);
assertTrue(object1 == object2);
}
@Test
public void shouldConcurrentlyAlwaysReturnTheSameObject() throws InterruptedException, ExecutionException {
final int THREADS_NUM = 3;
ExecutorService executor = Executors.newFixedThreadPool(THREADS_NUM);
selector = new SingletonSelector<String, String>(factory);
List<Future<String>> futures = new ArrayList<Future<String>>();
for (int i = 0; i < THREADS_NUM; i++) {
SelectorTask task = new SelectorTask();
Future<String> f = executor.submit(task);
futures.add(f);
}
Concurrency.waitExecutor(executor, factory.getTimeoutInSeconds(), TimeUnit.SECONDS, logger, "pam!");
String previousObject = futures.get(0).get();
for (Future<String> f : futures) {
String object = f.get();
assertEquals(previousObject, object);
previousObject = object;
}
}
private class SelectorTask implements Callable<String> {
@Override
public String call() throws Exception {
return selector.select(requirements, 1).get(0);
}
}
}