1 package be
.nikiroo
.utils
.test_code
;
3 import java
.io
.ByteArrayInputStream
;
4 import java
.io
.ByteArrayOutputStream
;
5 import java
.io
.IOException
;
6 import java
.io
.InputStream
;
7 import java
.io
.NotSerializableException
;
9 import java
.util
.Arrays
;
11 import be
.nikiroo
.utils
.serial
.Exporter
;
12 import be
.nikiroo
.utils
.serial
.Importer
;
13 import be
.nikiroo
.utils
.test
.TestCase
;
14 import be
.nikiroo
.utils
.test
.TestLauncher
;
16 class SerialTest
extends TestLauncher
{
18 * Required for Import/Export of objects.
24 private void encodeRecodeTest(TestCase test
, Object data
) throws Exception
{
25 byte[] encoded
= toBytes(data
);
26 Object redata
= fromBytes(encoded
);
27 byte[] reencoded
= toBytes(redata
);
29 test
.assertEquals("Different data after encode/decode/encode", true,
30 Arrays
.equals(encoded
, reencoded
));
33 // try to remove pointer addresses
34 private byte[] toBytes(Object data
) throws NotSerializableException
,
36 ByteArrayOutputStream out
= new ByteArrayOutputStream();
37 new Exporter(out
).append(data
);
39 String tmp
= new String(out
.toByteArray(), "UTF-8");
40 tmp
= tmp
.replaceAll("@[0-9]*", "@REF");
41 return tmp
.getBytes("UTF-8");
44 private Object
fromBytes(byte[] data
) throws NoSuchFieldException
,
45 NoSuchMethodException
, ClassNotFoundException
,
46 NullPointerException
, IOException
{
48 InputStream in
= new ByteArrayInputStream(data
);
50 return new Importer().read(in
).getValue();
56 public SerialTest(String
[] args
) {
57 super("Serial test", args
);
59 addTest(new TestCase("Simple class Import/Export") {
61 public void test() throws Exception
{
62 Data data
= new Data(42);
63 encodeRecodeTest(this, data
);
67 addTest(new TestCase() {
68 @SuppressWarnings("unused")
69 private TestCase me
= setName("Anonymous inner class");
72 public void test() throws Exception
{
73 Data data
= new Data() {
74 @SuppressWarnings("unused")
77 encodeRecodeTest(this, data
);
80 addTest(new TestCase() {
81 @SuppressWarnings("unused")
82 private TestCase me
= setName("Array of anonymous inner classes");
85 public void test() throws Exception
{
86 Data
[] data
= new Data
[] { new Data() {
87 @SuppressWarnings("unused")
91 byte[] encoded
= toBytes(data
);
92 Object redata
= fromBytes(encoded
);
94 // Comparing the 2 arrays won't be useful, because the @REFs
95 // will be ZIP-encoded; so we parse and re-encode each object
97 byte[] encoded1
= toBytes(data
[0]);
98 byte[] reencoded1
= toBytes(((Data
[])redata
)[0]);
100 assertEquals("Different data after encode/decode/encode", true,
101 Arrays
.equals(encoded1
, reencoded1
));
105 addTest(new TestCase("URL Import/Export") {
107 public void test() throws Exception {
108 URL data = new URL("https://fanfan.be/");
109 String encoded = new Exporter().append(data).toString(false,
111 Object redata = new Importer().read(encoded).getValue();
112 String reencoded = new Exporter().append(redata).toString(
114 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
115 reencoded.replaceAll("@[0-9]*", "@REF"));
118 addTest(new TestCase("URL-String Import/Export") {
120 public void test() throws Exception {
121 String data = new URL("https://fanfan.be/").toString();
122 String encoded = new Exporter().append(data).toString(false,
124 Object redata = new Importer().read(encoded).getValue();
125 String reencoded = new Exporter().append(redata).toString(
127 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
128 reencoded.replaceAll("@[0-9]*", "@REF"));
129 assertEquals(data, redata);
132 addTest(new TestCase("URL/URL-String arrays Import/Export") {
134 public void test() throws Exception {
135 final String url = "https://fanfan.be/";
136 Object[] data = new Object[] { new URL(url), url };
137 String encoded = new Exporter().append(data).toString(false,
139 Object redata = new Importer().read(encoded).getValue();
140 String reencoded = new Exporter().append(redata).toString(
142 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
143 reencoded.replaceAll("@[0-9]*", "@REF"));
144 assertEquals(data[0], ((Object[]) redata)[0]);
145 assertEquals(data[1], ((Object[]) redata)[1]);
148 addTest(new TestCase("Import/Export with nested objects") {
150 public void test() throws Exception {
151 Data data = new DataObject(new Data(21));
152 String encoded = new Exporter().append(data).toString(false,
154 Object redata = new Importer().read(encoded).getValue();
155 String reencoded = new Exporter().append(redata).toString(
157 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
158 reencoded.replaceAll("@[0-9]*", "@REF"));
161 addTest(new TestCase("Import/Export with nested objects forming a loop") {
163 public void test() throws Exception {
164 DataLoop data = new DataLoop("looping");
165 data.next = new DataLoop("level 2");
166 data.next.next = data;
167 String encoded = new Exporter().append(data).toString(false,
169 Object redata = new Importer().read(encoded).getValue();
170 String reencoded = new Exporter().append(redata).toString(
172 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
173 reencoded.replaceAll("@[0-9]*", "@REF"));
176 addTest(new TestCase("Array in Object Import/Export") {
178 public void test() throws Exception {
179 Object data = new DataArray();// new String[] { "un", "deux" };
180 String encoded = new Exporter().append(data).toString(false,
182 Object redata = new Importer().read(encoded).getValue();
183 String reencoded = new Exporter().append(redata).toString(
185 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
186 reencoded.replaceAll("@[0-9]*", "@REF"));
189 addTest(new TestCase("Array Import/Export") {
191 public void test() throws Exception {
192 Object data = new String[] { "un", "deux" };
193 String encoded = new Exporter().append(data).toString(false,
195 Object redata = new Importer().read(encoded).getValue();
196 String reencoded = new Exporter().append(redata).toString(
198 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
199 reencoded.replaceAll("@[0-9]*", "@REF"));
202 addTest(new TestCase("Enum Import/Export") {
204 public void test() throws Exception {
205 Object data = EnumToSend.FANFAN;
206 String encoded = new Exporter().append(data).toString(false,
208 Object redata = new Importer().read(encoded).getValue();
209 String reencoded = new Exporter().append(redata).toString(
211 assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
212 reencoded.replaceAll("@[0-9]*", "@REF"));
215 addTest(new TestCase("B64 and ZIP String test") {
217 public void test() throws Exception {
218 Object data = "Fanfan la tulipe";
219 String encoded = new Exporter().append(data).toString(true,
221 String redata = (String) new Importer().read(encoded)
223 assertEquals("Items not identical after B64", data, redata);
224 encoded = new Exporter().append(data).toString(true, true);
225 redata = (String) new Importer().read(encoded).getValue();
226 assertEquals("Items not identical after ZIP", data, redata);
229 addTest(new TestCase("B64 and ZIP Data test") {
231 public void test() throws Exception {
232 Object data = new Data(55);
233 String encoded = new Exporter().append(data).toString(true,
235 Data redata = (Data) new Importer().read(encoded).getValue();
236 assertEquals("Items not identical after B64", data, redata);
237 encoded = new Exporter().append(data).toString(true, true);
238 redata = (Data) new Importer().read(encoded).getValue();
239 assertEquals("Items not identical after ZIP", data, redata);
242 addTest(new TestCase("B64 and ZIP 70000 chars test") {
244 public void test() throws Exception {
245 StringBuilder builder = new StringBuilder();
246 for (int i = 0; i < 7000; i++) {
247 builder.append("0123456789");
249 Object data = builder.toString();
250 String encoded = new Exporter().append(data).toString(true,
252 String redata = (String) new Importer().read(encoded)
254 assertEquals("Items not identical after B64", data, redata);
255 encoded = new Exporter().append(data).toString(true, true);
256 redata = (String) new Importer().read(encoded).getValue();
257 assertEquals("Items not identical after ZIP", data, redata);
264 public String
[] data
= new String
[] { "un", "deux" };
273 public Data(int value
) {
278 public boolean equals(Object obj
) {
279 if (obj
instanceof Data
) {
280 Data other
= (Data
) obj
;
281 return other
.value
== this.value
;
288 public int hashCode() {
289 return new Integer(value
).hashCode();
293 @SuppressWarnings("unused")
294 class DataObject
extends Data
{
297 @SuppressWarnings("synthetic-access")
298 private DataObject() {
301 @SuppressWarnings("synthetic-access")
302 public DataObject(Data data
) {
307 @SuppressWarnings("unused")
308 class DataLoop
extends Data
{
309 public DataLoop next
;
310 private String value
;
312 @SuppressWarnings("synthetic-access")
316 @SuppressWarnings("synthetic-access")
317 public DataLoop(String value
) {