package org.rhq.test.test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import org.testng.annotations.Test;
import org.rhq.test.ObjectCollectionSerializer;
/*
* RHQ Management Platform
* Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program 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 version 2 of the License.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/**
*
*
* @author Lukas Krejci
*/
@Test
public class ObjectCollectionSerializerTest {
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class MyClass {
public int id;
public String name;
public List<MyChildClass> children;
public MyClass() {
}
public MyClass(int id, String name) {
this.id = id;
this.name = name;
children = new ArrayList<MyChildClass>();
}
public int hashCode() {
return id * (name == null ? 1 : name.hashCode());
}
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof MyClass)) {
return false;
}
MyClass other = (MyClass) o;
if (id != other.id) {
return false;
}
if (name == null) {
if (other.name != null) {
return false;
}
} else {
if (!name.equals(other.name)) {
return false;
}
}
return children.equals(other.children);
}
}
@XmlAccessorType(XmlAccessType.FIELD)
public static class MyChildClass {
public int id;
public String name;
public MyChildClass() {
}
public MyChildClass(int id, String name, MyClass parent) {
this.id = id;
this.name = name;
parent.children.add(this);
}
public int hashCode() {
return id * (name == null ? 1 : name.hashCode());
}
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof MyChildClass)) {
return false;
}
MyChildClass other = (MyChildClass) o;
if (id != other.id) {
return false;
}
if (name == null) {
return other.name == null;
} else {
return name.equals(other.name);
}
}
}
private List<MyClass> getTestObjectTree() {
MyClass m1 = new MyClass(1, "m1");
new MyChildClass(1, "m1c1", m1);
new MyChildClass(2, "m1c2", m1);
new MyChildClass(3, "m1c3", m1);
MyClass m2 = new MyClass(2, "m2");
new MyChildClass(1, "m2c1", m2);
new MyChildClass(2, "m2c2", m2);
new MyChildClass(3, "m2c3", m2);
return Arrays.asList(m1, m2);
}
private byte[] getSerializedTestObjectTree() throws IOException, JAXBException {
ObjectCollectionSerializer serializer = new ObjectCollectionSerializer();
serializer.addObjects(getTestObjectTree());
ByteArrayOutputStream out = new ByteArrayOutputStream();
serializer.serialize(out);
return out.toByteArray();
}
@Test
public void testCanSerialize() throws Exception {
byte[] out = getSerializedTestObjectTree();
assert out.length > 0 : "The serialization should have produced some output";
}
@Test
public void testCanDeserialize() throws Exception {
ObjectCollectionSerializer serializer = new ObjectCollectionSerializer();
ByteArrayInputStream in = new ByteArrayInputStream(getSerializedTestObjectTree());
List<?> objects = serializer.deserialize(in);
assert objects != null && objects.equals(getTestObjectTree()) : "The deserialized objects don't match the expected results";
}
}