1 #include <stdio.h>
2 #include <assert.h>
3 #include <string.h>
4 #include <fcntl.h>
5 #include <stdlib.h>
6
7 #include "Config.h"
8 #include "URL.h"
9 #include "Vector.h"
10 #include "system/Time.h"
11 #include "StringBuffer.h"
12
13
14 /**
15 * libzdb support classes unit tests.
16 */
17
vectorVisitor(const void * element,void * ap)18 static void vectorVisitor(const void *element, void *ap) {
19 printf("%c", *(char *)element);
20 (*((int*)ap))++;
21 }
22
23 int abortHandlerCalled = 0;
abortHandler(const char * error)24 static void abortHandler(const char *error) {
25 abortHandlerCalled = 1;
26 }
27
28
testStr()29 static void testStr() {
30 printf("============> Start Str Tests\n\n");
31
32 printf("=> Test1: copy\n");
33 {
34 char s3[STRLEN];
35 printf("\tResult: %s\n", Str_copy(s3, "The abc house",7));
36 assert(Str_isEqual(s3, "The abc"));
37 printf("\tTesting for NULL argument\n");
38 assert(! Str_copy(NULL, NULL, 7));
39 }
40 printf("=> Test1: OK\n\n");
41
42 printf("=> Test2: dup\n");
43 {
44 char *s4 = Str_dup("abc123");
45 printf("\tResult: %s\n", s4);
46 assert(Str_isEqual(s4, "abc123"));
47 printf("\tTesting for NULL argument\n");
48 assert(! Str_dup(NULL));
49 FREE(s4);
50 }
51 printf("=> Test2: OK\n\n");
52
53 printf("=> Test3: ndup\n");
54 {
55 char *s5 = Str_ndup("abc123", 3);
56 printf("\tResult: %s\n", s5);
57 assert(Str_isEqual(s5, "abc"));
58 printf("\tTesting for NULL argument\n");
59 assert(! Str_ndup(NULL, 3));
60 FREE(s5);
61 }
62 printf("=> Test3: OK\n\n");
63
64 printf("=> Test4: Str_cat & Str_vcat\n");
65 {
66 char *s6;
67 s6 = Str_cat("%s://%s%s?%s", "https", "foo.bar",
68 "/uri", "abc=123");
69 printf("\tResult: %s\n", s6);
70 assert(Str_isEqual(s6, "https://foo.bar/uri?abc=123"));
71 FREE(s6);
72 printf("\tTesting for NULL arguments\n");
73 s6 = Str_cat(NULL);
74 assert(s6 == NULL);
75 FREE(s6);
76 }
77 printf("=> Test4: OK\n\n");
78
79 printf("=> Test5: startsWith\n");
80 {
81 char *a = "mysql://localhost:3306/zild?user=root&password=swordfish";
82 printf("\tResult: starts with mysql - %s\n",
83 Str_startsWith(a, "mysql")?"yes":"no");
84 assert(Str_startsWith(a, "mysql"));
85 assert(! Str_startsWith(a, "sqlite"));
86 assert(Str_startsWith("sqlite", "sqlite"));
87 printf("\tTesting for NULL and NUL argument\n");
88 assert(! Str_startsWith(a, NULL));
89 assert(! Str_startsWith(a, ""));
90 assert(! Str_startsWith(NULL, "mysql"));
91 assert(! Str_startsWith("", NULL));
92 assert(! Str_startsWith(NULL, NULL));
93 assert(Str_startsWith("", ""));
94 }
95 printf("=> Test5: OK\n\n");
96
97 printf("=> Test6: parseInt, parseLong, parseLLong, parseFloat, parseDouble\n");
98 {
99 char i[STRLEN] = " -2812 bla";
100 char ll[STRLEN ] = " 2147483642 blabla";
101 char d[STRLEN] = " 2.71828182845904523536028747135266249775724709369995 this is e";
102 char de[STRLEN] = "9.461E^99 nanometers";
103 char ie[STRLEN] = " 9999999999999999999999999999999999999";
104 printf("\tResult:\n");
105 printf("\tParsed int32 = %d\n", Str_parseInt(i));
106 printf("\tParsed int64 = %lld\n", Str_parseLLong(ll));
107 printf("\tParsed double = %.52f\n", Str_parseDouble(d));
108 printf("\tParsed double exp = %.3e\n", Str_parseDouble(de));
109 TRY
110 {
111 printf("\tParse overflow int = %d\n", Str_parseInt(ie));
112 assert(false); //Should not come here
113 }
114 CATCH(SQLException)
115 END_TRY;
116 TRY
117 {
118 printf("\tParse NaN = %d\n", Str_parseInt("blabla"));
119 assert(false); //Should not come here
120 }
121 CATCH(SQLException)
122 END_TRY;
123 }
124 printf("=> Test6: OK\n\n");
125
126
127 printf("============> Str Tests: OK\n\n");
128 }
129
130
testMem()131 static void testMem() {
132 printf("============> Start Mem Tests\n\n");
133
134 printf("=> Test1: alloc\n");
135 {
136 char *s7 = ALLOC(2048);
137 assert(Str_isEqual(Str_copy(s7, "123456789", 2048), "123456789"));
138 FREE(s7);
139 }
140 printf("=> Test1: OK\n\n");
141
142 printf("=> Test2: calloc\n");
143 {
144 char *s8 = CALLOC(2, 1024);
145 assert(s8[2047] == '\0');
146 FREE(s8);
147 }
148 printf("=> Test2: OK\n\n");
149
150 printf("=> Test3: resize\n");
151 {
152 char *s9 = ALLOC(4);
153 Str_copy(s9, "abc", 3);
154 assert(Str_isEqual(s9, "abc"));
155 RESIZE(s9, 7);
156 Str_copy(s9, "abc123", 6);
157 assert(Str_isEqual(s9, "abc123"));
158 FREE(s9);
159 }
160 printf("=> Test3: OK\n\n");
161
162 printf("============> Mem Tests: OK\n\n");
163 }
164
165
testTime()166 static void testTime() {
167 printf("============> Start Time Tests\n\n");
168
169 printf("=> Test1: now\n");
170 {
171 printf("\tResult: %ld\n", Time_now());
172 }
173 printf("=> Test1: OK\n\n");
174
175 printf("=> Test2: milli\n");
176 {
177 printf("\tResult: %lld\n", Time_milli());
178 }
179 printf("=> Test2: OK\n\n");
180
181 printf("=> Test3: Time_toString\n");
182 {
183 char *t = Time_toString(1387010338, (char[20]){});
184 assert(Str_isEqual(t, "2013-12-14 08:38:58"));
185 printf("\tResult: %s\n", t);
186 // Assert time is converted to UTC
187 Time_toString(0, t);
188 assert(Str_isEqual(t, "1970-01-01 00:00:00"));
189 printf("\tResult: %s\n", t);
190 }
191 printf("=> Test3: OK\n\n");
192
193 printf("=> Test4: Time_toDateTime\n");
194 {
195 #if HAVE_STRUCT_TM_TM_GMTOFF
196 #define TM_GMTOFF tm_gmtoff
197 #else
198 #define TM_GMTOFF tm_wday
199 #endif
200 struct tm t;
201 // DateTime ISO-8601 format
202 assert(Time_toDateTime("2013-12-14T09:38:08Z", &t));
203 assert(t.tm_year == 2013);
204 assert(t.tm_mon == 11);
205 assert(t.tm_mday == 14);
206 assert(t.tm_hour == 9);
207 assert(t.tm_min == 38);
208 assert(t.tm_sec == 8);
209 // Date ISO-8601
210 assert(Time_toDateTime("2013-12-14", &t));
211 assert(t.tm_year == 2013);
212 assert(t.tm_mon == 11);
213 assert(t.tm_mday == 14);
214 // Old metric dd/mm/yyyy
215 assert(Time_toDateTime("14/12/2013", &t));
216 assert(t.tm_year == 2013);
217 assert(t.tm_mon == 11);
218 assert(t.tm_mday == 14);
219 // Time
220 assert(Time_toDateTime("09:38:08", &t));
221 assert(t.tm_hour == 9);
222 assert(t.tm_min == 38);
223 assert(t.tm_sec == 8);
224 // Time without seconds
225 assert(Time_toDateTime("09:38", &t));
226 assert(t.tm_hour == 9);
227 assert(t.tm_min == 38);
228 assert(t.tm_sec == 0);
229 // Compressed DateTime
230 assert(Time_toDateTime(" 20131214093808", &t));
231 assert(t.tm_year == 2013);
232 assert(t.tm_mon == 11);
233 assert(t.tm_mday == 14);
234 assert(t.tm_hour == 9);
235 assert(t.tm_min == 38);
236 assert(t.tm_sec == 8);
237 // Compressed Date
238 assert(Time_toDateTime(" 20131214 ", &t));
239 assert(t.tm_year == 2013);
240 assert(t.tm_mon == 11);
241 assert(t.tm_mday == 14);
242 // Compressed Time
243 assert(Time_toDateTime("093808", &t));
244 assert(t.tm_hour == 9);
245 assert(t.tm_min == 38);
246 assert(t.tm_sec == 8);
247 // Reverse DateTime
248 assert(Time_toDateTime(" 09:38:08 2013-12-14", &t));
249 assert(t.tm_year == 2013);
250 assert(t.tm_mon == 11);
251 assert(t.tm_mday == 14);
252 assert(t.tm_hour == 9);
253 assert(t.tm_min == 38);
254 assert(t.tm_sec == 8);
255 // DateTime with timezone Zulu (UTC)
256 assert(Time_toDateTime("The Battle of Stamford Bridge 1066-09-25 12:15:33+00:00", &t));
257 assert(t.tm_year == 1066);
258 assert(t.tm_mon == 8);
259 assert(t.tm_mday == 25);
260 assert(t.tm_hour == 12);
261 assert(t.tm_min == 15);
262 assert(t.tm_sec == 33);
263 assert(t.TM_GMTOFF == 0); // offset from UTC in seconds
264 // Time with timezone
265 assert(Time_toDateTime(" 09:38:08+01:45", &t));
266 assert(t.tm_hour == 9);
267 assert(t.tm_min == 38);
268 assert(t.tm_sec == 8);
269 assert(t.TM_GMTOFF == 6300);
270 // Time with timezone PST compressed
271 assert(Time_toDateTime("Pacific Time Zone 09:38:08 -0800 ", &t));
272 assert(t.tm_hour == 9);
273 assert(t.tm_min == 38);
274 assert(t.tm_sec == 8);
275 assert(t.TM_GMTOFF == -28800);
276 // Date without time, tz should not be set
277 assert(Time_toDateTime("2013-12-15-0800 ", &t));
278 assert(t.TM_GMTOFF == 0);
279 // Invalid date
280 TRY {
281 Time_toDateTime("1901-123-45 123:234", &t);
282 printf("\t Test Failed\n");
283 exit(1);
284 } CATCH (SQLException) {
285 // OK
286 } ELSE {
287 printf("\t Test Failed with wrong exception\n");
288 exit(1);
289 }
290 END_TRY;
291 }
292 printf("=> Test4: OK\n\n");
293
294 printf("=> Test5: Time_toTimestamp\n");
295 {
296 // Time, fraction of second is ignored. No timezone in string means UTC
297 time_t t = Time_toTimestamp("2013-12-15 00:12:58.123456");
298 assert(t == 1387066378);
299 // TimeZone east
300 t = Time_toTimestamp("Tokyo timezone: 2013-12-15 09:12:58+09:00");
301 assert(t == 1387066378);
302 // TimeZone west
303 t = Time_toTimestamp("New York timezone: 2013-12-14 19:12:58-05:00");
304 assert(t == 1387066378);
305 // TimeZone east with hour and minute offset
306 t = Time_toTimestamp("Nepal timezone: 2013-12-15 05:57:58+05:45");
307 assert(t == 1387066378);
308 // TimeZone Zulu
309 t = Time_toTimestamp("Grenwich timezone: 2013-12-15 00:12:58Z");
310 assert(t == 1387066378);
311 // Compressed
312 t = Time_toTimestamp("20131214191258-0500");
313 assert(t == 1387066378);
314 // Old metric style
315 t = Time_toTimestamp("15/12/2013 00:12");
316 assert(t == 1387066320);
317 // Invalid timestamp string
318 TRY {
319 Time_toTimestamp("1901-123-45");
320 // Should not come here
321 printf("\t Test Failed\n");
322 exit(1);
323 } CATCH (SQLException) {
324 // OK
325 } ELSE {
326 printf("\t Test Failed with wrong exception\n");
327 exit(1);
328 }
329 END_TRY;
330 }
331 printf("=> Test5: OK\n\n");
332
333 printf("=> Test6: usleep\n");
334 {
335 Time_usleep(1);
336 }
337 printf("=> Test6: OK\n\n");
338
339 printf("============> Time Tests: OK\n\n");
340 }
341
342
testSystem()343 static void testSystem() {
344 printf("============> Start System Tests\n\n");
345
346 printf("=> Test1: debug\n");
347 {
348 ZBDEBUG = true;
349 DEBUG("\tResult: %s\n", ABOUT);
350 }
351 printf("=> Test1: OK\n\n");
352
353 printf("=> Test2: abort\n");
354 {
355 AbortHandler = abortHandler;
356 ABORT("\tResult: %s\n", ABOUT);
357 assert(abortHandlerCalled);
358 AbortHandler = NULL; // Reset so exceptions are thrown in later tests
359 }
360 printf("=> Test2: OK\n\n");
361
362 printf("=> Test3: getLastError & getError\n");
363 {
364 int fd = open("l_d$#askfjlsdkfjlskfjdlskfjdlskfjaldkjf", 0);
365 assert(fd <= 0);
366 assert(System_getLastError());
367 assert(System_getError(errno));
368 }
369 printf("=> Test3: OK\n\n");
370
371 printf("============> System Tests: OK\n\n");
372 }
373
374
testURL()375 static void testURL() {
376 URL_T url;
377 printf("============> Start URL Tests\n\n");
378
379 printf("=> Test1: create/destroy\n");
380 {
381 url = URL_new("http://");
382 assert(url);
383 URL_free(&url);
384 }
385 printf("=> Test1: OK\n\n");
386
387 printf("=> Test2: NULL value\n");
388 {
389 url = URL_new(NULL);
390 assert(! url);
391 }
392 printf("=> Test2: OK\n\n");
393
394 printf("=> Test3: empty string\n");
395 {
396 url = URL_new("");
397 assert(! url);
398 }
399 printf("=> Test3: OK\n\n");
400
401 printf("=> Test4: non-url string\n");
402 {
403 url = URL_new("quad est demonstrandum");
404 assert(! url);
405 }
406 printf("=> Test4: OK\n\n");
407
408 printf("=> Test5: Parse full url string\n");
409 {
410 // Wrap in cruft to demonstrate that only the URL is parsed
411 url = URL_create("\t\n quad et <a href=http://hauk:admin@www.foo.bar%s",
412 ":8080/document/index.csp?query=string&name=libzdb#ref>ipsum demonstrandum</a>");
413 assert(url);
414 printf("\tResult:\n");
415 printf("\tprotocol: %s\n", URL_getProtocol(url));
416 assert(Str_isEqual("http", URL_getProtocol(url)));
417 printf("\tuser: %s\n", URL_getUser(url));
418 assert(Str_isEqual("hauk", URL_getUser(url)));
419 printf("\tpassword: %s\n", URL_getPassword(url));
420 assert(Str_isEqual("admin", URL_getPassword(url)));
421 printf("\thost: %s\n", URL_getHost(url));
422 assert(Str_isEqual("www.foo.bar", URL_getHost(url)));
423 printf("\tport: %d\n", URL_getPort(url));
424 assert(8080 == URL_getPort(url));
425 printf("\tpath: %s\n", URL_getPath(url));
426 assert(Str_isEqual("/document/index.csp", URL_getPath(url)));
427 printf("\tquery: %s\n", URL_getQueryString(url));
428 assert(Str_isEqual("query=string&name=libzdb", URL_getQueryString(url)));
429 printf("\tparameter name=%s\n", URL_getParameter(url, "name"));
430 assert(Str_isEqual("libzdb", URL_getParameter(url, "name")));
431 printf("\tparameter query=%s\n", URL_getParameter(url, "query"));
432 assert(Str_isEqual("string", URL_getParameter(url, "query")));
433 assert(Str_isEqual("http://hauk:admin@www.foo.bar:8080/document/index.csp?query=string&name=libzdb", URL_toString(url)));
434 URL_free(&url);
435 // Test URL_toString without explicit port
436 URL_T u = URL_new("http://www.tildeslash.com/");
437 assert(Str_isEqual("http://www.tildeslash.com/", URL_toString(u)));
438 URL_free(&u);
439 }
440 printf("=> Test5: OK\n\n");
441
442 printf("=> Test6: only http:// protocol string\n");
443 {
444 url = URL_new("http://");
445 assert(url);
446 printf("\tResult: %s\n", URL_toString(url));
447 assert(Str_isEqual(URL_toString(url), "http://"));
448 URL_free(&url);
449 }
450 printf("=> Test6: OK\n\n");
451
452 printf("=> Test7: file:///etc/passwd\n");
453 {
454 url = URL_new("file:///etc/passwd");
455 assert(url);
456 printf("\tResult: %s\n", URL_toString(url));
457 assert(Str_isEqual("file:///etc/passwd", URL_toString(url)));
458 printf("\tPath: %s\n", URL_getPath(url));
459 assert(Str_isEqual("/etc/passwd", URL_getPath(url)));
460 URL_free(&url);
461 }
462 printf("=> Test7: OK\n\n");
463
464 printf("=> Test8: unescape\n");
465 {
466 char s9a[] = "";
467 char s9x[] = "http://www.tildeslash.com/%";
468 char s9y[] = "http://www.tildeslash.com/%0";
469 char s9[] = "http://www.tildeslash.com/zild/%20zild%5B%5D.doc";
470 printf("\tResult: %s\n", URL_unescape(s9));
471 assert(Str_isEqual(s9, "http://www.tildeslash.com/zild/ zild[].doc"));
472 assert(Str_isEqual(URL_unescape(s9a), ""));
473 printf("\tTesting for NULL argument\n");
474 assert(! URL_unescape(NULL));
475 // Test guard against invalid url encoding
476 assert(Str_isEqual(URL_unescape(s9x), "http://www.tildeslash.com/"));
477 assert(Str_isEqual(URL_unescape(s9y), "http://www.tildeslash.com/"));
478 }
479 printf("=> Test8: OK\n\n");
480
481 printf("=> Test9: escape\n");
482 {
483 char s10[] = "http://www.tildeslash.com/<>#%{}|\\^~[] `";
484 char *rs10 = URL_escape(s10);
485 printf("\tResult: %s -> \n\t%s\n", s10, rs10);
486 assert(Str_isEqual(rs10, "http://www.tildeslash.com/%3C%3E%23%25%7B%7D%7C%5C%5E~%5B%5D%20%60"));
487 printf("\tTesting for NULL argument\n");
488 assert(! URL_escape(NULL));
489 FREE(rs10);
490 }
491 printf("=> Test9: OK\n\n");
492
493 printf("=> Test10: URL parameters,\n\tmysql://localhost:3306/db?"
494 "user=root&password=swordfish&charset=utf8\n");
495 {
496 int i = 0;
497 const char **params;
498 url = URL_create("mysql://localhost:3306/db?"
499 "user=root&password=swordfish&charset=utf8");
500 assert(url);
501 printf("\tParameter result:\n");
502 params = URL_getParameterNames(url);
503 if (params) for (i = 0; params[i]; i++)
504 printf("\t\t%s:%s\n",
505 params[i], URL_getParameter(url, params[i]));
506 assert(i == 3);
507 URL_free(&url);
508 }
509 printf("=> Test10: OK\n\n");
510
511 printf("=> Test11: auto unescape of credentials, path and param values\n");
512 {
513 url = URL_new("mysql://r%40ot:p%40ssword@localhost/test%20dir?user=r%26ot&password=pass%3Dword");
514 assert(IS(URL_getUser(url), "r@ot"));
515 assert(IS(URL_getPassword(url), "p@ssword"));
516 assert(IS(URL_getPath(url), "/test dir"));
517 assert(IS(URL_getParameter(url, "user"), "r&ot"));
518 assert(IS(URL_getParameter(url, "password"), "pass=word"));
519 URL_free(&url);
520 }
521 printf("=> Test11: OK\n\n");
522
523 printf("=> Test12: IPv4 and IPv6 hosts\n");
524 {
525 // IPv4
526 url = URL_new("mysql://r%40ot:p%40ssword@192.168.2.42:3306/test?user=r%26ot&password=pass%3Dword");
527 assert(IS(URL_getUser(url), "r@ot"));
528 assert(IS(URL_getPassword(url), "p@ssword"));
529 assert(IS(URL_getHost(url), "192.168.2.42"));
530 assert(URL_getPort(url) == 3306);
531 assert(IS(URL_getPath(url), "/test"));
532 assert(IS(URL_getParameter(url, "user"), "r&ot"));
533 assert(IS(URL_getParameter(url, "password"), "pass=word"));
534 URL_free(&url);
535 // IPv6
536 url = URL_new("mysql://r%40ot:p%40ssword@[2001:db8:85a3::8a2e:370:7334]:3306/test?user=r%26ot&password=pass%3Dword");
537 assert(IS(URL_getUser(url), "r@ot"));
538 assert(IS(URL_getPassword(url), "p@ssword"));
539 // Assert that IP6 brackets are removed
540 assert(IS(URL_getHost(url), "2001:db8:85a3::8a2e:370:7334"));
541 assert(URL_getPort(url) == 3306);
542 assert(IS(URL_getPath(url), "/test"));
543 assert(IS(URL_getParameter(url, "user"), "r&ot"));
544 assert(IS(URL_getParameter(url, "password"), "pass=word"));
545 // Assert that IP6 brackets are put back in toString
546 assert(IS(URL_toString(url), "mysql://r@ot:p@ssword@[2001:db8:85a3::8a2e:370:7334]:3306/test?user=r%26ot&password=pass%3Dword"));
547 URL_free(&url);
548 // IPv6 localhost
549 url = URL_new("mysql://[fe80::1%lo0]/");
550 // Assert that IP6 brackets are removed
551 assert(IS(URL_getHost(url), "fe80::1%lo0"));
552 assert(URL_getPort(url) == 3306);
553 // Assert that IP6 brackets are put back in toString
554 assert(IS(URL_toString(url), "mysql://[fe80::1%lo0]/"));
555 URL_free(&url);
556 }
557 printf("=> Test12: OK\n\n");
558
559 printf("============> URL Tests: OK\n\n");
560 }
561
562
testVector()563 static void testVector() {
564 Vector_T vector;
565 printf("============> Start Vector Tests\n\n");
566
567 printf("=> Test1: create/destroy\n");
568 {
569 vector = Vector_new(0);
570 assert(vector);
571 assert(Vector_size(vector) == 0);
572 Vector_free(&vector);
573 assert(vector == NULL);
574 }
575 printf("=> Test1: OK\n\n");
576
577 printf("=> Test1: push & get\n");
578 {
579 int i;
580 char b[] = "abcdefghijklmnopqrstuvwxyz";
581 vector = Vector_new(1);
582 assert(vector);
583 for (i = 0; i < 10; i++)
584 Vector_push(vector, &b[i]);
585 assert(Vector_size(vector) == 10);
586 assert(*(char*)Vector_get(vector, 7) =='h');
587 Vector_free(&vector);
588 assert(vector == NULL);
589 }
590 printf("=> Test1: OK\n\n");
591
592 printf("=> Test2: insert & get\n");
593 {
594 int i;
595 char b[] = "abcdefghijklmnopqrstuvwxyz";
596 vector = Vector_new(1);
597 assert(vector);
598 for (i = 0; i < 10; i++)
599 Vector_insert(vector, i, &b[i]);
600 assert(Vector_size(vector) == 10);
601 assert(*(char*)Vector_get(vector, 7) =='h');
602 Vector_insert(vector, 5, &b[21]);
603 assert(*(char*)Vector_get(vector, 8) =='h');
604 assert(*(char*)Vector_get(vector, 5) =='v');
605 assert(*(char*)Vector_get(vector, 4) =='e');
606 printf("\tResult: ");
607 for (i = 0; i<Vector_size(vector); i++)
608 printf("%c", *(char*)Vector_get(vector, i));
609 printf("\n");
610 assert(Vector_size(vector) == 11);
611 Vector_free(&vector);
612 assert(vector == NULL);
613 }
614 printf("=> Test2: OK\n\n");
615
616 printf("=> Test3: push & remove\n");
617 {
618 int i;
619 char b[] = "abcdefghijklmnopqrstuvwxyz";
620 vector = Vector_new(1);
621 assert(vector);
622 for (i = 0; i < 11; i++)
623 Vector_push(vector, &b[i]);
624 assert(Vector_size(vector) == 11);
625 for (i = 5; i>=0; i--)
626 assert(b[i] == *(char*)Vector_remove(vector, i));
627 assert(Vector_size(vector) == 5);
628 printf("\tResult: ");
629 for (i = 0; i<Vector_size(vector); i++)
630 printf("%c", *(char*)Vector_get(vector, i));
631 printf("\n");
632 assert('g'==*(char*)Vector_get(vector, 0));
633 for (i = Vector_size(vector)-1; i>=0; i--)
634 Vector_remove(vector, i);
635 assert(Vector_size(vector) == 0);
636 Vector_free(&vector);
637 assert(vector == NULL);
638 }
639 printf("=> Test3: OK\n\n");
640
641 printf("=> Test4: push & set\n");
642 {
643 int i,j;
644 char b[] = "abcde";
645 vector = Vector_new(1);
646 assert(vector);
647 for (i = 0; i < 5; i++)
648 Vector_push(vector, &b[i]);
649 assert(Vector_size(vector) == 5);
650 assert('b'==*(char*)Vector_get(vector, 1));
651 for (j =0,i =4; i>=0; i--,j++)
652 Vector_set(vector, j, &b[i]);
653 assert(Vector_size(vector) == 5);
654 assert('e'==*(char*)Vector_get(vector, 0) &&
655 'a'==*(char*)Vector_get(vector, Vector_size(vector)-1));
656 printf("\tResult: ");
657 for (i = 0; i<Vector_size(vector); i++)
658 printf("%c", *(char*)Vector_get(vector, i));
659 printf("\n");
660 Vector_free(&vector);
661 assert(vector == NULL);
662 }
663 printf("=> Test4: OK\n\n");
664
665 printf("=> Test5: map\n");
666 {
667 int i,j;
668 char b[] = "abcdefghijklmnopqrstuvwxyz";
669 vector = Vector_new(1);
670 assert(vector);
671 for (i = 0; i < 10; i++)
672 Vector_push(vector, &b[i]);
673 assert(Vector_size(vector) == 10);
674 j = 10;
675 printf("\tResult: ");
676 Vector_map(vector, vectorVisitor, &j);
677 printf("\n");
678 assert(j == 20);
679 Vector_free(&vector);
680 assert(vector == NULL);
681 }
682 printf("=> Test5: OK\n\n");
683
684 printf("=> Test6: toArray\n");
685 {
686 int i;
687 void **array;
688 char b[] = "abcdefghijklmnopqrstuvwxyz";
689 vector = Vector_new(9);
690 assert(vector);
691 for (i = 0; i < 26; i++)
692 Vector_push(vector, &b[i]);
693 assert(Vector_size(vector) == 26);
694 array = Vector_toArray(vector);
695 printf("\tResult: ");
696 for (i = 0; array[i]; i++)
697 printf("%c", *(char*)array[i]);
698 printf("\n");
699 FREE(array);
700 Vector_free(&vector);
701 assert(vector == NULL);
702 }
703 printf("=> Test6: OK\n\n");
704
705 printf("=> Test7: pop & isEmpty\n");
706 {
707 int i;
708 char b[] = "abcdefghijklmnopqrstuvwxyz";
709 vector = Vector_new(100);
710 assert(vector);
711 for (i = 0; i<26; i++)
712 Vector_push(vector, &b[i]);
713 assert(Vector_size(vector) == 26);
714 printf("\tResult: ");
715 while (! Vector_isEmpty(vector))
716 printf("%c", *(char*)Vector_pop(vector));
717 printf("\n");
718 assert(Vector_isEmpty(vector));
719 Vector_free(&vector);
720 assert(vector == NULL);
721 }
722 printf("=> Test7: OK\n\n");
723
724 printf("============> Vector Tests: OK\n\n");
725 }
726
727
testStringBuffer()728 static void testStringBuffer() {
729 StringBuffer_T sb;
730 printf("============> Start StringBuffer Tests\n\n");
731
732 printf("=> Test1: create/destroy\n");
733 {
734 sb = StringBuffer_new("");
735 assert(sb);
736 assert(StringBuffer_length(sb) == 0);
737 StringBuffer_free(&sb);
738 assert(sb == NULL);
739 sb = StringBuffer_create(4);
740 assert(sb);
741 assert(StringBuffer_length(sb) == 0);
742 StringBuffer_free(&sb);
743 assert(sb == NULL);
744 }
745 printf("=> Test1: OK\n\n");
746
747 printf("=> Test2: append NULL value\n");
748 {
749 sb = StringBuffer_new("");
750 assert(sb);
751 StringBuffer_append(sb, NULL);
752 assert(StringBuffer_length(sb) == 0);
753 StringBuffer_free(&sb);
754 assert(sb == NULL);
755 }
756 printf("=> Test2: OK\n\n");
757
758 printf("=> Test3: create with string\n");
759 {
760 sb = StringBuffer_new("abc");
761 assert(sb);
762 assert(StringBuffer_length(sb) == 3);
763 StringBuffer_free(&sb);
764 assert(sb == NULL);
765 }
766 printf("=> Test3: OK\n\n");
767
768 printf("=> Test4: append string value\n");
769 {
770 sb = StringBuffer_new("abc");
771 assert(sb);
772 StringBuffer_append(sb, "def");
773 assert(StringBuffer_length(sb) == 6);
774 StringBuffer_free(&sb);
775 assert(sb == NULL);
776 // Test with create
777 sb = StringBuffer_create(4);
778 assert(sb);
779 StringBuffer_append(sb, "abc");
780 assert(StringBuffer_length(sb) == 3);
781 StringBuffer_append(sb, "def");
782 assert(StringBuffer_length(sb) == 6);
783 StringBuffer_free(&sb);
784 assert(sb == NULL);
785 }
786 printf("=> Test4: OK\n\n");
787
788 printf("=> Test4: toString value\n");
789 {
790 sb = StringBuffer_new("abc");
791 assert(sb);
792 StringBuffer_append(sb, "def");
793 assert(Str_isEqual(StringBuffer_toString(sb), "abcdef"));
794 StringBuffer_free(&sb);
795 assert(sb == NULL);
796 }
797 printf("=> Test4: OK\n\n");
798
799 printf("=> Test5: internal resize\n");
800 {
801 int i;
802 sb = StringBuffer_new("");
803 assert(sb);
804 for (i = 0; i<1024; i++)
805 StringBuffer_append(sb, "a");
806 assert(StringBuffer_length(sb) == 1024);
807 assert(StringBuffer_toString(sb)[1023] == 'a');
808 assert(StringBuffer_toString(sb)[1024] == 0);
809 StringBuffer_free(&sb);
810 assert(sb == NULL);
811 }
812 printf("=> Test5: OK\n\n");
813
814 printf("=> Test6: prepare4postgres and prepare4oracle\n");
815 {
816 // Nothing to replace
817 sb = StringBuffer_new("select * from host;");
818 assert(StringBuffer_prepare4postgres(sb) == 0);
819 assert(Str_isEqual(StringBuffer_toString(sb), "select * from host;"));
820 StringBuffer_free(&sb);
821 assert(sb == NULL);
822 // Replace n < 10 using $
823 sb = StringBuffer_new("insert into host values(?, ?, ?);");
824 assert(StringBuffer_prepare4postgres(sb) == 3);
825 assert(Str_isEqual(StringBuffer_toString(sb), "insert into host values($1, $2, $3);"));
826 StringBuffer_free(&sb);
827 assert(sb == NULL);
828 // Replace n < 10 using :
829 sb = StringBuffer_new("insert into host values(?, ?, ?);");
830 assert(StringBuffer_prepare4oracle(sb) == 3);
831 assert(Str_isEqual(StringBuffer_toString(sb), "insert into host values(:1, :2, :3);"));
832 StringBuffer_free(&sb);
833 assert(sb == NULL);
834 // Replace n > 10
835 sb = StringBuffer_new("insert into host values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
836 assert(StringBuffer_prepare4postgres(sb) == 12);
837 assert(Str_isEqual(StringBuffer_toString(sb), "insert into host values($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12);"));
838 StringBuffer_free(&sb);
839 assert(sb == NULL);
840 // Replace n > 99, should throw exception
841 sb = StringBuffer_new("insert into host values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
842 assert(sb);
843 TRY
844 {
845 StringBuffer_prepare4postgres(sb);
846 assert(!"Should not come here");
847 }
848 CATCH(SQLException)
849 {
850 StringBuffer_free(&sb);
851 assert(sb == NULL);
852 }
853 END_TRY;
854 // Just 99 ?'s
855 sb = StringBuffer_new("???????????????????????????????????????????????????????????????????????????????????????????????????");
856 assert(StringBuffer_prepare4postgres(sb) == 99);
857 assert(Str_isEqual(StringBuffer_toString(sb), "$1$2$3$4$5$6$7$8$9$10$11$12$13$14$15$16$17$18$19$20$21$22$23$24$25$26$27$28$29$30$31$32$33$34$35$36$37$38$39$40$41$42$43$44$45$46$47$48$49$50$51$52$53$54$55$56$57$58$59$60$61$62$63$64$65$66$67$68$69$70$71$72$73$74$75$76$77$78$79$80$81$82$83$84$85$86$87$88$89$90$91$92$93$94$95$96$97$98$99"));
858 StringBuffer_free(&sb);
859 assert(sb == NULL);
860 }
861 printf("=> Test6: OK\n\n");
862
863 printf("=> Test7: trim\n");
864 {
865 // Empty buffer
866 sb = StringBuffer_create(256);
867 StringBuffer_trim(sb);
868 assert(Str_isEqual(StringBuffer_toString(sb), ""));
869 StringBuffer_free(&sb);
870 assert(sb == NULL);
871 // White space filled buffer
872 sb = StringBuffer_new(" ");
873 StringBuffer_trim(sb);
874 assert(Str_isEqual(StringBuffer_toString(sb), ""));
875 StringBuffer_free(&sb);
876 assert(sb == NULL);
877 // Nothing to remove
878 sb = StringBuffer_new("select a from b");
879 StringBuffer_trim(sb);
880 assert(Str_isEqual(StringBuffer_toString(sb), "select a from b"));
881 StringBuffer_free(&sb);
882 assert(sb == NULL);
883 // Remove last semicolon
884 sb = StringBuffer_new("select * from host;");
885 StringBuffer_trim(sb);
886 assert(Str_isEqual(StringBuffer_toString(sb), "select * from host"));
887 StringBuffer_free(&sb);
888 sb = StringBuffer_new(";");
889 StringBuffer_trim(sb);
890 assert(Str_isEqual(StringBuffer_toString(sb), ""));
891 StringBuffer_free(&sb);
892 // Test don't remove last semicolon if part of 'end;'
893 sb = StringBuffer_new("DECLARE blabla END; \n");
894 StringBuffer_trim(sb);
895 assert(Str_isEqual(StringBuffer_toString(sb), "DECLARE blabla END;"));
896 StringBuffer_free(&sb);
897 sb = StringBuffer_new("declare blabla end; \t\n");
898 StringBuffer_trim(sb);
899 assert(Str_isEqual(StringBuffer_toString(sb), "declare blabla END;"));
900 StringBuffer_free(&sb);
901 sb = StringBuffer_new("select * from x order by id; \t\n");
902 StringBuffer_trim(sb);
903 assert(Str_isEqual(StringBuffer_toString(sb), "select * from x order by id"));
904 StringBuffer_free(&sb);
905 sb = StringBuffer_new("end;");
906 StringBuffer_trim(sb);
907 assert(Str_isEqual(StringBuffer_toString(sb), "end;"));
908 StringBuffer_free(&sb);
909 sb = StringBuffer_new("and; \t\n");
910 StringBuffer_trim(sb);
911 assert(Str_isEqual(StringBuffer_toString(sb), "and"));
912 StringBuffer_free(&sb);
913 sb = StringBuffer_new("nd;");
914 StringBuffer_trim(sb);
915 assert(Str_isEqual(StringBuffer_toString(sb), "nd"));
916 StringBuffer_free(&sb);
917 assert(sb == NULL);
918 // Remove white space
919 sb = StringBuffer_new("\t select a from b; \r\n");
920 StringBuffer_trim(sb);
921 assert(Str_isEqual(StringBuffer_toString(sb), "select a from b"));
922 StringBuffer_free(&sb);
923 assert(sb == NULL);
924 }
925 printf("=> Test7: OK\n\n");
926
927 printf("=> Test8: set value\n");
928 {
929 sb= StringBuffer_new("abc");
930 assert(sb);
931 StringBuffer_set(sb, "def");
932 assert(IS(StringBuffer_toString(sb), "def"));
933 StringBuffer_free(&sb);
934 assert(sb==NULL);
935 printf("\tTesting set and internal resize:...");
936 sb= StringBuffer_create(4);
937 assert(sb);
938 StringBuffer_set(sb, "abc");
939 StringBuffer_set(sb, "abcdef");
940 assert(IS(StringBuffer_toString(sb), "abcdef"));
941 StringBuffer_set(sb, " ");
942 assert(IS(StringBuffer_toString(sb), " "));
943 printf("ok\n");
944 StringBuffer_free(&sb);
945 assert(sb==NULL);
946 }
947 printf("=> Test8: OK\n\n");
948
949 printf("============> StringBuffer Tests: OK\n\n");
950 }
951
952
main(void)953 int main(void) {
954 Exception_init();
955 testStr();
956 testMem();
957 testTime();
958 testSystem();
959 testURL();
960 testVector();
961 testStringBuffer();
962 return 0;
963 }
964