import cn.danielw.fop.ObjectFactory;
import cn.danielw.fop.ObjectPool;
import cn.danielw.fop.PoolConfig;
import cn.danielw.fop.Poolable;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import static org.junit.Assert.assertEquals;
public class TestObjectPool {
public ObjectPool init(double scavengeRatio) {
Logger.getLogger("").getHandlers()[0].setLevel(Level.ALL);
Logger.getLogger("").setLevel(Level.ALL);
PoolConfig config = new PoolConfig();
config.setPartitionSize(2).setMinSize(2).setMaxSize(20).setMaxIdleMilliseconds(5000).
setScavengeIntervalMilliseconds(5000).setScavengeRatio(scavengeRatio);
ObjectFactory<StringBuilder> factory = new ObjectFactory<StringBuilder>() {
@Override
public StringBuilder create() {
return new StringBuilder();
}
@Override
public void destroy(StringBuilder o) {
}
@Override
public boolean validate(StringBuilder o) {
return true;
}
};
return new ObjectPool(config, factory);
}
@Test
public void testSimple() throws InterruptedException {
ObjectPool pool = init(1.0);
for (int i = 0; i < 100; i++) {
try (Poolable<StringBuilder> obj = pool.borrowObject()) {
obj.getObject().append("x");
}
}
System.out.println("pool size:" + pool.getSize());
assertEquals(4, pool.getSize());
}
@Test
public void testShrink() throws InterruptedException {
final ObjectPool pool = init(1.0);
List<Poolable<StringBuilder>> borrowed = new ArrayList<>();
for (int i = 0; i < 10; i++) {
System.out.println("test borrow");
Poolable<StringBuilder> obj = pool.borrowObject();
obj.getObject().append("x");
borrowed.add(obj);
}
System.out.println("pool size:" + pool.getSize());
for (Poolable<StringBuilder> obj : borrowed) {
System.out.println("test return");
pool.returnObject(obj);
}
assertEquals(12, pool.getSize());
System.out.println("pool size:" + pool.getSize());
Thread.sleep(20000);
assertEquals(4, pool.getSize());
System.out.println("scavenged, pool size=" + pool.getSize());
// test return after shutdown
Thread testThread = new Thread() {
@Override
public void run() {
Poolable<StringBuilder> obj = pool.borrowObject();
try {
System.out.println("pool size:" + pool.getSize());
Thread.sleep(10000);
} catch (InterruptedException e) {
}
pool.returnObject(obj);
System.out.println("pool size:" + pool.getSize());
}
};
testThread.start();
testThread.join();
int removed = pool.shutdown(); // this will block 9 seconds
assertEquals(4, removed);
System.out.println("All done");
}
}