package org.infinispan.client.hotrod;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.fail;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.pool.BaseKeyedPoolableObjectFactory;
import org.apache.commons.pool.KeyedObjectPool;
import org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory;
import org.testng.annotations.Test;
/**
* // TODO: Document this
*
* @author Galder ZamarreƱo
* @since // TODO
*/
@Test(groups = "functional", testName = "client.hotrod.ApacheCommonsPoolTest")
public class ApacheCommonsPoolTest {
public void testBorrowValidObjectFromPool() throws Exception {
KeyedObjectPool<Integer, String> pool =
BasicPoolFactory.createPoolFactory().createPool();
String obj = pool.borrowObject(1);
assertEquals("1", obj);
}
@Test(expectedExceptions = TooHighException.class)
public void testBorrowFromPoolException() throws Exception {
GenericKeyedObjectPoolFactory<Integer, String> poolFactory =
BasicPoolFactory.createPoolFactory();
try {
poolFactory.createPool().borrowObject(Integer.MAX_VALUE);
} finally {
BasicPoolFactory basicPoolFactory =
(BasicPoolFactory) poolFactory.getFactory();
assertEquals("invalid", basicPoolFactory.getState(Integer.MAX_VALUE));
}
}
public void testInvalidateBorrowFromPool() throws Exception {
GenericKeyedObjectPoolFactory<Integer, String> poolFactory =
BasicPoolFactory.createPoolFactory();
KeyedObjectPool<Integer, String> pool = poolFactory.createPool();
try {
pool.borrowObject(Integer.MAX_VALUE);
fail("Should have thrown a TooHighException");
} catch (TooHighException e) {
// Expected, now invalidate object
pool.invalidateObject(Integer.MAX_VALUE, null);
BasicPoolFactory basicPoolFactory =
(BasicPoolFactory) poolFactory.getFactory();
assertEquals("destroyed", basicPoolFactory.getState(Integer.MAX_VALUE));
}
}
private static class BasicPoolFactory
extends BaseKeyedPoolableObjectFactory<Integer, String> {
private Map<Integer, String> state = new HashMap<Integer, String>();
private BasicPoolFactory() {
// Singleton
}
@Override
public String makeObject(Integer key) throws Exception {
if (Integer.MAX_VALUE == key.intValue()) {
state.put(key, "invalid");
throw new TooHighException("Too high");
}
return key.toString();
}
@Override
public void destroyObject(Integer key, String obj) throws Exception {
state.put(key, "destroyed");
}
public String getState(Integer key) {
return state.get(key);
}
public static GenericKeyedObjectPoolFactory<Integer, String> createPoolFactory() {
return new GenericKeyedObjectPoolFactory<Integer, String>(
new BasicPoolFactory());
}
}
private static class TooHighException extends RuntimeException {
public TooHighException(String message) {
super(message); // TODO: Customise this generated block
}
}
}