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