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]