New release 0.3.2, see ChangeLog for changes
[profile/ivi/persistence-client-library.git] / test / persistence_client_library_test.c
1 /******************************************************************************
2  * Project         Persistency
3  * (c) copyright   2012
4  * Company         XS Embedded GmbH
5  *****************************************************************************/
6 /******************************************************************************
7  * This Source Code Form is subject to the terms of the
8  * Mozilla Public License, v. 2.0. If a  copy of the MPL was not distributed
9  * with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 ******************************************************************************/
11  /**
12  * @file           persistence_client_library_test.c
13  * @ingroup        Persistence client library test
14  * @author         Ingo Huerner
15  * @brief          Test of persistence client library
16  * @see            
17  */
18
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22 #include <errno.h>
23 #include <unistd.h>     /* exit */
24 #include <check.h>
25 #include <time.h>
26 #include <fcntl.h>
27 #include <sys/mman.h>
28
29 #include "../include/persistence_client_library_key.h"
30 #include "../include/persistence_client_library_file.h"
31 #include "../include/persistence_client_library_error_def.h"
32
33 // protected header, should be used only be persistence components
34 #include "../include_protected/persistence_client_library_data_access.h"
35
36
37 #define BUF_SIZE     64
38 #define NUM_OF_FILES 3
39 #define READ_SIZE    1024
40
41
42 char* dayOfWeek[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
43
44
45
46 START_TEST (test_GetData)
47 {
48    int ret = 0;
49    unsigned char buffer[READ_SIZE];
50
51    memset(buffer, 0, READ_SIZE);
52    ret = key_read_data(0xFF, "language/country_code",         0, 0, buffer, READ_SIZE);
53    fail_unless(strncmp((char*)buffer, "Custom plugin -> plugin_get_data_handle",
54                strlen((char*)buffer)) == 0, "Buffer not correctly read");
55    fail_unless(ret = strlen("Custom plugin -> plugin_get_data_handle"));
56
57    memset(buffer, 0, READ_SIZE);
58    ret = key_read_data(0xFF, "pos/last_position",         0, 0, buffer, READ_SIZE);
59    fail_unless(strncmp((char*)buffer, "CACHE_ +48° 10' 38.95\", +8° 44' 39.06\"",
60                strlen((char*)buffer)) == 0, "Buffer not correctly read");
61    fail_unless(ret = strlen("CACHE_ +48° 10' 38.95\", +8° 44' 39.06\""));
62
63    memset(buffer, 0, READ_SIZE);
64    ret = key_read_data(0,    "language/current_language", 3, 0, buffer, READ_SIZE);
65    fail_unless(strncmp((char*)buffer, "CACHE_ Kisuaheli", strlen((char*)buffer)) == 0, "Buffer not correctly read");
66
67    memset(buffer, 0, READ_SIZE);
68    ret = key_read_data(0xFF, "status/open_document",      3, 2, buffer, READ_SIZE);
69    fail_unless(strncmp((char*)buffer, "WT_ /var/opt/user_manual_climateControl.pdf", strlen((char*)buffer)) == 0, "Buffer not correctly read");
70
71    memset(buffer, 0, READ_SIZE);
72    ret = key_read_data(0x20, "address/home_address",      4, 0, buffer, READ_SIZE);
73    fail_unless(strncmp((char*)buffer, "WT_ 55327 Heimatstadt, Wohnstrasse 31", strlen((char*)buffer)) == 0, "Buffer not correctly read");
74
75    memset(buffer, 0, READ_SIZE);
76    ret = key_read_data(0xFF, "pos/last_satellites",       0, 0, buffer, READ_SIZE);
77    fail_unless(strncmp((char*)buffer, "WT_ 17", strlen((char*)buffer)) == 0, "Buffer not correctly read");
78
79    memset(buffer, 0, READ_SIZE);
80    ret = key_read_data(0x84, "links/last_link",           2, 0, buffer, READ_SIZE);
81    fail_unless(strncmp((char*)buffer, "CACHE_ /last_exit/brooklyn", strlen((char*)buffer)) == 0, "Buffer not correctly read");
82
83    memset(buffer, 0, READ_SIZE);
84    ret = key_read_data(0x84, "links/last_link",           2, 1, buffer, READ_SIZE);
85    fail_unless(strncmp((char*)buffer, "CACHE_ /last_exit/queens", strlen((char*)buffer)) == 0, "Buffer not correctly read");
86 }
87 END_TEST
88
89
90
91 START_TEST (test_GetDataHandle)
92 {
93    int ret = 0, handle = 0, handle2 = 0, handle3 = 0, handle4 = 0, size = 0;
94    unsigned char buffer[READ_SIZE];
95    struct tm *locTime;
96    time_t t = time(0);
97
98    char sysTimeBuffer[128];
99    memset(buffer, 0, READ_SIZE);
100
101    locTime = localtime(&t);
102
103    snprintf(sysTimeBuffer, 128, "TimeAndData: \"%s %d.%d.%d - %d:%.2d:%.2d Uhr\"", dayOfWeek[locTime->tm_wday], locTime->tm_mday, locTime->tm_mon, (locTime->tm_year+1900),
104                                                                   locTime->tm_hour, locTime->tm_min, locTime->tm_sec);
105    // open handle ---------------------------------------------------
106    handle = key_handle_open(0xFF, "posHandle/last_position", 1, 0);
107    printf("Handle: %d\n", handle);
108    fail_unless(handle >= 0, "Failed to open handle ==> /posHandle/last_position");
109
110    ret = key_handle_read_data(handle, buffer, READ_SIZE);
111    fail_unless(strncmp((char*)buffer, "WT_ H A N D L E: +48° 10' 38.95\", +8° 44' 39.06\"", ret-1) == 0, "Buffer not correctly read");
112
113    size = key_handle_get_size(handle);
114    fail_unless(size = strlen("WT_ H A N D L E: +48° 10' 38.95\", +8° 44' 39.06\""));
115
116
117    // open handle ---------------------------------------------------
118    handle2 = key_handle_open(0xFF, "statusHandle/open_document", 3, 2);
119    fail_unless(handle2 >= 0, "Failed to open handle /statusHandle/open_document");
120
121    size = key_handle_write_data(handle2, (unsigned char*)sysTimeBuffer, strlen(sysTimeBuffer));
122    fail_unless(size = strlen(sysTimeBuffer));
123    // close
124    ret = key_handle_close(handle2);
125
126
127    // open handle ---------------------------------------------------
128    memset(buffer, 0, READ_SIZE);
129    handle4 = key_handle_open(0xFF, "language/country_code", 0, 0);
130    fail_unless(handle4 >= 0, "Failed to open handle /language/country_code");
131
132    ret = key_handle_read_data(handle4, buffer, READ_SIZE);
133    fail_unless(strncmp((char*)buffer, "Custom plugin -> plugin_get_data_handle", -1) == 0, "Buffer not correctly read");
134
135    size = key_handle_get_size(handle4);
136    fail_unless(size = strlen("Custom plugin -> plugin_get_data_handle"));
137
138    ret = key_handle_write_data(handle4, (unsigned char*)"Only dummy implementation behind custom library", READ_SIZE);
139
140
141    // open handle ---------------------------------------------------
142    handle3 = key_handle_open(0xFF, "statusHandle/open_document", 3, 2);
143    fail_unless(handle3 >= 0, "Failed to open handle /statusHandle/open_document");
144
145    ret = key_handle_read_data(handle3, buffer, READ_SIZE);
146    fail_unless(strncmp((char*)buffer, sysTimeBuffer, strlen(sysTimeBuffer)) == 0, "Buffer not correctly read");
147
148    size = key_handle_get_size(handle3);
149    fail_unless(size = strlen(sysTimeBuffer));
150
151    // close handle
152    ret = key_handle_close(handle);
153    ret = key_handle_close(handle3);
154    ret = key_handle_close(handle4);
155
156
157 }
158 END_TEST
159
160
161
162 START_TEST(test_SetData)
163 {
164    int ret = 0;
165    unsigned char buffer[READ_SIZE];
166    char write1[READ_SIZE];
167    char write2[READ_SIZE];
168    char sysTimeBuffer[256];
169
170    struct tm *locTime;
171    time_t t = time(0);
172
173    locTime = localtime(&t);
174    memset(buffer, 0, READ_SIZE);
175    memset(write1, 0, READ_SIZE);
176    memset(write2, 0, READ_SIZE);
177
178    // write data
179    snprintf(sysTimeBuffer, 128, "\"%s %d.%d.%d - %d:%.2d:%.2d Uhr\"", dayOfWeek[locTime->tm_wday], locTime->tm_mday, locTime->tm_mon, (locTime->tm_year+1900),
180                                                                  locTime->tm_hour, locTime->tm_min, locTime->tm_sec);
181
182    ret = key_write_data(0xFF, "69", 1, 2, (unsigned char*)sysTimeBuffer, strlen(sysTimeBuffer));
183    fail_unless(ret == strlen(sysTimeBuffer), "Wrong write size");
184
185    snprintf(write1, 128, "%s %s", "/70",  sysTimeBuffer);
186    ret = key_write_data(0xFF, "70", 1, 2, (unsigned char*)write1, strlen(write1));
187    fail_unless(ret == strlen(write1), "Wrong write size");
188
189    snprintf(write2, 128, "%s %s", "/key_70",  sysTimeBuffer);
190    ret = key_write_data(0xFF, "key_70", 1, 2, (unsigned char*)write2, strlen(write2));
191    fail_unless(ret == strlen(write2), "Wrong write size");
192
193    // read data again and and verify datat has been written correctly
194    memset(buffer, 0, READ_SIZE);
195    ret = key_read_data(0xFF, "69", 1, 2, buffer, READ_SIZE);
196    fail_unless(strncmp((char*)buffer, sysTimeBuffer, strlen(sysTimeBuffer)) == 0, "Buffer not correctly read");
197    fail_unless(ret == strlen(sysTimeBuffer), "Wrong read size");
198
199    memset(buffer, 0, READ_SIZE);
200    ret = key_read_data(0xFF, "70", 1, 2, buffer, READ_SIZE);
201    fail_unless(strncmp((char*)buffer, write1, strlen(write1)) == 0, "Buffer not correctly read");
202    fail_unless(ret == strlen(write1), "Wrong read size");
203
204    memset(buffer, 0, READ_SIZE);
205    ret = key_read_data(0xFF, "key_70", 1, 2, buffer, READ_SIZE);
206    fail_unless(strncmp((char*)buffer, write2, strlen(write2)) == 0, "Buffer not correctly read");
207    fail_unless(ret == strlen(write2), "Wrong read size");
208
209 }
210 END_TEST
211
212
213
214 START_TEST(test_GetDataSize)
215 {
216    int size = 0;
217
218    size = key_get_size(0xFF, "status/open_document", 3, 2);
219    fail_unless(size == strlen("WT_ /var/opt/user_manual_climateControl.pdf"), "Invalid size");
220
221    size = key_get_size(0x84, "links/last_link", 2, 1);
222    fail_unless(size == strlen("CACHE_ /last_exit/queens"), "Invalid size");
223 }
224 END_TEST
225
226
227
228 START_TEST(test_DeleteData)
229 {
230    int rval = 0;
231    unsigned char buffer[READ_SIZE];
232
233    // delete key
234    rval = key_delete(0xFF, "key_70", 1, 2);
235    fail_unless(rval == 0, "Failed to delete key");
236    // reading from key must fail now
237    rval = key_read_data(0xFF, "key_70", 1, 2, buffer, READ_SIZE);
238    fail_unless(rval == EPERS_NOKEY, "Read form key key_70 works, but should fail");
239
240
241    rval = key_delete(0xFF, "70", 1, 2);
242    fail_unless(rval == 0, "Failed to delete key");
243    rval = key_read_data(0xFF, "70", 1, 2, buffer, READ_SIZE);
244    fail_unless(rval == EPERS_NOKEY, "Read form key 70 works, but should fail");
245 }
246 END_TEST
247
248
249
250 START_TEST(test_DataFile)
251 {
252    int fd = 0, i = 0, idx = 0;
253    int size = 0, ret = 0;
254    int writeSize = 16*1024;
255    unsigned char buffer[READ_SIZE];
256    const char* refBuffer = "/Data/mnt-wt/lt-persistence_client_library_test/user/1/seat/1/media";
257    char* writeBuffer;
258    char* fileMap = NULL;
259    writeBuffer = malloc(writeSize);
260
261
262    // fill buffer a sequence
263    for(i = 0; i<(writeSize/8); i++)
264    {
265       writeBuffer[idx++] = 'A';
266       writeBuffer[idx++] = 'B';
267       writeBuffer[idx++] = 'C';
268       writeBuffer[idx++] = ' ';
269       writeBuffer[idx++] = 'D';
270       writeBuffer[idx++] = 'E';
271       writeBuffer[idx++] = 'F';
272       writeBuffer[idx++] = ' ';
273    }
274    memset(buffer, 0, READ_SIZE);
275
276    // create file
277    fd = open("/Data/mnt-wt/lt-persistence_client_library_test/user/1/seat/1/media/mediaDBWrite.db",
278              O_CREAT|O_RDWR|O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
279    close(fd);
280
281    // open ----------------------------------------------------------
282    fd = file_open(0xFF, "media/mediaDB.db", 1, 1);
283    fail_unless(fd != -1, "Could not open file ==> /media/mediaDB.db");
284
285    size = file_get_size(fd);
286    fail_unless(size == 68, "Wrong file size");
287
288    size = file_read_data(fd, buffer, READ_SIZE);
289    fail_unless(strncmp((char*)buffer, refBuffer, strlen(refBuffer)) == 0, "Buffer not correctly read");
290    fail_unless(size == (strlen(refBuffer)+1), "Wrong size returned");      // strlen + 1 ==> inlcude cr/lf
291
292    ret = file_close(fd);
293    fail_unless(ret == 0, "Failed to close file");
294
295
296    // open ----------------------------------------------------------
297    fd = file_open(0xFF, "media/mediaDBWrite.db", 1, 1);
298    fail_unless(fd != -1, "Could not open file ==> /media/mediaDBWrite.db");
299
300    size = file_write_data(fd, writeBuffer, strlen(writeBuffer));
301    fail_unless(size == strlen(writeBuffer), "Failed to write data");
302
303    ret = file_close(fd);
304    fail_unless(ret == 0, "Failed to close file");
305
306
307    // remove ----------------------------------------------------------
308    ret = file_remove(0xFF, "media/mediaDBWrite.db", 1, 1);
309    fail_unless(ret == 0, "File can't be removed ==> /media/mediaDBWrite.db");
310
311    fd = file_open(0xFF, "media/mediaDBWrite.db", 1, 1);
312    fail_unless(fd == -1, "File can be opend, but should not ==> /media/mediaDBWrite.db");
313
314
315    // map file ------------------------------------------------------
316    fd = file_open(0xFF, "media/mediaDB.db", 1, 1);
317
318    size = file_get_size(fd);
319    file_map_data(fileMap, size, 0, fd);
320    fail_unless(fileMap != MAP_FAILED, "Failed to map file");
321
322    ret = file_unmap_data(fileMap, size);
323    fail_unless(ret != -1, "Failed to unmap file");
324
325    // negative test
326    size = file_get_size(1024);
327    fail_unless(ret == 0, "Got size, but should not");
328
329
330    free(writeBuffer);
331 }
332 END_TEST
333
334
335
336 START_TEST(test_DataHandle)
337 {
338    int handle1 = 0, handle2 = 0;
339    int ret = 0;
340
341    // test file handles
342    handle1 = file_open(0xFF, "media/mediaDB.db", 1, 1);
343    fail_unless(handle1 != -1, "Could not open file ==> /media/mediaDB.db");
344
345    ret = file_close(handle1);
346    fail_unless(handle1 != -1, "Could not closefile ==> /media/mediaDB.db");
347
348    ret = file_close(1024);
349    fail_unless(ret == -1, "Could close file, but should not!!");
350
351    ret = file_close(17);
352    fail_unless(ret == -1, "Could close file, but should not!!");
353
354
355    // test key handles
356    handle2 = key_handle_open(0xFF, "statusHandle/open_document", 3, 2);
357    fail_unless(handle2 >= 0, "Failed to open handle /statusHandle/open_document");
358
359    ret = key_handle_close(handle2);
360    fail_unless(ret != -1, "Failed to close handle!!");
361
362    ret = key_handle_close(1024);
363    fail_unless(ret == -1, "Could close, but should not!!");
364 }
365 END_TEST
366
367
368
369 START_TEST(test_DataHandleOpen)
370 {
371    int hd1 = -2, hd2 = -2, hd3 = -2, hd4 = -2, hd5 = -2, hd6 = -2, hd7 = -2, hd8 = -2, hd9 = -2, ret = 0;
372
373    // open handles ----------------------------------------------------
374    hd1 = key_handle_open(0xFF, "posHandle/last_position1", 0, 0);
375    fail_unless(hd1 == 1, "Failed to open handle ==> /posHandle/last_position1");
376
377    hd2 = key_handle_open(0xFF, "posHandle/last_position2", 0, 0);
378    fail_unless(hd2 == 2, "Failed to open handle ==> /posHandle/last_position2");
379
380    hd3 = key_handle_open(0xFF, "posHandle/last_position3", 0, 0);
381    fail_unless(hd3 == 3, "Failed to open handle ==> /posHandle/last_position3");
382
383    // close handles ---------------------------------------------------
384    ret = key_handle_close(hd1);
385    fail_unless(ret != -1, "Failed to close handle!!");
386
387    ret = key_handle_close(hd2);
388    fail_unless(ret != -1, "Failed to close handle!!");
389
390    ret = key_handle_close(hd3);
391    fail_unless(ret != -1, "Failed to close handle!!");
392
393    // open handles ----------------------------------------------------
394    hd4 = key_handle_open(0xFF, "posHandle/last_position4", 0, 0);
395    fail_unless(hd4 == 3, "Failed to open handle ==> /posHandle/last_position4");
396
397    hd5 = key_handle_open(0xFF, "posHandle/last_position5", 0, 0);
398    fail_unless(hd5 == 2, "Failed to open handle ==> /posHandle/last_position5");
399
400    hd6 = key_handle_open(0xFF, "posHandle/last_position6", 0, 0);
401    fail_unless(hd6 == 1, "Failed to open handle ==> /posHandle/last_position6");
402
403    hd7 = key_handle_open(0xFF, "posHandle/last_position7", 0, 0);
404    fail_unless(hd7 == 4, "Failed to open handle ==> /posHandle/last_position7");
405
406    hd8 = key_handle_open(0xFF, "posHandle/last_position8", 0, 0);
407    fail_unless(hd8 == 5, "Failed to open handle ==> /posHandle/last_position8");
408
409    hd9 = key_handle_open(0xFF, "posHandle/last_position9", 0, 0);
410    fail_unless(hd9 == 6, "Failed to open handle ==> /posHandle/last_position9");
411
412    // close handles ---------------------------------------------------
413    ret = key_handle_close(hd4);
414    fail_unless(ret != -1, "Failed to close handle!!");
415
416    ret = key_handle_close(hd5);
417    fail_unless(ret != -1, "Failed to close handle!!");
418
419    ret = key_handle_close(hd6);
420    fail_unless(ret != -1, "Failed to close handle!!");
421
422    ret = key_handle_close(hd7);
423    fail_unless(ret != -1, "Failed to close handle!!");
424
425    ret = key_handle_close(hd8);
426    fail_unless(ret != -1, "Failed to close handle!!");
427
428    ret = key_handle_close(hd9);
429    fail_unless(ret != -1, "Failed to close handle!!");
430 }
431 END_TEST
432
433
434
435 START_TEST(test_Cursor)
436 {
437    int handle = -1, rval = 0, size = 0, handle1 = 0;
438    char bufferKeySrc[READ_SIZE];
439    char bufferDataSrc[READ_SIZE];
440    char bufferKeyDst[READ_SIZE];
441    char bufferDataDst[READ_SIZE];
442
443    memset(bufferKeySrc, 0, READ_SIZE);
444    memset(bufferDataSrc, 0, READ_SIZE);
445
446    memset(bufferKeyDst, 0, READ_SIZE);
447    memset(bufferDataDst, 0, READ_SIZE);
448
449    // create cursor
450    handle = persistence_db_cursor_create("/Data/mnt-c/lt-persistence_client_library_test/cached.itz",
451                                           PersistenceStorage_local, PersistencePolicy_wc);
452
453    fail_unless(handle != -1, "Failed to create cursor!!");
454
455    // create cursor
456    handle1 = persistence_db_cursor_create("/Data/mnt-c/lt-persistence_client_library_test/wt.itz",
457                                            PersistenceStorage_local, PersistencePolicy_wt);
458
459    fail_unless(handle1 != -1, "Failed to create cursor!!");
460
461    do
462    {
463       memset(bufferKeySrc, 0, READ_SIZE);
464       memset(bufferDataSrc, 0, READ_SIZE);
465       memset(bufferKeyDst, 0, READ_SIZE);
466       memset(bufferDataDst, 0, READ_SIZE);
467
468       // get key
469       rval = persistence_db_cursor_get_key(handle, bufferKeySrc, 128);
470       fail_unless(rval != -1, "Cursor failed to get key!!");
471       // get data
472       rval = persistence_db_cursor_get_data(handle, bufferDataSrc, 128);
473       fail_unless(rval != -1, "Cursor failed to get data!!");
474       // get size
475       size = persistence_db_cursor_get_data_size(handle);
476       fail_unless(size != -1, "Cursor failed to get size!!");
477       //printf("1. Key: %s | Data: %s » Size: %d \n", bufferKeySrc, bufferDataSrc, size);
478
479       // get key
480       rval = persistence_db_cursor_get_key(handle1, bufferKeyDst, 128);
481       fail_unless(rval != -1, "Cursor failed to get key!!");
482       // get data
483       rval = persistence_db_cursor_get_data(handle1, bufferDataDst, 128);
484       fail_unless(rval != -1, "Cursor failed to get data!!");
485       // get size
486       size = persistence_db_cursor_get_data_size(handle1);
487       fail_unless(size != -1, "Cursor failed to get size!!");
488       //printf("  2. Key: %s | Data: %s » Size: %d \n", bufferKeyDst, bufferDataDst, size);
489    }
490    while( (persistence_db_cursor_next(handle) == 0) && (persistence_db_cursor_next(handle1) == 0) ); // next cursor
491
492    // destory cursor
493    rval = persistence_db_cursor_destroy(handle);
494    fail_unless(rval != -1, "Failed to destroy cursor!!");
495
496    rval = persistence_db_cursor_destroy(handle1);
497    fail_unless(rval != -1, "Failed to destroy cursor!!");
498 }
499 END_TEST
500
501
502
503 static Suite * persistencyClientLib_suite()
504 {
505    Suite * s  = suite_create("Persistency client library");
506
507    TCase * tc_persGetData = tcase_create("GetData");
508    tcase_add_test(tc_persGetData, test_GetData);
509
510    TCase * tc_persSetData = tcase_create("SetData");
511    tcase_add_test(tc_persSetData, test_SetData);
512
513    TCase * tc_persGetDataSize = tcase_create("GetDataSize");
514    tcase_add_test(tc_persGetDataSize, test_GetDataSize);
515
516    TCase * tc_persDeleteData = tcase_create("DeleteData");
517    tcase_add_test(tc_persDeleteData, test_DeleteData);
518
519    TCase * tc_persGetDataHandle = tcase_create("GetDataHandle");
520    tcase_add_test(tc_persGetDataHandle, test_GetDataHandle);
521
522    TCase * tc_persDataHandle = tcase_create("DataHandle");
523    tcase_add_test(tc_persDataHandle, test_DataHandle);
524
525    TCase * tc_persDataHandleOpen = tcase_create("DataHandleOpen");
526    tcase_add_test(tc_persDataHandleOpen, test_DataHandleOpen);
527
528    TCase * tc_persDataFile = tcase_create("DataFile");
529    tcase_add_test(tc_persDataFile, test_DataFile);
530
531    TCase * tc_Cursor = tcase_create("Cursor");
532    tcase_add_test(tc_Cursor, test_Cursor);
533
534    suite_add_tcase(s, tc_persGetData);
535    suite_add_tcase(s, tc_persSetData);
536    suite_add_tcase(s, tc_persGetDataSize);
537    suite_add_tcase(s, tc_persDeleteData);
538    suite_add_tcase(s, tc_persGetDataHandle);
539    suite_add_tcase(s, tc_persDataHandle);
540    suite_add_tcase(s, tc_persDataHandleOpen);
541    suite_add_tcase(s, tc_persDataFile);
542    suite_add_tcase(s, tc_Cursor);
543
544    return s;
545 }
546
547
548
549
550 int main(int argc, char *argv[])
551 {
552    int nr_failed = 0;
553
554    Suite * s = persistencyClientLib_suite();
555    SRunner * sr = srunner_create(s);
556    srunner_run_all(sr, CK_VERBOSE);
557    nr_failed = srunner_ntests_failed(sr);
558
559    srunner_free(sr);
560    return (0==nr_failed)?EXIT_SUCCESS:EXIT_FAILURE;
561
562 }
563