Factor out wire format test.

We can't include things with unpredictable iteration order (sets, maps) in our
wire test, but we still want to test those things in our GIANT STREAMABLE CLASS
OF DOOM test. So we now have a separate wire format test which just ensures
that we don't spuriously break the encoding of things that should be
predictable.
This commit is contained in:
Michael Bayne
2014-10-21 14:17:00 -07:00
parent 01b4ef9af7
commit 9d25489af1
2 changed files with 182 additions and 58 deletions
@@ -146,12 +146,12 @@ public class StreamableTest
public Set<Integer> set = Sets.newHashSet(ImmutableSet.of(6, 7, 8));
public Set<Integer> nullSet = null;
public HashSet<Integer> hashSet = Sets.newHashSet(ImmutableSet.of(7, 8, 9));
public HashSet<Integer> hashSet = Sets.newLinkedHashSet(ImmutableSet.of(7, 8, 9));
public HashSet<Integer> nullHashSet = null;
public Map<Integer, String> map = ImmutableMap.of(1, "one", 2, "two", 3, "three");
public Map<Integer, String> nullMap = null;
public HashMap<String, Integer> hashMap = Maps.newHashMap(
public HashMap<String, Integer> hashMap = Maps.newLinkedHashMap(
ImmutableMap.of("one", 1, "two", 2, "three", 3));
public HashMap<String, Integer> nullHashMap = null;
@@ -383,35 +383,6 @@ public class StreamableTest
assertEquals(w, unflatten(flatten(w)));
}
@Test
public void testWireFormat ()
throws IOException, ClassNotFoundException
{
Widget w = new Widget();
// make sure that we serialize to the expected stream of bytes
byte[] data = flatten(w);
// uncomment this and rerun the tests to generate an updated WIRE_DATA blob
// printWireData(w);
// oddly, JUnit doesn't like comparing byte arrays directly (this fails:
// assertEquals(WIRE_DATA, WIRE_DATA.clone())), but comparing strings is fine
assertEquals(StringUtil.hexlate(data), StringUtil.hexlate(WIRE_DATA));
// make sure that we unserialize a known stream of bytes to the expected object
assertEquals(w, unflatten(WIRE_DATA));
}
protected void printWireData (Object o)
throws IOException
{
String dstr = StringUtil.wordWrap(StringUtil.hexlate(flatten(o)), 80);
dstr = StringUtil.join(dstr.split("\n"), "\" +\n \"");
System.out.println(" protected static final byte[] WIRE_DATA = "
+ "StringUtil.unhexlate(\n \"" + dstr + "\");");
}
@Test
public void testPostStreamingMutation ()
throws IOException, ClassNotFoundException
@@ -543,31 +514,4 @@ public class StreamableTest
{
return new ObjectInputStream(new ByteArrayInputStream(data)).readObject();
}
protected static final byte[] WIRE_DATA = StringUtil.unhexlate(
"ffff0027636f6d2e746872656572696e67732e696f2e53747265616d61626c655465737424576964" +
"676574017f00617fff7fffffff7fffffffffffffff7f7fffff7fefffffffffffff0101017f010061" +
"017fff017fffffff017fffffffffffffff017f7fffff017fefffffffffffff000000000000000001" +
"00036f6e6500ffff000d6d6f6e6b6579206275747465720000000000000000002a01000100010000" +
"000301000101000000037f020301000000037fff0002000301000000030061006200630100000003" +
"7fffffff000000020000000301000000037fffffffffffffff000000000000000200000000000000" +
"0301000000037f7fffff400000004040000001000000037fefffffffffffff400000000000000040" +
"080000000000000000000000000000fffe0027636f6d2e746872656572696e67732e696f2e537472" +
"65616d61626c655465737424576f636b65740f7fff400921fb54442d18fffd002a5b4c636f6d2e74" +
"6872656572696e67732e696f2e53747265616d61626c655465737424576f636b65743b0000000200" +
"020f7fff400921fb54442d1800020f7fff400921fb54442d18fffc002a5b4c636f6d2e7468726565" +
"72696e67732e696f2e53747265616d61626c6554657374245769636b65743b000000030001070f7f" +
"ff400921fb54442d1800000013000000130f7fff400921fb54442d1800000013000000130f7fff40" +
"0921fb54442d180000001300000013000000000000fffb002c5b4c636f6d2e746872656572696e67" +
"732e696f2e53747265616d61626c6554657374245761636b61626c653b00000002fffa0027636f6d" +
"2e746872656572696e67732e696f2e53747265616d61626c6554657374245761636b657401000966" +
"6f722d697a7a6c65000601000a737572652d697a7a6c6500020f7fff400921fb54442d1800020f7f" +
"ff400921fb54442d18010000000200020f7fff400921fb54442d1800020f7fff400921fb54442d18" +
"000100000003fff900116a6176612e6c616e672e496e746567657200000001000700000002000700" +
"00000300010000000300070000000300070000000200070000000100010000000300070000000400" +
"07000000050007000000060001000000030007000000060007000000070007000000080001000000" +
"03000700000007000700000008000700000009000100000003000700000001fff800106a6176612e" +
"6c616e672e537472696e6700036f6e650007000000020008000374776f0007000000030008000574" +
"687265650001000000030008000374776f000700000002000800036f6e6500070000000100080005" +
"746872656500070000000300");
}
@@ -0,0 +1,180 @@
//
// $Id$
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2012 Three Rings Design, Inc., All Rights Reserved
// http://code.google.com/p/narya/
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package com.threerings.io;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import static com.threerings.io.StreamableTest.*; // for Wicket, Wacket, Wocket
import org.junit.Test;
import static org.junit.Assert.*;
import com.google.common.collect.Lists;
import com.samskivert.util.StringUtil;
/**
* Ensures that we don't accidentally break the wire format for streamables.
*/
public class WireFormatTest
{
public static class WireBlob extends SimpleStreamableObject
implements Cloneable
{
public boolean bool1 = true;
public byte byte1 = Byte.MAX_VALUE;
public char char1 = 'a';
public short short1 = Short.MAX_VALUE;
public int int1 = Integer.MAX_VALUE;
public long long1 = Long.MAX_VALUE;
public float float1 = Float.MAX_VALUE;
public double double1 = Double.MAX_VALUE;
public Boolean boxedBool = true;
public Byte boxedByte = Byte.MAX_VALUE;
public Character boxedChar = 'a';
public Short boxedShort = Short.MAX_VALUE;
public Integer boxedInt = Integer.MAX_VALUE;
public Long boxedLong = Long.MAX_VALUE;
public Float boxedFloat = Float.MAX_VALUE;
public Double boxedDouble = Double.MAX_VALUE;
public Boolean nullBoxedBool;
public Byte nullBoxedByte;
public Character nullBoxedChar;
public Short nullBoxedShort;
public Integer nullBoxedInt;
public Long nullBoxedLong;
public Float nullBoxedFloat;
public Double nullBoxedDouble;
public String string1 = "one";
public String nullString1;
@Intern public String internedString1 = "monkey butter";
@Intern public String nullInternedString1;
public Date date1 = new Date(42L);
// note: must be a Streamable class
public Class<?> class1 = Widget.class;
public Class<?> nullClass1;
public boolean[] bools = new boolean[] { true, false, true };
public byte[] bytes = new byte[] { Byte.MAX_VALUE, 2, 3 };
public short[] shorts = new short[] { Short.MAX_VALUE, 2, 3 };
public char[] chars = new char[] { 'a', 'b', 'c' };
public int[] ints = new int[] { Integer.MAX_VALUE, 2, 3 };
public long[] longs = new long[] { Long.MAX_VALUE, 2, 3 };
public float[] floats = new float[] { Float.MAX_VALUE, 2, 3 };
public double[] doubles = new double[] { Double.MAX_VALUE, 2, 3 };
public boolean[] nullBools;
public byte[] nullBytes;
public short[] nullShorts;
public char[] nullChars;
public int[] nullInts;
public long[] nullLongs;
public float[] nullFloats;
public double[] nullDoubles;
public Wocket wocket1 = new Wocket();
public Wocket[] wockets = new Wocket[] { new Wocket(), new Wocket() };
public Wicket[] wickets = new Wicket[] { new Wicket(), new Wicket(), new Wicket() };
public Wocket nullWocket1;
public Wocket[] nullWockets;
public Wicket[] nullWickets;
public Wackable[] wackables = new Wackable[] { new Wacket("for"), new Wacket("sure") };
// it's legal for an Object field to contain a Streamable reference
public Object object1 = new Wocket();
public Object nullObject1 = new Wocket();
// it's legal for an Object[] field to contain an array of Streamable references; NOTE:
// this will come back as "new Object[] { new Wocket(), new Wocket() }", so it's not kosher
// to rely on the type of your array being preserved, only the type of its contents
public Object[] objects = new Wocket[] { new Wocket(), new Wocket() };
public Object[] nullObjects;
public List<Integer> list = Lists.newArrayList(1, 2, 3);
public List<Integer> nullList = null;
public Collection<Integer> collection = Arrays.asList(4, 5, 6);
public Collection<Integer> nullCollection = null;
// NOTE: don't put sets or maps in here because they have non-predictable iteration order
// which will break our wire format test
}
@Test
public void testWireFormat ()
throws IOException, ClassNotFoundException
{
WireBlob w = new WireBlob();
// make sure that we serialize to the expected stream of bytes
byte[] data = flatten(w);
// uncomment this and rerun the tests to generate an updated WIRE_DATA blob
// printWireData(w);
// oddly, JUnit doesn't like comparing byte arrays directly (this fails:
// assertEquals(WIRE_DATA, WIRE_DATA.clone())), but comparing strings is fine
assertEquals(StringUtil.hexlate(data), StringUtil.hexlate(WIRE_DATA));
}
protected void printWireData (Object o)
throws IOException
{
String dstr = StringUtil.wordWrap(StringUtil.hexlate(flatten(o)), 80);
dstr = StringUtil.join(dstr.split("\n"), "\" +\n \"");
System.out.println(" protected static final byte[] WIRE_DATA = "
+ "StringUtil.unhexlate(\n \"" + dstr + "\");");
}
protected static final byte[] WIRE_DATA = StringUtil.unhexlate(
"ffff0029636f6d2e746872656572696e67732e696f2e57697265466f726d61745465737424576972" +
"65426c6f62017f00617fff7fffffff7fffffffffffffff7f7fffff7fefffffffffffff0101017f01" +
"0061017fff017fffffff017fffffffffffffff017f7fffff017fefffffffffffff00000000000000" +
"000100036f6e6500ffff000d6d6f6e6b6579206275747465720000000000000000002a01fffe0027" +
"636f6d2e746872656572696e67732e696f2e53747265616d61626c65546573742457696467657400" +
"010000000301000101000000037f020301000000037fff0002000301000000030061006200630100" +
"0000037fffffff000000020000000301000000037fffffffffffffff000000000000000200000000" +
"0000000301000000037f7fffff400000004040000001000000037fefffffffffffff400000000000" +
"000040080000000000000000000000000000fffd0027636f6d2e746872656572696e67732e696f2e" +
"53747265616d61626c655465737424576f636b65740f7fff400921fb54442d18fffc002a5b4c636f" +
"6d2e746872656572696e67732e696f2e53747265616d61626c655465737424576f636b65743b0000" +
"000200030f7fff400921fb54442d1800030f7fff400921fb54442d18fffb002a5b4c636f6d2e7468" +
"72656572696e67732e696f2e53747265616d61626c6554657374245769636b65743b000000030001" +
"070f7fff400921fb54442d1800000013000000130f7fff400921fb54442d1800000013000000130f" +
"7fff400921fb54442d180000001300000013000000000000fffa002c5b4c636f6d2e746872656572" +
"696e67732e696f2e53747265616d61626c6554657374245761636b61626c653b00000002fff90027" +
"636f6d2e746872656572696e67732e696f2e53747265616d61626c6554657374245761636b657401" +
"0009666f722d697a7a6c65000701000a737572652d697a7a6c6500030f7fff400921fb54442d1800" +
"030f7fff400921fb54442d18010000000200030f7fff400921fb54442d1800030f7fff400921fb54" +
"442d18000100000003fff800116a6176612e6c616e672e496e746567657200000001000800000002" +
"00080000000300010000000300080000000400080000000500080000000600");
}