OPENJPA-2253 Add few Audit test

git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@1383729 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Pinaki Poddar 2012-09-12 01:28:31 +00:00
parent ae3441b049
commit 0ae1199283
3 changed files with 67 additions and 1 deletions

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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>