Author: arminw
Date: Thu Jan  4 18:32:42 2007
New Revision: 492868

URL: http://svn.apache.org/viewvc?view=rev&rev=492868
Log:
enhance tests and fix problems with Oracle

Modified:
    
db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/lob/LOBTest.java

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/lob/LOBTest.java
URL: 
http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/lob/LOBTest.java?view=diff&rev=492868&r1=492867&r2=492868
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/lob/LOBTest.java 
(original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/lob/LOBTest.java 
Thu Jan  4 18:32:42 2007
@@ -29,9 +29,11 @@
 import org.apache.commons.lang.SerializationUtils;
 import org.apache.ojb.broker.Identity;
 import org.apache.ojb.broker.platforms.PlatformHsqldbImpl;
+import org.apache.ojb.broker.platforms.PlatformOracleImpl;
 import org.apache.ojb.broker.query.Criteria;
 import org.apache.ojb.broker.query.QueryFactory;
 import org.apache.ojb.broker.query.ReportQueryByCriteria;
+import org.apache.ojb.broker.query.Query;
 import org.apache.ojb.broker.util.ObjectModification;
 import org.apache.ojb.junit.PBTestCase;
 
@@ -103,7 +105,7 @@
 
         Criteria crit = new Criteria();
         crit.addNotNull("blob");
-        crit.addEqualTo("id", new Integer(obj.getId()));
+        crit.addEqualTo("id", obj.getId());
         ReportQueryByCriteria q = QueryFactory.newReportQuery(LobObject.class, 
crit);
         q.setAttributes(new String[]{"blob", "clob"});
 
@@ -271,7 +273,7 @@
 
     public void testLobAutoRefresh() throws Exception
     {
-        int size = 50;
+        int size = 2001;
 
         byte[] barr = new byte[size];
         char[] carr = new char[size];
@@ -314,7 +316,7 @@
         }
 
         broker.serviceLobHelper().refreshLob(objRead);
-        assertEquals(50, objRead.getBlob().length());
+        assertEquals(size, objRead.getBlob().length());
         broker.commitTransaction();
 
         broker.beginTransaction();
@@ -325,7 +327,7 @@
         assertNotNull("BLOB was not stored", objRead.getBlob());
         assertNotNull("CLOB was not stored", objRead.getClob());
 
-        assertEquals(50, objRead.getBlob().length());
+        assertEquals(size, objRead.getBlob().length());
         broker.commitTransaction();
     }
 
@@ -350,11 +352,10 @@
         LobObject obj = new LobObject();
         obj.setBlob(b);
         obj.setClob(c);
-
         broker.store(obj);
         broker.commitTransaction();
 
-        //broker.clearCache();
+        broker.clearCache();
         broker.beginTransaction();
         Identity oid = broker.serviceIdentity().buildIdentity(obj);
         LobObject objRead = (LobObject) broker.getObjectByIdentity(oid);
@@ -368,6 +369,39 @@
                 objRead.getClob().getSubString(1, (int) 
objRead.getClob().length()));
         broker.commitTransaction();
 
+        // update object using new LOB objets
+        broker.beginTransaction();
+        byte[] barr2 = new byte[size];
+        StringBuffer buf2 = new StringBuffer();
+        for(int i = 0; i < size; i++)
+        {
+            barr2[i] = (byte) 'u';
+            buf2.append('u');
+        }
+        ByteArrayInputStream in2 = new ByteArrayInputStream(barr2);
+        StringReader reader2 = new StringReader(buf2.toString());
+        Blob b_update = broker.serviceLobHelper().newBlob(in2);
+        Clob c_update = broker.serviceLobHelper().newClob(reader2);
+        obj.setBlob(b_update);
+        obj.setClob(c_update);
+        broker.store(obj, ObjectModification.UPDATE);
+        broker.commitTransaction();
+
+        broker.clearCache();
+        broker.beginTransaction();
+        oid = broker.serviceIdentity().buildIdentity(obj);
+        objRead = (LobObject) broker.getObjectByIdentity(oid);
+        broker.serviceLobHelper().refreshLob(objRead);
+        assertNotNull("BLOB was not stored", objRead.getBlob());
+        assertNotNull("CLOB was not stored", objRead.getClob());
+        result_2 = objRead.getBlob().getBytes(1, (int) 
objRead.getBlob().length());
+        // System.out.println("result: " + result_2.length);
+        assertTrue(ArrayUtils.isEquals(barr2, result_2));
+        assertEquals(buf2.toString(),
+                objRead.getClob().getSubString(1, (int) 
objRead.getClob().length()));
+        broker.commitTransaction();
+
+        // nullify LOB objects
         broker.beginTransaction();
         objRead.setBlob(null);
         objRead.setClob(null);
@@ -387,7 +421,17 @@
             ojbSkipTestMessage("Skip unsupported operation for platform: " + 
getPlatformClass() + ", Blob().setBytes(...)");
             return;
         }
-        doUpdate(UpdateSetBytesSetString);
+        boolean needLock = false;
+        boolean storeObject = true;
+        
if(PlatformOracleImpl.class.isAssignableFrom(broker.serviceConnectionManager().getSupportedPlatform().getClass()))
+        {
+            needLock = true;
+            storeObject = false;
+        }
+        // test small object
+        doUpdate(UpdateSetBytesSetString, 50, needLock, storeObject);
+        // test large objects
+        doUpdate(UpdateSetBytesSetString, 4001, needLock, storeObject);
     }
 
     public void testLOBUpdateSetBlobSetClob() throws Exception
@@ -397,7 +441,10 @@
             ojbSkipTestMessage("Skip unsupported operation for platform: " + 
getPlatformClass() + ", setBlob(...)");
             return;
         }
-        doUpdate(UpdateSetBlobSetClob);
+        // test small object
+        doUpdate(UpdateSetBlobSetClob, 50, false, true);
+        // test large objects
+        doUpdate(UpdateSetBlobSetClob, 4001, false, true);
     }
 
     public void testLOBUpdateSetBinaryStreamSetCharacterStream() throws 
Exception
@@ -407,59 +454,90 @@
             ojbSkipTestMessage("Skip unsupported operation for platform: " + 
getPlatformClass() + ", Blob().setBinaryStream(...)");
             return;
         }
-        doUpdate(UpdateSetBinaryStreamSetCharacterStream);
+        boolean needLock = false;
+        boolean storeObject = true;
+        
if(PlatformOracleImpl.class.isAssignableFrom(broker.serviceConnectionManager().getSupportedPlatform().getClass()))
+        {
+            needLock = true;
+            storeObject = false;
+        }
+        // test small object
+        doUpdate(UpdateSetBinaryStreamSetCharacterStream, 50, needLock, 
storeObject);
+        // test large objects
+        doUpdate(UpdateSetBinaryStreamSetCharacterStream, 4001, 
needLock,storeObject);
     }
 
     final int UpdateSetBlobSetClob = 1;
     final int UpdateSetBytesSetString = 2;
     final int UpdateSetBinaryStreamSetCharacterStream = 3;
 
-    public void doUpdate(int updateType) throws Exception
+    /**
+     * ==>> !!size value have to set >=10!!
+     */
+    void doUpdate(int updateType, int size, boolean needLock, boolean 
needObjectStore) throws Exception
     {
-        byte[] barr = new byte[10];
-        String carr = "yyyyyyyyyy";
-        for(int i = 0; i < 10; i++)
+        // prepare test
+        byte[] byteArr = new byte[size];
+        StringBuffer buf = new StringBuffer();
+        for(int i = 0; i < size; i++)
         {
-            barr[i] = (byte) 'x';
+            byteArr[i] = (byte) 'x';
+            buf.append('y');
         }
+        String clobString = buf.toString();
         byte[] updateByteArr = new byte[]{'u', 'p', 'd', 'a', 't', 'e'};
-        byte[] expectedByte = new byte[]{'u', 'p', 'd', 'a', 't', 'e', 'x', 
'x', 'x', 'x'};
+        byte[] byteArrUpdated = ArrayUtils.addAll(updateByteArr, 
ArrayUtils.subarray(byteArr, 6, byteArr.length));
         String updateString = "update";
-        String expectedString = "updateyyyy";
+        String clobStringUpdated = updateString + clobString.substring(6);
 
         byte[] updateByteArr2 = new byte[]{'u', 'p', 'd', 'a', 't', 'e', '_', 
'2'};
-        byte[] expectedByte2 = new byte[]{'u', 'p', 'd', 'a', 't', 'e', '_', 
'2', 'x', 'x'};
+        byte[] byteArrUpdated2 = ArrayUtils.addAll(updateByteArr2, 
ArrayUtils.subarray(byteArr, 8, byteArr.length));
         String updateString2 = "update_2";
-        String expectedString2 = "update_2yy";
+        String clobStringUpdated2 = updateString2 + clobString.substring(8);
 
-        // insert
+        // start insert
         broker.beginTransaction();
         Blob b = broker.serviceLobHelper().newBlob();
-        b.setBytes(1, barr);
+        b.setBytes(1, byteArr);
         Clob c = broker.serviceLobHelper().newClob();
-        c.setString(1, carr);
+        c.setString(1, clobString);
         LobObject obj = new LobObject();
         obj.setBlob(b);
         obj.setClob(c);
         broker.store(obj);
         broker.commitTransaction();
 
+        // check insert
         broker.clearCache();
         broker.beginTransaction();
         Identity oid = broker.serviceIdentity().buildIdentity(obj);
         LobObject objRead = (LobObject) broker.getObjectByIdentity(oid);
         assertNotNull("BLOB was not stored", objRead.getBlob());
         assertNotNull("CLOB was not stored", objRead.getClob());
+        assertEquals(byteArr.length, objRead.getBlob().length());
+        assertEquals(clobString.length(), objRead.getClob().length());
         byte[] resultArray = objRead.getBlob().getBytes(1, (int) 
objRead.getBlob().length());
-        assertTrue(ArrayUtils.isEquals(barr, resultArray));
-        assertEquals(carr,
-                objRead.getClob().getSubString(1, (int) 
objRead.getClob().length()));
+        assertTrue(ArrayUtils.isEquals(byteArr, resultArray));
+        assertEquals(clobString, objRead.getClob().getSubString(1, (int) 
objRead.getClob().length()));
         broker.commitTransaction();
 
         // update within PB-tx
         broker.beginTransaction();
-        objRead = (LobObject) broker.getObjectByIdentity(oid);
-        broker.serviceLobHelper().refreshLob(objRead);
+        if(needLock)
+        {
+            objRead = (LobObject) broker.getObjectByIdentity(oid);
+            broker.serviceLobHelper().refreshLob(objRead);
+            // workaround to lock the row
+            Query q = QueryFactory.newReportQuery(
+                    LobObject.class, new String[]{"id"}, new 
Criteria().addEqualTo("id", objRead.getId()), false);
+            q.setSelectForUpdate(true);
+            broker.getObjectByQuery(q);
+        }
+        else
+        {
+            objRead = (LobObject) broker.getObjectByIdentity(oid);
+            broker.serviceLobHelper().refreshLob(objRead);
+        }
         try
         {
             switch(updateType)
@@ -475,8 +553,8 @@
                     writer.close();
                     break;
                 case UpdateSetBlobSetClob:
-                    Blob blob = 
broker.serviceLobHelper().newBlob(expectedByte);
-                    Clob clob = 
broker.serviceLobHelper().newClob(expectedString);
+                    Blob blob = 
broker.serviceLobHelper().newBlob(byteArrUpdated);
+                    Clob clob = 
broker.serviceLobHelper().newClob(clobStringUpdated);
                     objRead.setBlob(blob);
                     objRead.setClob(clob);
                     break;
@@ -492,34 +570,46 @@
         {
             ojbSkipTestMessage("Skip unsupported operation for platform: "
                     + getPlatformClass() + ", message: " + e.getMessage());
+            broker.abortTransaction();
             return;
         }
-        broker.store(objRead, ObjectModification.UPDATE);
+        if(needObjectStore) broker.store(objRead, ObjectModification.UPDATE);
         broker.commitTransaction();
 
+        broker.clearCache();
         broker.beginTransaction();
         oid = broker.serviceIdentity().buildIdentity(obj);
         objRead = (LobObject) broker.getObjectByIdentity(oid);
         broker.serviceLobHelper().refreshLob(objRead);
         resultArray = objRead.getBlob().getBytes(1, (int) 
objRead.getBlob().length());
 //        System.out.println("");
-//        System.out.println("# exp: " + ArrayUtils.toString(expectedByte));
+//        System.out.println("# exp: " + ArrayUtils.toString(byteArrUpdated));
 //        System.out.println("# get: " + ArrayUtils.toString(resultArray));
 //        System.out.println("# set: " + updateString);
 //        System.out.println("# get: " + objRead.getClob().getSubString(1, 
(int) objRead.getClob().length()));
-        assertTrue(ArrayUtils.isEquals(expectedByte, resultArray));
-        assertEquals(expectedString,
-                objRead.getClob().getSubString(1, (int) 
objRead.getClob().length()));
+        assertEquals(byteArrUpdated.length, resultArray.length);
+        assertEquals(clobStringUpdated.length(), objRead.getClob().length());
+        assertTrue(ArrayUtils.isEquals(byteArrUpdated, resultArray));
+        assertEquals(clobStringUpdated, objRead.getClob().getSubString(1, 
(int) objRead.getClob().length()));
         broker.commitTransaction();
 
         // try update 2
         broker.beginTransaction();
-
-        // TODO: arminw: seems that under specific conditions this test freeze
-        //here, when test testLOBUpdateSetBlobSetClob() runs against mysql
-        objRead = (LobObject) broker.getObjectByIdentity(oid);
-        broker.serviceLobHelper().refreshLob(objRead);
-
+        if(needLock)
+        {
+            objRead = (LobObject) broker.getObjectByIdentity(oid);
+            broker.serviceLobHelper().refreshLob(objRead);
+            // workaround to lock the row
+            Query q = QueryFactory.newReportQuery(
+                    LobObject.class, new String[]{"id"}, new 
Criteria().addEqualTo("id", objRead.getId()), false);
+            q.setSelectForUpdate(true);
+            broker.getObjectByQuery(q);
+        }
+        else
+        {
+            objRead = (LobObject) broker.getObjectByIdentity(oid);
+            broker.serviceLobHelper().refreshLob(objRead);
+        }
         try
         {
             switch(updateType)
@@ -535,8 +625,8 @@
                     writer.close();
                     break;
                 case UpdateSetBlobSetClob:
-                    Blob blob = 
broker.serviceLobHelper().newBlob(expectedByte2);
-                    Clob clob = 
broker.serviceLobHelper().newClob(expectedString2);
+                    Blob blob = 
broker.serviceLobHelper().newBlob(byteArrUpdated2);
+                    Clob clob = 
broker.serviceLobHelper().newClob(clobStringUpdated2);
                     objRead.setBlob(blob);
                     objRead.setClob(clob);
                     break;
@@ -551,19 +641,22 @@
         catch(UnsupportedOperationException e)
         {
             ojbSkipTestMessage("# Skip unsupported operation for platform: " + 
getPlatformClass() + ", message: " + e.getMessage() + " #");
+            broker.abortTransaction();
             return;
         }
         broker.store(objRead, ObjectModification.UPDATE);
         broker.commitTransaction();
 
+        broker.clearCache();
         broker.beginTransaction();
         oid = broker.serviceIdentity().buildIdentity(obj);
         objRead = (LobObject) broker.getObjectByIdentity(oid);
         broker.serviceLobHelper().refreshLob(objRead);
         resultArray = objRead.getBlob().getBytes(1, (int) 
objRead.getBlob().length());
-        assertTrue(ArrayUtils.isEquals(expectedByte2, resultArray));
-        assertEquals(expectedString2,
-                objRead.getClob().getSubString(1, (int) 
objRead.getClob().length()));
+        assertEquals(byteArrUpdated2.length, resultArray.length);
+        assertEquals(clobStringUpdated2.length(), objRead.getClob().length());
+        assertTrue(ArrayUtils.isEquals(byteArrUpdated2, resultArray));
+        assertEquals(clobStringUpdated2, objRead.getClob().getSubString(1, 
(int) objRead.getClob().length()));
         broker.commitTransaction();
 
         broker.beginTransaction();
@@ -902,7 +995,7 @@
     //*******************************************************
     public static class LobObject implements Serializable
     {
-        private int id;
+        private Integer id;
         private Blob blob;
         private Clob clob;
 
@@ -910,12 +1003,12 @@
         {
         }
 
-        public int getId()
+        public Integer getId()
         {
             return id;
         }
 
-        public void setId(int id)
+        public void setId(Integer id)
         {
             this.id = id;
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to