package org.jboss.serial.soaktest;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import org.jboss.serial.DataSerializationTest;
import org.jboss.serial.data.TestReadResolve;
import org.jboss.serial.objectmetamodel.DataContainer;
public class DataContainerMultiThreadTestCase extends DataSerializationTest
{
static class TestThread extends Thread
{
Exception e;
DataContainer container;
Object originalObject;
public TestThread (DataContainer container, Object source)
{
this.container = container;
this.originalObject=source;
}
public void run()
{
for (int i=0;i<100;i++)
{
try
{
Thread.yield();
ObjectInput input = container.getInput();
Object newObject = input.readObject();
if (newObject==originalObject)
{
throw new Exception ("Object was the same for " + newObject.getClass().getName());
}
if (!newObject.equals(originalObject))
{
throw new Exception ("Object was not equals");
}
}
catch (Exception e)
{
e.printStackTrace();
this.e=e;
}
}
}
}
public void executTest(Object dataObject) throws Throwable {
if (dataObject instanceof String || dataObject instanceof String[] || dataObject instanceof TestReadResolve)
{
return;
}
System.out.println("Testing " + dataObject.getClass().getName());
DataContainer container = new DataContainer(null, null, null, false);
ObjectOutput output = container.getOutput();
output.writeObject(dataObject);
output.flush();
container.flush();
TestThread threads[] = new TestThread[100];
for (int i=0;i<threads.length;i++)
{
ObjectInput input = container.getInput();
Object newObject = input.readObject();
assertNotSame(dataObject, newObject);
assertEquals(dataObject,newObject);
threads[i] = new TestThread(container.cloneContainer(),newObject);
}
for (int i=0;i<threads.length;i++)
{
threads[i].start();
}
for (int i=0;i<threads.length;i++)
{
threads[i].join();
}
for (int i=0;i<threads.length;i++)
{
if (threads[i].e!=null)
{
throw threads[i].e;
}
}
}
}