...
[nikiroo-utils.git] / src / be / nikiroo / utils / test_code / SerialTest.java
CommitLineData
fbcc2a2a 1package be.nikiroo.utils.test_code;
db31c358 2
564bbbdb
NR
3import java.io.ByteArrayInputStream;
4import java.io.ByteArrayOutputStream;
5import java.io.IOException;
6import java.io.InputStream;
7import java.io.NotSerializableException;
564bbbdb 8import java.util.Arrays;
f4053377 9
db31c358
NR
10import be.nikiroo.utils.serial.Exporter;
11import be.nikiroo.utils.serial.Importer;
fbcc2a2a
NR
12import be.nikiroo.utils.test.TestCase;
13import be.nikiroo.utils.test.TestLauncher;
db31c358
NR
14
15class SerialTest extends TestLauncher {
452f38c8
NR
16 /**
17 * Required for Import/Export of objects.
18 */
19 public SerialTest() {
20 this(null);
21 }
22
564bbbdb
NR
23 // try to remove pointer addresses
24 private byte[] toBytes(Object data) throws NotSerializableException,
25 IOException {
26 ByteArrayOutputStream out = new ByteArrayOutputStream();
27 new Exporter(out).append(data);
28 out.flush();
29 String tmp = new String(out.toByteArray(), "UTF-8");
30 tmp = tmp.replaceAll("@[0-9]*", "@REF");
31 return tmp.getBytes("UTF-8");
32 }
33
34 private Object fromBytes(byte[] data) throws NoSuchFieldException,
35 NoSuchMethodException, ClassNotFoundException,
36 NullPointerException, IOException {
37
38 InputStream in = new ByteArrayInputStream(data);
39 try {
40 return new Importer().read(in).getValue();
41 } finally {
42 in.close();
43 }
44 }
45
db31c358
NR
46 public SerialTest(String[] args) {
47 super("Serial test", args);
48
49 addTest(new TestCase("Simple class Import/Export") {
50 @Override
51 public void test() throws Exception {
52 Data data = new Data(42);
3f277541 53
564bbbdb
NR
54 byte[] encoded = toBytes(data);
55 Object redata = fromBytes(encoded);
56 byte[] reencoded = toBytes(redata);
3f277541 57
564bbbdb
NR
58 assertEquals("Different data after encode/decode/encode", true,
59 Arrays.equals(encoded, reencoded));
3f277541
NR
60 }
61 });
564bbbdb
NR
62 /*
63 * addTest(new TestCase() {
64 *
65 * @SuppressWarnings("unused") private TestCase me =
66 * setName("Anonymous inner class");
67 *
68 * @Override public void test() throws Exception { Data data = new
69 * Data() {
70 *
71 * @SuppressWarnings("unused") int value = 42; };
72 *
73 * String encoded = new Exporter().append(data).toString(false, false);
74 * Object redata = new Importer().read(encoded).getValue(); String
75 * reencoded = new Exporter().append(redata).toString( false, false);
76 *
77 * assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
78 * reencoded.replaceAll("@[0-9]*", "@REF")); } });
79 *
80 * addTest(new TestCase() {
81 *
82 * @SuppressWarnings("unused") private TestCase me =
83 * setName("Array of anonymous inner classes");
84 *
85 * @Override public void test() throws Exception { Data[] data = new
86 * Data[] { new Data() {
87 *
88 * @SuppressWarnings("unused") int value = 42; } };
89 *
90 * String encoded = new Exporter().append(data).toString(false, false);
91 * Object redata = new Importer().read(encoded).getValue(); String
92 * reencoded = new Exporter().append(redata).toString( false, false);
93 *
94 * // Comparing the 2 strings won't be useful, because the @REFs // will
95 * be ZIP-encoded; so we parse and re-encode the object encoded = new
96 * Exporter().append(data[0]).toString(false, false); try { reencoded =
97 * new Exporter().append(((Data[]) redata)[0]) .toString(false, false);
98 * } catch (Exception e) {
99 * fail("Cannot cast the returned data into its original object", e); }
100 *
101 * assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
102 * reencoded.replaceAll("@[0-9]*", "@REF")); } });
103 *
104 * addTest(new TestCase("URL Import/Export") {
105 *
106 * @Override public void test() throws Exception { URL data = new
107 * URL("https://fanfan.be/"); String encoded = new
108 * Exporter().append(data).toString(false, false); Object redata = new
109 * Importer().read(encoded).getValue(); String reencoded = new
110 * Exporter().append(redata).toString( false, false);
111 *
112 * assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
113 * reencoded.replaceAll("@[0-9]*", "@REF")); } });
114 *
115 * addTest(new TestCase("URL-String Import/Export") {
116 *
117 * @Override public void test() throws Exception { String data = new
118 * URL("https://fanfan.be/").toString(); String encoded = new
119 * Exporter().append(data).toString(false, false); Object redata = new
120 * Importer().read(encoded).getValue(); String reencoded = new
121 * Exporter().append(redata).toString( false, false);
122 *
123 * assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
124 * reencoded.replaceAll("@[0-9]*", "@REF")); assertEquals(data, redata);
125 * } });
126 *
127 * addTest(new TestCase("URL/URL-String arrays Import/Export") {
128 *
129 * @Override public void test() throws Exception { final String url =
130 * "https://fanfan.be/";
131 *
132 * Object[] data = new Object[] { new URL(url), url }; String encoded =
133 * new Exporter().append(data).toString(false, false); Object redata =
134 * new Importer().read(encoded).getValue(); String reencoded = new
135 * Exporter().append(redata).toString( false, false);
136 *
137 * assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
138 * reencoded.replaceAll("@[0-9]*", "@REF")); assertEquals(data[0],
139 * ((Object[]) redata)[0]); assertEquals(data[1], ((Object[])
140 * redata)[1]); } });
141 *
142 * addTest(new TestCase("Import/Export with nested objects") {
143 *
144 * @Override public void test() throws Exception { Data data = new
145 * DataObject(new Data(21)); String encoded = new
146 * Exporter().append(data).toString(false, false); Object redata = new
147 * Importer().read(encoded).getValue(); String reencoded = new
148 * Exporter().append(redata).toString( false, false);
149 *
150 * assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
151 * reencoded.replaceAll("@[0-9]*", "@REF")); } });
152 *
153 * addTest(new
154 * TestCase("Import/Export with nested objects forming a loop") {
155 *
156 * @Override public void test() throws Exception { DataLoop data = new
157 * DataLoop("looping"); data.next = new DataLoop("level 2");
158 * data.next.next = data;
159 *
160 * String encoded = new Exporter().append(data).toString(false, false);
161 * Object redata = new Importer().read(encoded).getValue(); String
162 * reencoded = new Exporter().append(redata).toString( false, false);
163 *
164 * assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
165 * reencoded.replaceAll("@[0-9]*", "@REF")); } });
166 *
167 * addTest(new TestCase("Array in Object Import/Export") {
168 *
169 * @Override public void test() throws Exception { Object data = new
170 * DataArray();// new String[] { "un", "deux" }; String encoded = new
171 * Exporter().append(data).toString(false, false); Object redata = new
172 * Importer().read(encoded).getValue(); String reencoded = new
173 * Exporter().append(redata).toString( false, false);
174 *
175 * assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
176 * reencoded.replaceAll("@[0-9]*", "@REF")); } });
177 *
178 * addTest(new TestCase("Array Import/Export") {
179 *
180 * @Override public void test() throws Exception { Object data = new
181 * String[] { "un", "deux" }; String encoded = new
182 * Exporter().append(data).toString(false, false); Object redata = new
183 * Importer().read(encoded).getValue(); String reencoded = new
184 * Exporter().append(redata).toString( false, false);
185 *
186 * assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
187 * reencoded.replaceAll("@[0-9]*", "@REF")); } });
188 *
189 * addTest(new TestCase("Enum Import/Export") {
190 *
191 * @Override public void test() throws Exception { Object data =
192 * EnumToSend.FANFAN; String encoded = new
193 * Exporter().append(data).toString(false, false); Object redata = new
194 * Importer().read(encoded).getValue(); String reencoded = new
195 * Exporter().append(redata).toString( false, false);
196 *
197 * assertEquals(encoded.replaceAll("@[0-9]*", "@REF"),
198 * reencoded.replaceAll("@[0-9]*", "@REF")); } });
199 *
200 * addTest(new TestCase("B64 and ZIP String test") {
201 *
202 * @Override public void test() throws Exception { Object data =
203 * "Fanfan la tulipe"; String encoded = new
204 * Exporter().append(data).toString(true, false); String redata =
205 * (String) new Importer().read(encoded) .getValue();
206 *
207 * assertEquals("Items not identical after B64", data, redata);
208 *
209 * encoded = new Exporter().append(data).toString(true, true); redata =
210 * (String) new Importer().read(encoded).getValue();
211 *
212 * assertEquals("Items not identical after ZIP", data, redata); } });
213 *
214 * addTest(new TestCase("B64 and ZIP Data test") {
215 *
216 * @Override public void test() throws Exception { Object data = new
217 * Data(55); String encoded = new Exporter().append(data).toString(true,
218 * false); Data redata = (Data) new Importer().read(encoded).getValue();
219 *
220 * assertEquals("Items not identical after B64", data, redata);
221 *
222 * encoded = new Exporter().append(data).toString(true, true); redata =
223 * (Data) new Importer().read(encoded).getValue();
224 *
225 * assertEquals("Items not identical after ZIP", data, redata); } });
226 *
227 * addTest(new TestCase("B64 and ZIP 70000 chars test") {
228 *
229 * @Override public void test() throws Exception { StringBuilder builder
230 * = new StringBuilder(); for (int i = 0; i < 7000; i++) {
231 * builder.append("0123456789"); }
232 *
233 * Object data = builder.toString(); String encoded = new
234 * Exporter().append(data).toString(true, false); String redata =
235 * (String) new Importer().read(encoded) .getValue();
236 *
237 * assertEquals("Items not identical after B64", data, redata);
238 *
239 * encoded = new Exporter().append(data).toString(true, true); redata =
240 * (String) new Importer().read(encoded).getValue();
241 *
242 * assertEquals("Items not identical after ZIP", data, redata); } });
243 */
ce0974c4
NR
244 }
245
246 class DataArray {
247 public String[] data = new String[] { "un", "deux" };
db31c358
NR
248 }
249
db31c358
NR
250 class Data {
251 private int value;
252
253 private Data() {
254 }
255
256 public Data(int value) {
257 this.value = value;
258 }
3f277541
NR
259
260 @Override
261 public boolean equals(Object obj) {
262 if (obj instanceof Data) {
263 Data other = (Data) obj;
264 return other.value == this.value;
265 }
266
267 return false;
268 }
269
270 @Override
271 public int hashCode() {
b6d4ace8 272 return new Integer(value).hashCode();
3f277541 273 }
db31c358
NR
274 }
275
276 @SuppressWarnings("unused")
277 class DataObject extends Data {
278 private Data data;
279
280 @SuppressWarnings("synthetic-access")
281 private DataObject() {
282 }
283
284 @SuppressWarnings("synthetic-access")
285 public DataObject(Data data) {
286 this.data = data;
287 }
288 }
289
290 @SuppressWarnings("unused")
291 class DataLoop extends Data {
292 public DataLoop next;
293 private String value;
294
295 @SuppressWarnings("synthetic-access")
296 private DataLoop() {
297 }
298
299 @SuppressWarnings("synthetic-access")
300 public DataLoop(String value) {
301 this.value = value;
302 }
303 }
e570f7eb
NR
304
305 enum EnumToSend {
306 FANFAN, TULIPE,
307 }
db31c358 308}