User: mulder  
  Date: 00/06/04 18:18:33

  Added:       src/main/test/jboss/minerva/pools ObjectPoolTest.java
  Log:
  Add jBoss test suite - and the one class of tests it is composed of right
  now.  Hopefully more to follow shortly...
  
  Get JUnit from www.xprogramming.com/software.htm and try something like:
  
  java -classpath junit.jar:jboss/build/classes junit.ui.TestRunner 
test.jboss.JBossTestSuite
  
  Revision  Changes    Path
  1.1                  jboss/src/main/test/jboss/minerva/pools/ObjectPoolTest.java
  
  Index: ObjectPoolTest.java
  ===================================================================
  /*
   * jBoss, the OpenSource EJB server
   *
   * Distributable under GPL license.
   * See terms of license at gnu.org.
   */
  package test.jboss.minerva.pools;
  
  import java.io.PrintWriter;
  import java.sql.SQLException;
  import java.util.*;
  import junit.framework.TestCase;
  import org.jboss.minerva.pools.*;
  
  /**
   * JUnit tests for ObjectPool class.  Doesn't test some of the subtleties or
   * data not accessible via the public interface, but tests every
   * public method at least once (except toString).
   * @version $Revision: 1.1 $
   * @author Aaron Mulder ([EMAIL PROTECTED])
   */
  public class ObjectPoolTest extends TestCase {
      private ObjectPool pool;
      private PoolObjectFactory factory;
      private String name;
  
      public ObjectPoolTest(String s) {
          super(s);
      }
  
  // setup for tests
  
      public void setUp() {
          pool = new ObjectPool();
          factory = new PoolObjectFactory() {
              public Object createObject() {
                  return new Object();
              }
          };
          name = "TestPool";
      }
  
      private void startPool() {
          pool.setName(name);
          pool.setObjectFactory(factory);
      }
  
  // Parameter tests
  
      public void testParamName() {
          try {
              assert(pool.getName() == null);
              pool.setName("");
              assert(pool.getName().equals(""));
              fail("Able to set pool name to empty string!");
          } catch(IllegalArgumentException e) {
              try {
                  assert(pool.getName() == null);
                  pool.setName(null);
                  fail("Able to set pool name to null!");
              } catch(IllegalArgumentException e2) {
                  assert(pool.getName() == null);
                  pool.setName(name);
                  assert(pool.getName().equals(name));
                  pool.setName(name);
                  try {
                      pool.setName(pool.getName()+"name");
                      fail("Able to change pool name after set!");
                  } catch(IllegalStateException e3) {
                  }
              }
          }
      }
  
      public void testParamBlocking() {
          pool.setBlocking(true);
          assert(pool.isBlocking());
          pool.setBlocking(false);
          assert(!pool.isBlocking());
      }
  
      public void testParamShrinking() {
          pool.setShrinkingEnabled(true);
          assert(pool.isShrinkingEnabled());
          pool.setShrinkingEnabled(false);
          assert(!pool.isShrinkingEnabled());
      }
  
      public void testParamGC() {
          pool.setGCEnabled(true);
          assert(pool.isGCEnabled());
          pool.setGCEnabled(false);
          assert(!pool.isGCEnabled());
      }
  
      public void testParamTimestamp() {
          pool.setTimestampUsed(true);
          assert(pool.isTimestampUsed());
          pool.setTimestampUsed(false);
          assert(!pool.isTimestampUsed());
      }
  
      public void testParamGCInterval() {
          pool.setGCInterval(4391l);
          assert(pool.getGCInterval() == 4391l);
          pool.setGCInterval(9734l);
          assert(pool.getGCInterval() == 9734l);
      }
  
      public void testParamGCMinIdle() {
          pool.setGCMinIdleTime(4391l);
          assert(pool.getGCMinIdleTime() == 4391l);
          pool.setGCMinIdleTime(9734l);
          assert(pool.getGCMinIdleTime() == 9734l);
      }
  
      public void testParamShrinkMinIdle() {
          pool.setShrinkMinIdleTime(4391l);
          assert(pool.getShrinkMinIdleTime() == 4391l);
          pool.setShrinkMinIdleTime(9734l);
          assert(pool.getShrinkMinIdleTime() == 9734l);
      }
  
      public void testParamShrinkPercent() {
          pool.setShrinkPercent(0.5f);
          assert(pool.getShrinkPercent() == 0.5f);
          pool.setShrinkPercent(0.2f);
          assert(pool.getShrinkPercent() == 0.2f);
          try {
              pool.setShrinkPercent(-0.01f);
              fail("Pool allowed negative shrink percent!");
          } catch(IllegalArgumentException e) {}
          try {
              pool.setShrinkPercent(1.01f);
              fail("Pool allowed shrink percent >1!");
          } catch(IllegalArgumentException e) {}
      }
  
      public void testParamLogWriter() {
          PrintWriter writer = new PrintWriter(System.out);
          try {
              pool.setLogWriter(writer);
              assert(pool.getLogWriter() == writer);
              pool.setLogWriter(null);
              assert(pool.getLogWriter() == null);
          } catch(SQLException e) {
              fail(e.getMessage());
          }
      }
  
      public void testParamMinSize() {
          pool.setMinSize(4);
          assert(pool.getMinSize() == 4);
          pool.setMinSize(8);
          assert(pool.getMinSize() == 8);
      }
  
      public void testParamMaxSize() {
          pool.setMaxSize(4);
          assert(pool.getMaxSize() == 4);
          pool.setMaxSize(8);
          assert(pool.getMaxSize() == 8);
      }
  
  // Initialization tests
  
      public void testNeedsName() {
          pool.setObjectFactory(factory);
          try {
              pool.initialize();
          } catch(IllegalStateException e) {
              return;
          }
          fail("Pool initialized without pool name!");
      }
  
      public void testNeedsFactory() {
          pool.setName(name);
          try {
              pool.initialize();
          } catch(IllegalStateException e) {
              return;
          }
          fail("Pool initialized without pool factory!");
      }
  
      public void testNeedsInitialize() {
          pool.setName(name);
          pool.setObjectFactory(factory);
          try {
              Object o = pool.getObject();
          } catch(IllegalStateException e) {
              return;
          }
          fail("Pool got object without initializing!");
      }
  
      public void testMinimumParameters() {
          pool.setName(name);
          pool.setObjectFactory(factory);
          pool.initialize();
          Object o = pool.getObject();
          assert(o != null);
          pool.shutDown();
      }
  
  // Test pool behavior
  
      public void testPoolMax() {
          Vector v = new Vector();
          startPool();
          pool.setMinSize(0);
          pool.setMaxSize(5);
          pool.setBlocking(false);
          pool.initialize();
          for(Object o = pool.getObject(); o != null; o = pool.getObject()) {
              assert(!v.contains(o));
              v.addElement(o);
              assert(v.size() <= pool.getMaxSize());
          }
          assert(v.size() == pool.getMaxSize());
          for(int i=0; i<v.size(); i++)
              pool.releaseObject(v.elementAt(i));
          pool.shutDown();
      }
  
      public void testEvents() {
          Stack s = new Stack();
          startPool();
          pool.setMinSize(0);
          pool.setMaxSize(10);
          pool.setBlocking(false);
          pool.initialize();
          for(Object o = pool.getObject(); o != null; o = pool.getObject()) {
              s.push(o);
          }
          int count = 0;
          while(!s.isEmpty()) {
              Object o = s.pop();
              pool.objectUsed(new PoolEvent(o, PoolEvent.OBJECT_USED));
              if(++count%2 == 0)
                  pool.objectClosed(new PoolEvent(o, PoolEvent.OBJECT_CLOSED));
              else
                  pool.objectError(new PoolEvent(o, PoolEvent.OBJECT_ERROR));
          }
          count = 0;
          for(Object o = pool.getObject(); o != null; o = pool.getObject()) {
              s.push(o);
              ++count;
          }
          while(!s.isEmpty())
              pool.releaseObject(s.pop());
          assert(count == pool.getMaxSize());
          pool.shutDown();
      }
  
      public void testShutdown() {
          class MyFactory extends PoolObjectFactory {
              private HashSet objects = new HashSet();
  
              public Object createObject() {
                  Object o = new Object();
                  objects.add(o);
                  return o;
              }
  
              public void deleteObject(Object o) {
                  objects.remove(o);
              }
  
              public boolean isEmpty() {
                  return objects.isEmpty();
              }
          };
          MyFactory fac = new MyFactory();
          Stack s = new Stack();
          pool.setName(name);
          pool.setObjectFactory(fac);
          pool.setMinSize(0);
          pool.setMaxSize(10);
          pool.setBlocking(false);
          pool.initialize();
          for(Object o = pool.getObject(); o != null; o = pool.getObject()) {
              s.push(o);
          }
          assert(!fac.isEmpty());
          pool.shutDown();
          assert(fac.isEmpty());
      }
  
      public void testLastUpdatesEnabled() {
          startPool();
          pool.setMinSize(0);
          pool.setMaxSize(5);
          pool.setBlocking(false);
          pool.setTimestampUsed(true);
          pool.initialize();
          testLastUpdates();
      }
  
      public void testLastUpdatesDisabled() {
          startPool();
          pool.setMinSize(0);
          pool.setMaxSize(5);
          pool.setBlocking(false);
          pool.setTimestampUsed(false);
          pool.initialize();
          testLastUpdates();
      }
  
      private void testLastUpdates() {
          Stack s = new Stack();
          for(Object o = pool.getObject(); o != null; o = pool.getObject()) {
              s.push(o);
              pool.setLastUsed(o);
          }
          try {
              pool.setLastUsed(new Object());
              if(pool.isTimestampUsed())
                  fail("Pool set last used time for object not in the pool!");
          } catch(IllegalArgumentException e) {}
          while(!s.isEmpty()) {
              Object o = s.pop();
              pool.setLastUsed(o);
              pool.releaseObject(o);
              try {
                  pool.setLastUsed(o);
                  if(pool.isTimestampUsed())
                      fail("Pool set last used time for object not currently in use!");
              } catch(IllegalStateException e) {}
          }
          pool.shutDown();
      }
  
      public void testPoolBlocking() {
          final Stack s = new Stack();
          startPool();
          pool.setMinSize(0);
          pool.setMaxSize(5);
          pool.setBlocking(true);
          pool.initialize();
          class LocalRun implements Runnable { // Need something to unblock
              private boolean done = false;    // the main thread periodically
              public void run() {
                  while(!done) {
                      try {
                          Thread.currentThread().sleep(500);
                      } catch(InterruptedException e) {}
                      Object o = s.pop();
                      pool.releaseObject(o);
                      if(s.isEmpty()) {
                          done = true;
                          synchronized(this) {notify();}
                      }
                  }
              }
              public synchronized void waitForFinish() {
                  while(!done)
                      try {
                          wait();
                      } catch(InterruptedException e) {}
              }
          };
          LocalRun r = new LocalRun();
          s.push(pool.getObject());
          new Thread(r).start();
          for(int i=1; i<8; i++) {
              Object o = pool.getObject();
              assert(o != null);
              s.push(o);
          }
          r.waitForFinish();
          pool.shutDown();
      }
  
      /**
       * Does a random walk of adding/removing for a lot of steps.  Tests that
       * there are not more objects created than the max pool size, that objects
       * are null if and only if the pool is fully utilized, etc.
       */
      public void testManyGets() {
          final int MAX = 10000;
          Stack s = new Stack();
          HashSet h = new HashSet();
          Random r = new Random();
          boolean add = true;
  
          startPool();
          pool.setMinSize(0);
          pool.setMaxSize(5);
          pool.setBlocking(false);
          pool.initialize();
  
          for(int i=0; i<MAX; i++) {
              if(s.size() == 0) add = true;
              else add = r.nextBoolean();
              if(add) {
                  Object o = pool.getObject();
                  assert((s.size() == pool.getMaxSize() && o == null) ||
                         (s.size() < pool.getMaxSize() && o != null));
                  if(o == null) continue;
                  s.push(o);
                  if(!h.contains(o)) h.add(o);
                  assert(h.size() <= pool.getMaxSize());
              } else {
                  pool.releaseObject(s.pop());
              }
          }
  
          while(!s.empty())
              pool.releaseObject(s.pop());
          pool.shutDown();
      }
  
      public void testSetsAfterInit() {
          startPool();
          pool.setBlocking(false);
          pool.setGCEnabled(false);
          pool.setGCInterval(1000l);
          pool.setGCMinIdleTime(1000l);
          try {
              pool.setLogWriter(new PrintWriter(System.out));
          } catch(SQLException e) {
              fail(e.getMessage());
          }
          pool.setMaxSize(10);
          pool.setMinSize(4);
          pool.setShrinkingEnabled(false);
          pool.setShrinkMinIdleTime(1000l);
          pool.setShrinkPercent(0.5f);
          pool.setTimestampUsed(false);
          pool.initialize();
          try {
              pool.setBlocking(true);
              fail("Pool allowed setBlocking after initialize!");
          } catch(IllegalStateException e) {}
          try {
              pool.setGCEnabled(true);
              fail("Pool allowed setGCEnabled after initialize!");
          } catch(IllegalStateException e) {}
          try {
              pool.setGCInterval(2000l);
              fail("Pool allowed setGCInterval after initialize!");
          } catch(IllegalStateException e) {}
          try {
              pool.setGCMinIdleTime(2000l);
              fail("Pool allowed setGCMinIdleTime after initialize!");
          } catch(IllegalStateException e) {}
          try {
              pool.setLogWriter(new PrintWriter(System.out));
              fail("Pool allowed setLogWriter after initialize!");
          } catch(SQLException e) {
              fail(e.getMessage());
          } catch(IllegalStateException e) {
          }
          try {
              pool.setMaxSize(5);
              fail("Pool allowed setMax after initialize!");
          } catch(IllegalStateException e) {}
          try {
              pool.setMinSize(3);
              fail("Pool allowed setMinSize after initialize!");
          } catch(IllegalStateException e) {}
          try {
              pool.setShrinkingEnabled(true);
              fail("Pool allowed setShrinkingEnabled after initialize!");
          } catch(IllegalStateException e) {}
          try {
              pool.setShrinkMinIdleTime(2000l);
              fail("Pool allowed setShrinkMinIdleTime after initialize!");
          } catch(IllegalStateException e) {}
          try {
              pool.setShrinkPercent(0.2f);
              fail("Pool allowed setShrinkPercent after initialize!");
          } catch(IllegalStateException e) {}
          try {
              pool.setTimestampUsed(true);
              fail("Pool allowed setTimestampUsed after initialize!");
          } catch(IllegalStateException e) {}
          pool.shutDown();
      }
  }
  
  

Reply via email to