package org.jboss.serial.soaktest;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import junit.framework.Test;
import org.jboss.jrunit.decorators.ThreadLocalDecorator;
import org.jboss.serial.DataSerializationTest;
import org.jboss.serial.benchmarks.MultiThreadJavaPerformanceTestCase;
import org.jboss.serial.data.NonSerializableTest;
import org.jboss.serial.io.JBossObjectInputStream;
import org.jboss.serial.io.JBossObjectOutputStream;
import org.jboss.serial.objectmetamodel.ObjectsCache;
public class SoakTestCase extends DataSerializationTest {
public SoakTestCase()
{
super();
}
public static Test suite() throws Exception
{
return new ThreadLocalDecorator(SoakTestCase.class,2,1000,0,false)
{
public void threadsTearDown()
{
System.out.println("ThreadsTearDown... process finished");
super.threadsTearDown();
}
};
}
static ThreadLocal count = new ThreadLocal();
static class CountHolder
{
int i=0;
}
private static CountHolder getCount()
{
if (count.get()==null)
{
count.set(new CountHolder());
}
return ((CountHolder)count.get());
}
/* (non-Javadoc)
* @see org.jboss.serial.DataSerializationTest#executTest(java.lang.Object)
*/
public void executTest(Object dataObject) throws Throwable
{
if (dataObject instanceof NonSerializableTest)
{
return;
}
CountHolder count = getCount();
doJBossSerialization(dataObject, count, true);
count.i++;
}
static HashMap metaData = new HashMap();
static
{
metaData.put("test","JBoss");
}
private void doJBossSerialization(Object dataObject, CountHolder count, boolean retry) throws Exception, Throwable
{
if (count.i %1000==0)
{
System.out.println("count.i=" + count.i);
}
try
{
ByteArrayOutputStream outByte = new ByteArrayOutputStream();
BufferedOutputStream buffOut = new BufferedOutputStream(outByte);
ObjectOutputStream output = new JBossObjectOutputStream(buffOut);
output.writeObject(dataObject);
output.flush();
buffOut.flush();
ByteArrayInputStream inptByte = new ByteArrayInputStream(outByte.toByteArray());
ObjectInputStream input = new JBossObjectInputStream(inptByte);
Object obj=null;
try
{
obj = input.readObject();
}
catch (Throwable e)
{
e.printStackTrace();
if (retry)
{
retry( dataObject, count);
}
throw e;
}
if (!(obj instanceof Object[]) && !obj.equals(dataObject))
{
System.out.println("obj1=" + obj.toString());
System.out.println("obj2=" + dataObject.toString());
if (retry)
{
retry(dataObject, count);
}
}
if (!(dataObject instanceof Object[]))
{
assertEquals(obj,dataObject);
}
}
// I was to be able to capture assertions also before doing the clear
catch (Throwable e)
{
e.printStackTrace();
throw e;
}
}
private void retry(Object dataObject, CountHolder count) {
// This could be used for debug purposes
System.out.println("Retrying");
try
{
for (int retryI=0;retryI<100;retryI++)
{
System.out.println("Retry " + retryI);
try
{
MultiThreadJavaPerformanceTestCase.executeSerialization(dataObject);
}
catch (Throwable e)
{
e.printStackTrace();
}
try
{
doJBossSerialization(dataObject,count,false);
}
catch (Throwable e)
{
e.printStackTrace();
}
}
}
finally
{
}
}
}