You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2012/09/12 03:28:32 UTC

svn commit: r1383729 - in /openjpa/trunk/openjpa-persistence-jdbc/src/test: java/org/apache/openjpa/audit/TestAudit.java java/org/apache/openjpa/audit/X.java resources/META-INF/persistence.xml

Author: ppoddar
Date: Wed Sep 12 01:28:31 2012
New Revision: 1383729

URL: http://svn.apache.org/viewvc?rev=1383729&view=rev
Log:
OPENJPA-2253 Add few Audit test

Modified:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/audit/TestAudit.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/audit/X.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/audit/TestAudit.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/audit/TestAudit.java?rev=1383729&r1=1383728&r2=1383729&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/audit/TestAudit.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/audit/TestAudit.java Wed Sep 12 01:28:31 2012
@@ -19,6 +19,8 @@
 package org.apache.openjpa.audit;
 
 
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
 import java.util.List;
 
 import javax.persistence.EntityManager;
@@ -132,6 +134,37 @@ public class TestAudit extends TestCase 
     	assertTrue(entry.getUpdatedFields().contains("price"));
     }
     
+    public void testAuditDoesNotLeakMemory() {
+    	int N = 1000;
+    	EntityManager em = emf.createEntityManager();
+	   	long m2 = insert(N, em);
+    	em = Persistence.createEntityManagerFactory("no-audit").createEntityManager();
+    	assertNull(OpenJPAPersistence.cast(em).getEntityManagerFactory().getConfiguration().getAuditorInstance());
+		long m0 = insert(N, em);
+    	System.err.println("Memory used with no auditor " + m0);
+    	System.err.println("Memory used with auditor " + m2);
+		double pct = 100.0*(m2-m0)/m0;
+		System.err.println("Extra memory with auditor " + pct);
+    	assertTrue(pct < 10.0);
+    }
+    
+    private long insert(int N, EntityManager em) {
+    	assertTrue(ensureGarbageCollection());
+    	long m1 = Runtime.getRuntime().freeMemory();
+    	em.getTransaction().begin();
+    	for (int i = 0; i < N; i++) {
+    		X x = new X();
+    		x.setName("X"+System.currentTimeMillis());
+    		em.persist(x);
+    	}
+    	em.getTransaction().commit();
+    	assertTrue(ensureGarbageCollection());
+    	long m2 = Runtime.getRuntime().freeMemory();
+    	long mused = m1-m2;
+    	
+    	return mused;
+    }
+    
     /**
      * Finds the latest audit entry of the given operation type.
      * The <em>latest</em> is determined by a sort on identifier which is assumed to be monotonically ascending.
@@ -143,6 +176,21 @@ public class TestAudit extends TestCase 
                 .setMaxResults(1).setParameter("op", op).getResultList();
         return entry.get(0);
     }
+    
+	public boolean ensureGarbageCollection() {
+		ReferenceQueue<Object> detector = new ReferenceQueue<Object>();
+		Object marker = new Object();
+		WeakReference<Object> ref = new WeakReference<Object>(marker, detector);
+		marker = null;
+		System.gc();
+		try {
+			return detector.remove() == ref;
+		} catch (InterruptedException e) {
+			
+		}
+		return false;
+	}
+
 
 
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/audit/X.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/audit/X.java?rev=1383729&r1=1383728&r2=1383729&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/audit/X.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/audit/X.java Wed Sep 12 01:28:31 2012
@@ -18,6 +18,8 @@
  */
 package org.apache.openjpa.audit;
 
+import java.util.concurrent.atomic.AtomicLong;
+
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
@@ -34,18 +36,25 @@ import javax.persistence.Id;
 @Auditable
 public class X {
 	@Id
-	@GeneratedValue
 	private long id;
 	
 	private String name;
 	private int price;
 	
+	private static AtomicLong ID_GENERATOR = new AtomicLong(System.currentTimeMillis());
+	
+	public X() {
+		id = ID_GENERATOR.getAndIncrement();
+	}
+	
 	public String getName() {
 		return name;
 	}
+	
 	public void setName(String name) {
 		this.name = name;
 	}
+	
 	public int getPrice() {
 		return price;
 	}

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml?rev=1383729&r1=1383728&r2=1383729&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml Wed Sep 12 01:28:31 2012
@@ -452,6 +452,15 @@
 			<property name="openjpa.DynamicEnhancementAgent" value="false" />
 		</properties>
 	</persistence-unit>
+	<persistence-unit name="no-audit">
+		<class>org.apache.openjpa.audit.X</class>
+		<class>org.apache.openjpa.audit.AuditedEntry</class>
+
+		<properties>
+			<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" />
+			<property name="openjpa.DynamicEnhancementAgent" value="false" />
+		</properties>
+	</persistence-unit>
 
 	<persistence-unit name="query-result">
 		<mapping-file>META-INF/query-result-orm.xml</mapping-file>