/* ProxySerializationTest.java -- Tests serialization of a Proxy
Copyright (C) 2006 by Free Software Foundation, Inc.
Written by Olivier Jolly <olivier.jolly@pcedev.com>
This file is part of Mauve.
Mauve is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
Mauve is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with Mauve; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
*/
// Tags: JDK1.3
package gnu.testlet.java.io.ObjectInputOutput;
import gnu.testlet.TestHarness;
import gnu.testlet.Testlet;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* Check that proxies are correctly serialized and doesn't cause reference
* offset.
* @author Olivier Jolly <olivier.jolly@pcedev.com>
*/
public class ProxySerializationTest implements Testlet
{
public void test(TestHarness harness)
{
SerBaseInterface proxy = (SerBaseInterface) Proxy.newProxyInstance(
SerBaseInterface.class.getClassLoader(),
new Class[] { SerBaseInterface.class },
new DummyInvocationHandler());
SerializableLoopA serializableLoopA = new SerializableLoopA();
SerializableLoopB serializableLoopB = new SerializableLoopB();
// Create data which will force serialization references to be used
serializableLoopA.setB(serializableLoopB);
serializableLoopB.setA(serializableLoopA);
harness.checkPoint("ProxySerializationTest");
harness.check(proxy.getA(), -25679, "Proxy interception checking");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = null;
try
{
objectOutputStream = new ObjectOutputStream(baos);
objectOutputStream.writeObject(proxy);
objectOutputStream.writeObject(serializableLoopA);
objectOutputStream.writeObject(serializableLoopB);
}
catch (IOException e)
{
harness.debug(e);
harness.fail("Error while serialiazing a proxy");
}
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
try
{
ObjectInputStream objectInputStream = new ObjectInputStream(bais);
SerBaseInterface serialized = (SerBaseInterface) objectInputStream.readObject();
harness.check(serialized.getA(), -25679,
"Reserialized proxy working checking");
// Get other object off the object stream and force them to be actually
// used
SerializableLoopA serializableLoopA2 = (SerializableLoopA) objectInputStream.readObject();
SerializableLoopB serializableLoopB2 = (SerializableLoopB) objectInputStream.readObject();
harness.check(serializableLoopA.getB(), serializableLoopA2.getB());
}
catch (Exception e)
{
// If the reference counter got messed up, we should received a
// ClassCastException or something similar
harness.debug(e);
harness.fail("Error while deserialiazing a proxy");
}
}
private static class DummyInvocationHandler implements InvocationHandler,
Serializable
{
private static final long serialVersionUID = -6475900781578075262L;
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
if ("getA".equals(method.getName()))
{
return new Integer(-25679);
}
return method.invoke(proxy, args);
}
}
private interface SerBaseInterface
{
int getA();
}
}