package freenet.support;
import junit.framework.TestCase;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Arrays;
/**
* Tests writing various types to output streams and reading from input streams.
*/
public class SerializerTest extends TestCase {
public void test() {
// Values for basic type testing.
final Object[] data = new Object[] { true, (byte)9, (short)0xDE, 1234567, 123467890123L, Math.E,
123.4567f, "testing string", new double[] { Math.PI, 0.1234d},
new float[] { 2345.678f, 8901.234f }};
readWrite(data);
// Double array stored with byte size - test edge cases: 0, 128, 255.
Object[] edgeCases = new Object[3];
edgeCases[0] = new double[0];
edgeCases[1] = new double[128];
edgeCases[2] = new double[255];
double value = 0.0;
for (Object edgeCase : edgeCases) {
double[] array = (double[]) edgeCase;
for (int i = 0; i < array.length; i++) {
array[i] = (value += 5);
}
}
readWrite(edgeCases);
}
public void testTooLongDoubleArray() {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(byteOutputStream);
double value = 0;
double[] tooLong = new double[256];
for (int i = 0; i < tooLong.length; i++) {
tooLong[i] += (value += 5);
}
try {
Serializer.writeToDataOutputStream(tooLong, dos);
} catch (IOException e) {
throw new IllegalStateException("This test should not throw an IOException.", e);
} catch (IllegalArgumentException e) {
//Serializer should throw when array is too long.
System.out.println("Threw when too long; should be something about how the array is too long to serialize:");
e.printStackTrace();
}
}
private static void readWrite(Object[] data) {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(byteOutputStream);
//Write to stream.
try {
for (Object datum : data) Serializer.writeToDataOutputStream(datum, dos);
} catch (IOException e) {
throw new IllegalStateException("This test should not throw.", e);
}
//Read back.
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(byteOutputStream.toByteArray()));
try {
for (Object datum : data) {
Object read = Serializer.readFromDataInputStream(datum.getClass(), dis);
//Might be an array.
if (read instanceof double[]) {
assertTrue(Arrays.equals((double[])datum, (double[])read));
} else if (read instanceof float[]) {
assertTrue(Arrays.equals((float[])datum, (float[])read));
} else {
assertEquals(datum, read);
}
}
} catch (IOException e) {
throw new IllegalStateException("This test should not throw.", e);
}
}
}