Commit | Line | Data |
---|---|---|
db31c358 NR |
1 | package be.nikiroo.utils.test; |
2 | ||
ce0974c4 | 3 | import be.nikiroo.utils.Version; |
db31c358 NR |
4 | import be.nikiroo.utils.serial.Exporter; |
5 | import be.nikiroo.utils.serial.Importer; | |
79ce1a49 NR |
6 | import be.nikiroo.utils.serial.server.ConnectActionClientObject; |
7 | import be.nikiroo.utils.serial.server.ConnectActionClientString; | |
8 | import be.nikiroo.utils.serial.server.ConnectActionServerObject; | |
9 | import be.nikiroo.utils.serial.server.ConnectActionServerString; | |
10 | import be.nikiroo.utils.serial.server.ServerObject; | |
11 | import be.nikiroo.utils.serial.server.ServerString; | |
db31c358 NR |
12 | |
13 | class SerialTest extends TestLauncher { | |
14 | private SerialTest() { | |
15 | super("Serial test", null); | |
16 | } | |
17 | ||
79ce1a49 NR |
18 | private TestLauncher createServerStringTestCases(final String[] args, |
19 | final boolean ssl) { | |
20 | final String ssls = (ssl ? "(ssl)" : "(plain text)"); | |
21 | TestLauncher series = new TestLauncher("Client/Server " + ssls, args); | |
22 | ||
23 | series.addTest(new TestCase("Simple connection " + ssls) { | |
24 | @Override | |
25 | public void test() throws Exception { | |
26 | final String[] rec = new String[1]; | |
27 | ||
28 | ServerString server = new ServerString(this.getName(), 0, ssl) { | |
29 | @Override | |
30 | protected String onRequest( | |
31 | ConnectActionServerString action, | |
32 | Version clientVersion, String data) | |
33 | throws Exception { | |
34 | return null; | |
35 | } | |
36 | }; | |
37 | ||
38 | assertEquals("A port should have been assigned", true, | |
39 | server.getPort() > 0); | |
40 | ||
41 | server.start(); | |
42 | ||
43 | try { | |
44 | new ConnectActionClientObject(null, server.getPort(), ssl) { | |
45 | @Override | |
46 | public void action(Version serverVersion) | |
47 | throws Exception { | |
48 | rec[0] = "ok"; | |
49 | } | |
50 | }.connect(); | |
51 | } finally { | |
52 | server.stop(); | |
53 | } | |
54 | ||
55 | assertNotNull("The client action was not run", rec[0]); | |
56 | assertEquals("ok", rec[0]); | |
57 | } | |
58 | }); | |
59 | ||
60 | series.addTest(new TestCase("Simple exchange " + ssls) { | |
61 | final String[] sent = new String[1]; | |
62 | final String[] recd = new String[1]; | |
63 | final Exception[] err = new Exception[1]; | |
64 | ||
65 | @Override | |
66 | public void test() throws Exception { | |
67 | ServerString server = new ServerString(this.getName(), 0, ssl) { | |
68 | @Override | |
69 | protected String onRequest( | |
70 | ConnectActionServerString action, | |
71 | Version clientVersion, String data) | |
72 | throws Exception { | |
73 | sent[0] = data; | |
74 | return "pong"; | |
75 | } | |
76 | ||
77 | @Override | |
78 | protected void onError(Exception e) { | |
79 | super.onError(e); | |
80 | err[0] = e; | |
81 | } | |
82 | }; | |
83 | ||
84 | server.start(); | |
85 | ||
86 | try { | |
87 | new ConnectActionClientString(null, server.getPort(), ssl) { | |
88 | @Override | |
89 | public void action(Version serverVersion) | |
90 | throws Exception { | |
91 | recd[0] = send("ping"); | |
92 | } | |
93 | }.connect(); | |
94 | } finally { | |
95 | server.stop(); | |
96 | } | |
97 | ||
98 | if (err[0] != null) { | |
99 | fail("An exception was thrown: " + err[0].getMessage()); | |
100 | } | |
101 | ||
102 | assertEquals("ping", sent[0]); | |
103 | assertEquals("pong", recd[0]); | |
104 | } | |
105 | }); | |
106 | ||
107 | series.addTest(new TestCase("Multiple exchanges " + ssls) { | |
108 | final String[] sent = new String[3]; | |
109 | final String[] recd = new String[3]; | |
110 | final Exception[] err = new Exception[1]; | |
111 | ||
112 | @Override | |
113 | public void test() throws Exception { | |
114 | ServerString server = new ServerString(this.getName(), 0, ssl) { | |
115 | @Override | |
116 | protected String onRequest( | |
117 | ConnectActionServerString action, | |
118 | Version clientVersion, String data) | |
119 | throws Exception { | |
120 | sent[0] = data; | |
121 | action.send("pong"); | |
122 | sent[1] = action.rec(); | |
123 | return "pong2"; | |
124 | } | |
125 | ||
126 | @Override | |
127 | protected void onError(Exception e) { | |
128 | super.onError(e); | |
129 | err[0] = e; | |
130 | } | |
131 | }; | |
132 | ||
133 | server.start(); | |
134 | ||
135 | try { | |
136 | new ConnectActionClientString(null, server.getPort(), ssl) { | |
137 | @Override | |
138 | public void action(Version serverVersion) | |
139 | throws Exception { | |
140 | recd[0] = send("ping"); | |
141 | recd[1] = send("ping2"); | |
142 | } | |
143 | }.connect(); | |
144 | } finally { | |
145 | server.stop(); | |
146 | } | |
147 | ||
148 | if (err[0] != null) { | |
149 | fail("An exception was thrown: " + err[0].getMessage()); | |
150 | } | |
151 | ||
152 | assertEquals("ping", sent[0]); | |
153 | assertEquals("pong", recd[0]); | |
154 | assertEquals("ping2", sent[1]); | |
155 | assertEquals("pong2", recd[1]); | |
156 | } | |
157 | }); | |
158 | ||
159 | series.addTest(new TestCase("Multiple call from client " + ssls) { | |
160 | final String[] sent = new String[3]; | |
161 | final String[] recd = new String[3]; | |
162 | final Exception[] err = new Exception[1]; | |
163 | ||
164 | @Override | |
165 | public void test() throws Exception { | |
166 | ServerString server = new ServerString(this.getName(), 0, ssl) { | |
167 | @Override | |
168 | protected String onRequest( | |
169 | ConnectActionServerString action, | |
170 | Version clientVersion, String data) | |
171 | throws Exception { | |
172 | sent[Integer.parseInt(data)] = data; | |
173 | return "" + (Integer.parseInt(data) * 2); | |
174 | } | |
175 | ||
176 | @Override | |
177 | protected void onError(Exception e) { | |
178 | super.onError(e); | |
179 | err[0] = e; | |
180 | } | |
181 | }; | |
182 | ||
183 | server.start(); | |
184 | ||
185 | try { | |
186 | new ConnectActionClientString(null, server.getPort(), ssl) { | |
187 | @Override | |
188 | public void action(Version serverVersion) | |
189 | throws Exception { | |
190 | for (int i = 0; i < 3; i++) { | |
191 | recd[i] = send("" + i); | |
192 | } | |
193 | } | |
194 | }.connect(); | |
195 | } finally { | |
196 | server.stop(); | |
197 | } | |
198 | ||
199 | if (err[0] != null) { | |
200 | fail("An exception was thrown: " + err[0].getMessage()); | |
201 | } | |
202 | ||
203 | assertEquals("0", sent[0]); | |
204 | assertEquals("0", recd[0]); | |
205 | assertEquals("1", sent[1]); | |
206 | assertEquals("2", recd[1]); | |
207 | assertEquals("2", sent[2]); | |
208 | assertEquals("4", recd[2]); | |
209 | } | |
210 | }); | |
211 | ||
212 | return series; | |
213 | } | |
214 | ||
215 | private TestLauncher createServerObjectTestCases(final String[] args, | |
f157aed8 | 216 | final boolean ssl) { |
08a58812 | 217 | final String ssls = (ssl ? "(ssl)" : "(plain text)"); |
f157aed8 NR |
218 | TestLauncher series = new TestLauncher("Client/Server " + ssls, args); |
219 | ||
220 | series.addTest(new TestCase("Simple connection " + ssls) { | |
221 | @Override | |
222 | public void test() throws Exception { | |
223 | final Object[] rec = new Object[1]; | |
224 | ||
79ce1a49 | 225 | ServerObject server = new ServerObject(this.getName(), 0, ssl) { |
08a58812 | 226 | @Override |
79ce1a49 NR |
227 | protected Object onRequest( |
228 | ConnectActionServerObject action, | |
f157aed8 NR |
229 | Version clientVersion, Object data) |
230 | throws Exception { | |
231 | return null; | |
232 | } | |
233 | }; | |
234 | ||
235 | assertEquals("A port should have been assigned", true, | |
236 | server.getPort() > 0); | |
237 | ||
d463d266 | 238 | server.start(); |
f157aed8 NR |
239 | |
240 | try { | |
79ce1a49 | 241 | new ConnectActionClientObject(null, server.getPort(), ssl) { |
f157aed8 NR |
242 | @Override |
243 | public void action(Version serverVersion) | |
244 | throws Exception { | |
245 | rec[0] = true; | |
08a58812 | 246 | } |
f157aed8 NR |
247 | }.connect(); |
248 | } finally { | |
249 | server.stop(); | |
250 | } | |
251 | ||
252 | assertNotNull("The client action was not run", rec[0]); | |
253 | assertEquals(true, (boolean) ((Boolean) rec[0])); | |
254 | } | |
255 | }); | |
08a58812 | 256 | |
f157aed8 NR |
257 | series.addTest(new TestCase("Simple exchange " + ssls) { |
258 | final Object[] sent = new Object[1]; | |
259 | final Object[] recd = new Object[1]; | |
260 | final Exception[] err = new Exception[1]; | |
261 | ||
262 | @Override | |
263 | public void test() throws Exception { | |
79ce1a49 | 264 | ServerObject server = new ServerObject(this.getName(), 0, ssl) { |
f157aed8 | 265 | @Override |
79ce1a49 NR |
266 | protected Object onRequest( |
267 | ConnectActionServerObject action, | |
f157aed8 NR |
268 | Version clientVersion, Object data) |
269 | throws Exception { | |
270 | sent[0] = data; | |
271 | return "pong"; | |
08a58812 | 272 | } |
08a58812 NR |
273 | |
274 | @Override | |
f157aed8 NR |
275 | protected void onError(Exception e) { |
276 | super.onError(e); | |
277 | err[0] = e; | |
278 | } | |
279 | }; | |
08a58812 | 280 | |
d463d266 | 281 | server.start(); |
08a58812 | 282 | |
f157aed8 | 283 | try { |
79ce1a49 | 284 | new ConnectActionClientObject(null, server.getPort(), ssl) { |
f157aed8 NR |
285 | @Override |
286 | public void action(Version serverVersion) | |
287 | throws Exception { | |
288 | recd[0] = send("ping"); | |
08a58812 | 289 | } |
f157aed8 NR |
290 | }.connect(); |
291 | } finally { | |
292 | server.stop(); | |
293 | } | |
08a58812 | 294 | |
f157aed8 NR |
295 | if (err[0] != null) { |
296 | fail("An exception was thrown: " + err[0].getMessage()); | |
297 | } | |
298 | ||
299 | assertEquals("ping", sent[0]); | |
300 | assertEquals("pong", recd[0]); | |
301 | } | |
302 | }); | |
303 | ||
304 | series.addTest(new TestCase("Multiple exchanges " + ssls) { | |
305 | final Object[] sent = new Object[3]; | |
306 | final Object[] recd = new Object[3]; | |
307 | final Exception[] err = new Exception[1]; | |
308 | ||
309 | @Override | |
310 | public void test() throws Exception { | |
79ce1a49 | 311 | ServerObject server = new ServerObject(this.getName(), 0, ssl) { |
f157aed8 | 312 | @Override |
79ce1a49 NR |
313 | protected Object onRequest( |
314 | ConnectActionServerObject action, | |
f157aed8 NR |
315 | Version clientVersion, Object data) |
316 | throws Exception { | |
317 | sent[0] = data; | |
318 | action.send("pong"); | |
d463d266 | 319 | sent[1] = action.rec(); |
f157aed8 | 320 | return "pong2"; |
08a58812 | 321 | } |
08a58812 NR |
322 | |
323 | @Override | |
f157aed8 NR |
324 | protected void onError(Exception e) { |
325 | super.onError(e); | |
326 | err[0] = e; | |
327 | } | |
328 | }; | |
08a58812 | 329 | |
d463d266 | 330 | server.start(); |
08a58812 | 331 | |
f157aed8 | 332 | try { |
79ce1a49 | 333 | new ConnectActionClientObject(null, server.getPort(), ssl) { |
f157aed8 NR |
334 | @Override |
335 | public void action(Version serverVersion) | |
336 | throws Exception { | |
337 | recd[0] = send("ping"); | |
338 | recd[1] = send("ping2"); | |
08a58812 | 339 | } |
f157aed8 NR |
340 | }.connect(); |
341 | } finally { | |
342 | server.stop(); | |
343 | } | |
344 | ||
345 | if (err[0] != null) { | |
346 | fail("An exception was thrown: " + err[0].getMessage()); | |
347 | } | |
348 | ||
349 | assertEquals("ping", sent[0]); | |
350 | assertEquals("pong", recd[0]); | |
351 | assertEquals("ping2", sent[1]); | |
352 | assertEquals("pong2", recd[1]); | |
353 | } | |
354 | }); | |
08a58812 | 355 | |
f157aed8 NR |
356 | series.addTest(new TestCase("Multiple call from client " + ssls) { |
357 | final Object[] sent = new Object[3]; | |
358 | final Object[] recd = new Object[3]; | |
359 | final Exception[] err = new Exception[1]; | |
360 | ||
361 | @Override | |
362 | public void test() throws Exception { | |
79ce1a49 | 363 | ServerObject server = new ServerObject(this.getName(), 0, ssl) { |
f157aed8 | 364 | @Override |
79ce1a49 NR |
365 | protected Object onRequest( |
366 | ConnectActionServerObject action, | |
f157aed8 NR |
367 | Version clientVersion, Object data) |
368 | throws Exception { | |
369 | sent[(Integer) data] = data; | |
370 | return ((Integer) data) * 2; | |
08a58812 | 371 | } |
08a58812 NR |
372 | |
373 | @Override | |
f157aed8 NR |
374 | protected void onError(Exception e) { |
375 | super.onError(e); | |
376 | err[0] = e; | |
377 | } | |
378 | }; | |
379 | ||
d463d266 | 380 | server.start(); |
08a58812 | 381 | |
f157aed8 | 382 | try { |
79ce1a49 | 383 | new ConnectActionClientObject(null, server.getPort(), ssl) { |
f157aed8 NR |
384 | @Override |
385 | public void action(Version serverVersion) | |
386 | throws Exception { | |
387 | for (int i = 0; i < 3; i++) { | |
388 | recd[i] = send(i); | |
08a58812 | 389 | } |
08a58812 | 390 | } |
f157aed8 NR |
391 | }.connect(); |
392 | } finally { | |
393 | server.stop(); | |
394 | } | |
08a58812 | 395 | |
f157aed8 NR |
396 | if (err[0] != null) { |
397 | fail("An exception was thrown: " + err[0].getMessage()); | |
398 | } | |
08a58812 | 399 | |
f157aed8 NR |
400 | assertEquals(0, sent[0]); |
401 | assertEquals(0, recd[0]); | |
402 | assertEquals(1, sent[1]); | |
403 | assertEquals(2, recd[1]); | |
404 | assertEquals(2, sent[2]); | |
405 | assertEquals(4, recd[2]); | |
406 | } | |
407 | }); | |
408 | ||
409 | return series; | |
08a58812 NR |
410 | } |
411 | ||
db31c358 NR |
412 | public SerialTest(String[] args) { |
413 | super("Serial test", args); | |
414 | ||
79ce1a49 NR |
415 | addSeries(createServerObjectTestCases(args, false)); |
416 | ||
417 | addSeries(createServerObjectTestCases(args, true)); | |
418 | ||
419 | addSeries(createServerStringTestCases(args, false)); | |
08a58812 | 420 | |
79ce1a49 | 421 | addSeries(createServerStringTestCases(args, true)); |
08a58812 | 422 | |
db31c358 NR |
423 | addTest(new TestCase("Simple class Import/Export") { |
424 | @Override | |
425 | public void test() throws Exception { | |
426 | Data data = new Data(42); | |
427 | String encoded = new Exporter().append(data).toString(false); | |
428 | Object redata = new Importer().read(encoded).getValue(); | |
429 | String reencoded = new Exporter().append(redata) | |
430 | .toString(false); | |
431 | ||
432 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
433 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
434 | } | |
435 | }); | |
436 | ||
437 | addTest(new TestCase("Import/Export with nested objects") { | |
438 | @Override | |
439 | public void test() throws Exception { | |
440 | Data data = new DataObject(new Data(21)); | |
441 | String encoded = new Exporter().append(data).toString(false); | |
442 | Object redata = new Importer().read(encoded).getValue(); | |
443 | String reencoded = new Exporter().append(redata) | |
444 | .toString(false); | |
445 | ||
446 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
447 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
448 | } | |
449 | }); | |
450 | ||
451 | addTest(new TestCase("Import/Export with nested objects forming a loop") { | |
452 | @Override | |
453 | public void test() throws Exception { | |
454 | DataLoop data = new DataLoop("looping"); | |
455 | data.next = new DataLoop("level 2"); | |
456 | data.next.next = data; | |
457 | ||
458 | String encoded = new Exporter().append(data).toString(false); | |
459 | Object redata = new Importer().read(encoded).getValue(); | |
460 | String reencoded = new Exporter().append(redata) | |
461 | .toString(false); | |
462 | ||
463 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
464 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
465 | } | |
466 | }); | |
ce0974c4 NR |
467 | |
468 | addTest(new TestCase("Array in Object Import/Export") { | |
469 | @Override | |
470 | public void test() throws Exception { | |
471 | Object data = new DataArray();// new String[] { "un", "deux" }; | |
472 | String encoded = new Exporter().append(data).toString(false); | |
473 | Object redata = new Importer().read(encoded).getValue(); | |
474 | String reencoded = new Exporter().append(redata) | |
475 | .toString(false); | |
476 | ||
477 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
478 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
479 | } | |
480 | }); | |
481 | ||
482 | addTest(new TestCase("Array Import/Export") { | |
483 | @Override | |
484 | public void test() throws Exception { | |
485 | Object data = new String[] { "un", "deux" }; | |
486 | String encoded = new Exporter().append(data).toString(false); | |
487 | Object redata = new Importer().read(encoded).getValue(); | |
488 | String reencoded = new Exporter().append(redata) | |
489 | .toString(false); | |
490 | ||
491 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
492 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
493 | } | |
494 | }); | |
e570f7eb NR |
495 | |
496 | addTest(new TestCase("Enum Import/Export") { | |
497 | @Override | |
498 | public void test() throws Exception { | |
499 | Object data = EnumToSend.FANFAN; | |
500 | String encoded = new Exporter().append(data).toString(false); | |
501 | Object redata = new Importer().read(encoded).getValue(); | |
502 | String reencoded = new Exporter().append(redata) | |
503 | .toString(false); | |
504 | ||
505 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
506 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
507 | } | |
508 | }); | |
ce0974c4 NR |
509 | } |
510 | ||
511 | class DataArray { | |
512 | public String[] data = new String[] { "un", "deux" }; | |
db31c358 NR |
513 | } |
514 | ||
515 | @SuppressWarnings("unused") | |
516 | class Data { | |
517 | private int value; | |
518 | ||
519 | private Data() { | |
520 | } | |
521 | ||
522 | public Data(int value) { | |
523 | this.value = value; | |
524 | } | |
525 | } | |
526 | ||
527 | @SuppressWarnings("unused") | |
528 | class DataObject extends Data { | |
529 | private Data data; | |
530 | ||
531 | @SuppressWarnings("synthetic-access") | |
532 | private DataObject() { | |
533 | } | |
534 | ||
535 | @SuppressWarnings("synthetic-access") | |
536 | public DataObject(Data data) { | |
537 | this.data = data; | |
538 | } | |
539 | } | |
540 | ||
541 | @SuppressWarnings("unused") | |
542 | class DataLoop extends Data { | |
543 | public DataLoop next; | |
544 | private String value; | |
545 | ||
546 | @SuppressWarnings("synthetic-access") | |
547 | private DataLoop() { | |
548 | } | |
549 | ||
550 | @SuppressWarnings("synthetic-access") | |
551 | public DataLoop(String value) { | |
552 | this.value = value; | |
553 | } | |
554 | } | |
e570f7eb NR |
555 | |
556 | enum EnumToSend { | |
557 | FANFAN, TULIPE, | |
558 | } | |
db31c358 | 559 | } |