You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2004/01/04 00:03:24 UTC

cvs commit: db-ojb/src/test/org/apache/ojb/broker/metadata MetadataMultithreadedTest.java

arminw      2004/01/03 15:03:24

  Modified:    src/test/org/apache/ojb/broker/metadata
                        MetadataMultithreadedTest.java
  Log:
  update test case to detect memory leaks when enable
  per thread metadata changes in MetadataManager
  
  Revision  Changes    Path
  1.5       +92 -13    db-ojb/src/test/org/apache/ojb/broker/metadata/MetadataMultithreadedTest.java
  
  Index: MetadataMultithreadedTest.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/broker/metadata/MetadataMultithreadedTest.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- MetadataMultithreadedTest.java	19 Dec 2003 16:34:32 -0000	1.4
  +++ MetadataMultithreadedTest.java	3 Jan 2004 23:03:24 -0000	1.5
  @@ -1,16 +1,20 @@
   package org.apache.ojb.broker.metadata;
   
  +import java.util.ArrayList;
  +import java.util.List;
  +
  +import org.apache.commons.lang.ClassUtils;
   import org.apache.ojb.broker.JUnitExtensions;
   import org.apache.ojb.broker.OJBRuntimeException;
   import org.apache.ojb.broker.PersistenceBroker;
   import org.apache.ojb.broker.PersistenceBrokerFactory;
  -import org.apache.ojb.broker.util.ClassHelper;
  -import org.apache.ojb.broker.query.Criteria;
  +import org.apache.ojb.broker.Project;
  +import org.apache.ojb.broker.Person;
  +import org.apache.ojb.broker.Role;
   import org.apache.ojb.broker.query.Query;
   import org.apache.ojb.broker.query.QueryByCriteria;
   import org.apache.ojb.broker.sequence.Repository;
  -import org.apache.ojb.odmg.PersonImpl;
  -import org.apache.commons.lang.ClassUtils;
  +import org.apache.ojb.broker.util.ClassHelper;
   
   /**
    *
  @@ -55,8 +59,12 @@
   
       public void testRuntimeMetadataChanges() throws Exception
       {
  -        int loops = 5;
  -        int threads = 5;
  +        int loops = 7;
  +        int threads = 8;
  +        // need min 80% free memory after test campared with
  +        // beginning, else test fails
  +        int minimalFreeMemAfterTest = 80;
  +
           PersistenceBroker broker = null;
           try
           {
  @@ -67,7 +75,8 @@
               mm.setDescriptor(defaultRepository);
   
               ClassDescriptor cld;
  -
  +            long memoryUseBeforeTest;
  +            long memoryUseAfterTest;
               try
               {
                   // prepare for test
  @@ -114,8 +123,12 @@
                   Runtime.getRuntime().gc();
                   Thread.sleep(200);
                   Runtime.getRuntime().gc();
  -                System.out.println("Free/total Memory after test after gc:   "
  -                        + convertToMB(Runtime.getRuntime().freeMemory())
  +                Runtime.getRuntime().gc();
  +
  +                memoryUseBeforeTest = convertToMB(memory);
  +                memoryUseAfterTest = convertToMB(Runtime.getRuntime().freeMemory());
  +                System.out.println("Free/total Memory after test and gc:   "
  +                        + memoryUseAfterTest
                           + "/" + convertToMB(Runtime.getRuntime().maxMemory()) + "MB");
                   System.out.println("Do cleanup now ...");
               }
  @@ -123,12 +136,22 @@
               {
                   MetadataManager.getInstance().setEnablePerThreadChanges(false);
               }
  -
  +            // get new PB instance
               broker = PersistenceBrokerFactory.defaultPersistenceBroker();
               cld = broker.getClassDescriptor(targetTestClass);
               String name = cld.getFullTableName();
               assertEquals(oldTestObjectString, name);
               assertFalse(MetadataManager.getInstance().isEnablePerThreadChanges());
  +            double d = ((double) memoryUseAfterTest) / ((double) memoryUseBeforeTest);
  +            int result = (int) (d * 100);
  +            if (result < minimalFreeMemAfterTest)
  +            {
  +                fail("** When using a offical version of OJB, ignore this failure! **" +
  +                        " Memory usage after this test differs more than "+(100 - minimalFreeMemAfterTest)
  +                        +"% from beginning, this may indicate" +
  +                        " a memory leak (GC can't free unused metadata objects), but this could also be a result" +
  +                        " of your JVM settings. Please re-run test.");
  +            }
           }
           finally
           {
  @@ -147,6 +170,7 @@
       class ThreadedUsingBroker extends JUnitExtensions.MultiThreadedTestCase.TestCaseRunnable
       {
           int loops;
  +        String title = "ThreadedUsingBroker_" + System.currentTimeMillis();
   
           public ThreadedUsingBroker()
           {
  @@ -192,17 +216,59 @@
                       String name = cld.getFullTableName();
                       assertEquals(newTestObjectString, name);
                       assertTrue(MetadataManager.getInstance().isEnablePerThreadChanges());
  -                    // query the object
  -                    Query query = new QueryByCriteria(PersonImpl.class, (Criteria) null, true);
  +
  +                    // query a test object
  +                    Query query = new QueryByCriteria(Person.class, null, true);
                       broker.getCollectionByQuery(query);
                       // store target object
  +                    /*
  +                    store some complex objects to check if references to
  +                    metadata classes are cached
  +                    */
  +                    Project project = new Project();
  +                    project.setTitle(title);
  +
  +                    Person p1 = new Person();
  +                    p1.setFirstname(title);
  +                    List l1 = new ArrayList();
  +                    l1.add(project);
  +                    p1.setProjects(l1);
  +
  +                    Person p2 = new Person();
  +                    p2.setFirstname(title);
  +                    List l2 = new ArrayList();
  +                    l2.add(project);
  +                    p2.setProjects(l2);
  +
  +                    Role r1 = new Role();
  +                    r1.setPerson(p1);
  +                    r1.setRoleName(title);
  +                    r1.setProject(project);
  +                    List roles1 = new ArrayList();
  +                    roles1.add(r1);
  +
  +                    Role r2 = new Role();
  +                    r2.setPerson(p2);
  +                    r2.setRoleName(title);
  +                    r2.setProject(project);
  +                    List roles2 = new ArrayList();
  +                    roles2.add(r2);
  +
  +                    p1.setRoles(roles1);
  +                    p2.setRoles(roles2);
  +
                       Object obj = ClassHelper.newInstance(targetTestClass);
  +
                       broker.beginTransaction();
                       broker.store(obj);
  +                    broker.store(p1);
  +                    broker.store(p2);
                       broker.commitTransaction();
                       // delete target object
                       broker.beginTransaction();
                       broker.delete(obj);
  +                    //broker.delete(p1);
  +                    //broker.delete(p2);
                       broker.commitTransaction();
                   }
                   finally
  @@ -266,6 +332,19 @@
                           // this PB instance use unchanged global metadata repository
                           assertEquals(getTestObjectString(), name);
                           // System.out.println("Default: found "+name);
  +
  +                        // query a test object
  +                        Query query = new QueryByCriteria(Person.class, null, true);
  +                        broker.getCollectionByQuery(query);
  +                        // store target object
  +                        Object obj = ClassHelper.newInstance(targetTestClass);
  +                        broker.beginTransaction();
  +                        broker.store(obj);
  +                        broker.commitTransaction();
  +                        // delete target object
  +                        broker.beginTransaction();
  +                        broker.delete(obj);
  +                        broker.commitTransaction();
                       }
                       finally
                       {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org