You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by dw...@apache.org on 2010/04/07 04:18:26 UTC

svn commit: r931406 - /openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/batch/exception/TestBatchLimitException.java

Author: dwoods
Date: Wed Apr  7 02:18:26 2010
New Revision: 931406

URL: http://svn.apache.org/viewvc?rev=931406&view=rev
Log:
OPENJPA-1550 Fix TestBatchLimitException tests for Oracle, which fails all statements in the batch, instead of just the duplicate entity.

Modified:
    openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/batch/exception/TestBatchLimitException.java

Modified: openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/batch/exception/TestBatchLimitException.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/batch/exception/TestBatchLimitException.java?rev=931406&r1=931405&r2=931406&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/batch/exception/TestBatchLimitException.java (original)
+++ openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/batch/exception/TestBatchLimitException.java Wed Apr  7 02:18:26 2010
@@ -21,6 +21,10 @@ package org.apache.openjpa.persistence.b
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 
+import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
+import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.jdbc.sql.OracleDictionary;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
 import org.apache.openjpa.persistence.test.PersistenceTestCase;
 import org.apache.openjpa.util.ExceptionInfo;
 
@@ -33,11 +37,16 @@ import org.apache.openjpa.util.Exception
 public class TestBatchLimitException extends PersistenceTestCase {
 
     static Ent1 expectedFailedObject;
+    static Ent1 expectedFailedObjectOracle;
+    static boolean isOracle = false;
     final String expectedFailureMsg =
         "INSERT INTO Ent1 (pk, name) VALUES (?, ?) [params=(int) 200, (String) twohundred]";
+    final String expectedFailureMsg18 =
+        "INSERT INTO Ent1 (pk, name) VALUES (?, ?) [params=(int) 18, (String) name18]";
+    String expectedFailureMsgOracle = expectedFailureMsg18;
 
     public EntityManagerFactory newEmf(String batchLimit) {
-        EntityManagerFactory emf =
+        OpenJPAEntityManagerFactorySPI emf =
             createEMF(Ent1.class, 
                 "openjpa.jdbc.SynchronizeMappings", 
                 "buildSchema(ForeignKeys=true)",
@@ -45,11 +54,15 @@ public class TestBatchLimitException ext
                 CLEAR_TABLES);
 
         assertNotNull("Unable to create EntityManagerFactory", emf);
+        JDBCConfiguration conf = (JDBCConfiguration) emf.getConfiguration();
+        DBDictionary dict = conf.getDBDictionaryInstance();
+        isOracle = dict instanceof OracleDictionary;
         return emf;
     }
 
     public void setUp() {
         expectedFailedObject = null;
+        expectedFailedObjectOracle = null;
     }
 
     // Test that we get the correct 'failed object' when we have a batchLimt
@@ -71,7 +84,10 @@ public class TestBatchLimitException ext
         EntityManager em2 = emf.createEntityManager();
 
         em2.getTransaction().begin();
-        em2.persist(new Ent1(0, "zero"));
+        // special case, due to how Oracle returns all statements in the batch
+        expectedFailedObjectOracle = new Ent1(18, "name18");
+        expectedFailureMsgOracle = expectedFailureMsg18;
+        em2.persist(expectedFailedObjectOracle);
         em2.persist(new Ent1(2, "two"));
         em2.persist(new Ent1(200, "twohundred"));
         em2.persist(new Ent1(3, "three"));
@@ -101,6 +117,8 @@ public class TestBatchLimitException ext
 
         em.getTransaction().begin();
         expectedFailedObject = new Ent1(200, "twohundred");
+        expectedFailedObjectOracle = expectedFailedObject;
+        expectedFailureMsgOracle = expectedFailureMsg;
         em.persist(expectedFailedObject);
         em.getTransaction().commit();
         em.close();
@@ -140,6 +158,8 @@ public class TestBatchLimitException ext
 
         em.getTransaction().begin();
         expectedFailedObject = new Ent1(200, "twohundred");
+        expectedFailedObjectOracle = expectedFailedObject;
+        expectedFailureMsgOracle = expectedFailureMsg;
         em.persist(expectedFailedObject);
         em.getTransaction().commit();
         em.close();
@@ -176,7 +196,8 @@ public class TestBatchLimitException ext
     // it somewhere in the middle of the third batch. Again, we want to make sure our
     // indexing into the batch containing the 'failed object' is correct.
     public void testExceptionInThirdBatch() throws Throwable {
-        EntityManagerFactory emf = newEmf("batchLimit=9");
+        final int batchLimit=9;
+        EntityManagerFactory emf = newEmf("batchLimit="+batchLimit);
         EntityManager em = emf.createEntityManager();
 
         em.getTransaction().begin();
@@ -191,15 +212,22 @@ public class TestBatchLimitException ext
 
         // Persist 21 objects/rows....as such we will have two 'full'
         // batches (9*2=18) and 3 (21-18=3) objects/rows in the 3rd batch.
-        for (int i = 0; i < 22; i++) {
+        int i=0;
+        for (; i < 2*batchLimit; i++) {
             em2.persist(new Ent1(i, "name" + i));
         }
 
+        // manually create third batch, due to how Oracle returns all statements in the batch
+        expectedFailedObjectOracle = new Ent1(i, "name" + i++);
+        expectedFailureMsgOracle = expectedFailureMsg18;
+        em2.persist(expectedFailedObjectOracle);    // 18
+        em2.persist(new Ent1(i, "name" + i++));     // 19
+        em2.persist(new Ent1(i, "name" + i++));     // 20
+        em2.persist(new Ent1(i, "name" + i++));     // 21        
         // Put the duplicate row in the 3rd batch.
         em2.persist(new Ent1(200, "twohundred"));
-
         // Put a few more objects into the batch.
-        for (int i = 22; i < 40; i++) {
+        for (i = 22; i < 4*batchLimit; i++) {
             em2.persist(new Ent1(i, "name" + i));
         }
 
@@ -222,6 +250,8 @@ public class TestBatchLimitException ext
     // again with failures again.....just want to make sure things are not in
     // some way 're-used' between the two commits as far as the indexes go.
     public void testSecondExceptionHasRightIndex() throws Throwable {
+        final int batchLimit=9;
+
         testExceptionInThirdBatch();
 
         EntityManagerFactory emf = newEmf("batchLimit=9");
@@ -229,13 +259,16 @@ public class TestBatchLimitException ext
 
         em.getTransaction().begin();
 
-        for (int i = 40; i < 55; i++) {
+        for (int i = 4*batchLimit; i < 5*batchLimit; i++) {
             em.persist(new Ent1(i, "name" + i));
         }
 
-        em.persist(new Ent1(200, "twohundred"));
+        // manually capture start of batch, due to how Oracle returns all statements in the batch
+        expectedFailedObjectOracle = new Ent1(200, "twohundred");
+        expectedFailureMsgOracle = expectedFailureMsg;
+        em.persist(expectedFailedObjectOracle);
 
-        for (int i = 55; i < 65; i++) {
+        for (int i = 5*batchLimit; i < 7*batchLimit; i++) {
             em.persist(new Ent1(i, "name" + i));
         }
 
@@ -267,12 +300,17 @@ public class TestBatchLimitException ext
 
         EntityManager em2 = emf.createEntityManager();
         em2.getTransaction().begin();
+        em2.persist(new Ent1(4, "four"));
         em2.persist(new Ent1(0, "zero"));
         em2.persist(new Ent1(2, "two"));
         em2.persist(new Ent1(3, "three"));
         em2.getTransaction().commit();
 
         em2.getTransaction().begin();
+        // special case, due to how Oracle returns all statements in the batch
+        expectedFailedObjectOracle = new Ent1(18, "name18");
+        expectedFailureMsgOracle = expectedFailureMsg18;
+        em2.persist(expectedFailedObjectOracle);
         em2.persist(new Ent1(6, "six"));
         em2.persist(new Ent1(200, "twohundred"));
         em2.persist(new Ent1(7, "seven"));
@@ -308,7 +346,12 @@ public class TestBatchLimitException ext
             Ent1 failedObject = (Ent1) e.getFailedObject();
 
             assertNotNull("Failed object was null.", failedObject);
-            assertEquals(expectedFailedObject, failedObject);
+            if (!isOracle) {
+                assertEquals(expectedFailedObject, failedObject);
+            } else {
+                // special case, as Oracle returns all statements in the batch
+                assertEquals(expectedFailedObjectOracle, failedObject);                
+            }
         }
         else {
             throw excp;
@@ -317,8 +360,14 @@ public class TestBatchLimitException ext
 
     public void verifyExMsg(String msg) {
         assertNotNull("Exception message was null.", msg);
-        assertTrue("Did not see expected text in message. Expected <" + expectedFailureMsg + "> but was " + msg, msg
-            .contains(expectedFailureMsg));
+        if (!isOracle) {
+            assertTrue("Did not see expected text in message. Expected <" + expectedFailureMsg + "> but was " +
+                msg, msg.contains(expectedFailureMsg));
+        } else {
+            // special case, as Oracle returns all statements in the batch
+            assertTrue("Did not see expected text in message. Expected <" + expectedFailureMsgOracle + "> but was " +
+                msg, msg.contains(expectedFailureMsgOracle));
+        }
     }
 }