/*
* Copyright (C) 2006, 2007 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
* Created on 12. June 2006 by Joerg Schaible
*/
package com.thoughtworks.acceptance;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.io.StringReader;
import java.io.StringWriter;
import com.thoughtworks.acceptance.AbstractAcceptanceTest;
/**
* <p>
* A class {@link Serializable} {@link Parent} class implements
* <code>writeObject()</code> and holds a {@link Child} class that also
* implements <code>writeObject()</code>
* </p>
*
* @author <a href="mailto:cleclerc@pobox.com">Cyrille Le Clerc</a>
*/
public class SerializationNestedWriteObjectsTest extends AbstractAcceptanceTest {
public static class Child implements Serializable {
private int i = 3;
public Child(int i) {
this.i = i;
}
public int getI() {
return i;
}
private void readObject(java.io.ObjectInputStream in) throws IOException,
ClassNotFoundException {
in.defaultReadObject();
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
}
}
public static class Parent implements Serializable {
private String name;
private transient Child child;
public Parent(String name, Child child) {
this.name = name;
this.child = child;
}
public Child getChild() {
return child;
}
public String getName() {
return name;
}
private void readObject(java.io.ObjectInputStream in) throws IOException,
ClassNotFoundException {
this.child = (Child) in.readObject();
in.defaultReadObject();
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.writeObject(this.child);
out.defaultWriteObject();
}
}
public void testObjectInputStream() throws Exception {
xstream.alias("parent", Parent.class);
xstream.alias("child", Child.class);
String sourceXml = ""
+ "<object-stream>\n"
+ " <parent serialization=\"custom\">\n"
+ " <parent>\n"
+ " <child serialization=\"custom\">\n"
+ " <child>\n"
+ " <default>\n"
+ " <i>1</i>\n"
+ " </default>\n"
+ " </child>\n"
+ " </child>\n"
+ " <default>\n"
+ " <name>ze-name</name>\n"
+ " </default>\n"
+ " </parent>\n"
+ " </parent>\n"
+ "</object-stream>";
ObjectInputStream objectInputStream = xstream.createObjectInputStream(new StringReader(
sourceXml));
Parent parent = (Parent) objectInputStream.readObject();
assertEquals("ze-name", parent.getName());
assertEquals(1, parent.getChild().getI());
}
public void testObjectOutputStream() throws Exception {
xstream.alias("parent", Parent.class);
xstream.alias("child", Child.class);
String expectedXml = ""
+ "<object-stream>\n"
+ " <parent serialization=\"custom\">\n"
+ " <parent>\n"
+ " <child serialization=\"custom\">\n"
+ " <child>\n"
+ " <default>\n"
+ " <i>1</i>\n"
+ " </default>\n"
+ " </child>\n"
+ " </child>\n"
+ " <default>\n"
+ " <name>ze-name</name>\n"
+ " </default>\n"
+ " </parent>\n"
+ " </parent>\n"
+ "</object-stream>";
Parent parent = new Parent("ze-name", new Child(1));
StringWriter stringWriter = new StringWriter();
ObjectOutputStream os = xstream.createObjectOutputStream(stringWriter);
os.writeObject(parent);
os.close();
String actualXml = stringWriter.getBuffer().toString();
assertEquals(expectedXml, actualXml);
}
public void testToXML() {
xstream.alias("parent", Parent.class);
xstream.alias("child", Child.class);
String expected = ""
+ "<parent serialization=\"custom\">\n"
+ " <parent>\n"
+ " <child serialization=\"custom\">\n"
+ " <child>\n"
+ " <default>\n"
+ " <i>1</i>\n"
+ " </default>\n"
+ " </child>\n"
+ " </child>\n"
+ " <default>\n"
+ " <name>ze-name</name>\n"
+ " </default>\n"
+ " </parent>\n"
+ "</parent>";
Parent parent = new Parent("ze-name", new Child(1));
assertBothWays(parent, expected);
}
public static class RawString implements Serializable {
private String s;
public RawString(String s) {
this.s = s;
}
public String getS() {
return s;
}
private void readObject(java.io.ObjectInputStream in) throws IOException {
int i = in.read();
byte[] b = new byte[i];
in.read(b);
s = new String(b);
}
private void writeObject(ObjectOutputStream out) throws IOException {
byte[] b = s.getBytes();
out.write(b.length);
out.write(b);
}
}
public void testCanHandleRawBytes() throws IOException, ClassNotFoundException {
xstream.alias("raw", RawString.class);
String expectedXml = ""
+ "<object-stream>\n"
+ " <raw serialization=\"custom\">\n"
+ " <raw>\n"
+ " <byte>7</byte>\n"
+ " <byte-array>WFN0cmVhbQ==</byte-array>\n"
+ " </raw>\n"
+ " </raw>\n"
+ "</object-stream>";
StringWriter stringWriter = new StringWriter();
ObjectOutputStream os = xstream.createObjectOutputStream(stringWriter);
os.writeObject(new RawString("XStream"));
os.close();
String actualXml = stringWriter.getBuffer().toString();
assertEquals(expectedXml, actualXml);
ObjectInputStream objectInputStream = xstream.createObjectInputStream(new StringReader(actualXml));
RawString rawString = (RawString) objectInputStream.readObject();
assertEquals("XStream", rawString.getS());
}
}