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