New version 0.2.1 (rev 1748), for chnages see ChangeLog
[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    Permission is hereby granted, free of charge, to any person obtaining 
8    a copy of this software and associated documentation files (the "Software"), 
9    to deal in the Software without restriction, including without limitation 
10    the rights to use, copy, modify, merge, publish, distribute, sublicense, 
11    and/or sell copies of the Software, and to permit persons to whom the 
12    Software is furnished to do so, subject to the following conditions:
13
14    The above copyright notice and this permission notice shall be included 
15    in all copies or substantial portions of the Software.
16
17    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
18    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
19    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
20    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
21    DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
22    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
23    OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 ******************************************************************************/
25  /**
26  * @file           persistence_client_library_test.c
27  * @ingroup        Persistence client library test
28  * @author         Ingo Huerner
29  * @brief          Test of persistence client library
30  * @see            
31  */
32
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <errno.h>
37 #include <unistd.h>     /* exit */
38 #include <check.h>
39 #include <time.h>
40 #include <fcntl.h>
41 #include <sys/mman.h>
42
43 #include "../include/persistence_client_library_key.h"
44 #include "../include/persistence_client_library_file.h"
45 #include "../include/persistence_client_library_error_def.h"
46
47
48 #define BUF_SIZE     64
49 #define NUM_OF_FILES 3
50 #define READ_SIZE    1024
51
52
53 char* dayOfWeek[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
54
55
56
57 START_TEST (test_persGetData)
58 {
59    int ret = 0;
60    unsigned char buffer[READ_SIZE];
61
62    memset(buffer, 0, READ_SIZE);
63    ret = key_read_data(0xFF, "/language/country_code",         0, 0, buffer, READ_SIZE);   // "/Data/mnt-c/Appl-1/cached.gvdb"             => "/Node/pos/last position"
64    fail_unless(strncmp((char*)buffer, "Custom plugin -> plugin_get_data_handle", strlen((char*)buffer)) == 0, "Buffer not correctly read");
65    fail_unless(ret = strlen("Custom plugin -> plugin_get_data_handle"));
66
67    memset(buffer, 0, READ_SIZE);
68    ret = key_read_data(0xFF, "/pos/last_position",         0, 0, buffer, READ_SIZE);   // "/Data/mnt-c/Appl-1/cached.gvdb"             => "/Node/pos/last position"
69    fail_unless(strncmp((char*)buffer, "+48° 10' 38.95\", +8° 44' 39.06\"", strlen((char*)buffer)) == 0, "Buffer not correctly read");
70    fail_unless(ret = strlen("+48° 10' 38.95\", +8° 44' 39.06\""));
71
72    memset(buffer, 0, READ_SIZE);
73    ret = key_read_data(0,    "/language/current_language", 3, 0, buffer, READ_SIZE);   // "/Data/mnt-wt/Shared/Public/wt.dconf"        => "/User/3/language/current_language"
74    fail_unless(strncmp((char*)buffer, "S H A R E D   D A T A  => not implemented yet", strlen((char*)buffer)) == 0, "Buffer not correctly read");
75
76    memset(buffer, 0, READ_SIZE);
77    ret = key_read_data(0xFF, "/status/open_document",      3, 2, buffer, READ_SIZE);   // "/Data/mnt-c/Appl-1/cached.gvdb"             => "/User/3/Seat/2/status/open_document"
78    fail_unless(strncmp((char*)buffer, "/var/opt/user_manual_climateControl.pdf", strlen((char*)buffer)) == 0, "Buffer not correctly read");
79
80    memset(buffer, 0, READ_SIZE);
81    ret = key_read_data(0x20, "/address/home_address",      4, 0, buffer, READ_SIZE);   // "/Data/mnt-c/Shared/Group/20/cached.dconf"   => "/User/4/address/home_address"
82    fail_unless(strncmp((char*)buffer, "S H A R E D   D A T A  => not implemented yet", strlen((char*)buffer)) == 0, "Buffer not correctly read");
83
84    memset(buffer, 0, READ_SIZE);
85    ret = key_read_data(0xFF, "/pos/last satellites",       0, 0, buffer, READ_SIZE);   // "/Data/mnt-wt/Appl-1/wt.gvdb"                => "/Node/pos/last satellites"
86    fail_unless(strncmp((char*)buffer, "17", strlen((char*)buffer)) == 0, "Buffer not correctly read");
87
88    memset(buffer, 0, READ_SIZE);
89    ret = key_read_data(0x84, "/links/last link",           2, 0, buffer, READ_SIZE);   // "/Data/mnt-wt/Appl-2/wt.gvdb"                => "/84/User/2/links/last link"
90    fail_unless(strncmp((char*)buffer, "/last_exit/brooklyn", strlen((char*)buffer)) == 0, "Buffer not correctly read");
91
92    memset(buffer, 0, READ_SIZE);
93    ret = key_read_data(0x84, "/links/last link",           2, 1, buffer, READ_SIZE);   // "/Data/mnt-wt/Appl-2/wt.gvdb"                => "/84/User/2/links/last link"
94    fail_unless(strncmp((char*)buffer, "/last_exit/queens", strlen((char*)buffer)) == 0, "Buffer not correctly read");
95 }
96 END_TEST
97
98
99
100 START_TEST (test_persGetDataHandle)
101 {
102    int ret = 0, handle = 0, handle2 = 0, handle3 = 0, handle4 = 0, size = 0;
103    unsigned char buffer[READ_SIZE];
104    struct tm *locTime;
105    time_t t = time(0);
106
107    char sysTimeBuffer[128];
108    memset(buffer, 0, READ_SIZE);
109
110    locTime = localtime(&t);
111
112    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),
113                                                                   locTime->tm_hour, locTime->tm_min, locTime->tm_sec);
114    // open handle ---------------------------------------------------
115    handle = key_handle_open(0xFF, "/posHandle/last position", 0, 0);
116    fail_unless(handle >= 0, "Failed to open handle ==> /posHandle/last position");
117
118    ret = key_handle_read_data(handle, buffer, READ_SIZE);
119    fail_unless(strncmp((char*)buffer, "H A N D L E: +48° 10' 38.95\", +8° 44' 39.06\"", ret-1) == 0, "Buffer not correctly read");
120
121    size = key_handle_get_size(handle);
122    fail_unless(size = strlen("H A N D L E: +48° 10' 38.95\", +8° 44' 39.06\""));
123
124
125    // open handle ---------------------------------------------------
126    handle2 = key_handle_open(0xFF, "/statusHandle/open_document", 3, 2);
127    fail_unless(handle2 >= 0, "Failed to open handle /statusHandle/open_document");
128
129    size = key_handle_write_data(handle2, (unsigned char*)sysTimeBuffer, strlen(sysTimeBuffer));
130    fail_unless(size = strlen(sysTimeBuffer));
131    // close
132    ret = key_handle_close(handle2);
133
134
135    // open handle ---------------------------------------------------
136    memset(buffer, 0, READ_SIZE);
137    handle4 = key_handle_open(0xFF, "/language/country_code", 0, 0);
138    fail_unless(handle4 >= 0, "Failed to open handle /language/country_code");
139
140    ret = key_handle_read_data(handle4, buffer, READ_SIZE);
141    fail_unless(strncmp((char*)buffer, "Custom plugin -> plugin_get_data_handle", -1) == 0, "Buffer not correctly read");
142
143    size = key_handle_get_size(handle4);
144    fail_unless(size = strlen("Custom plugin -> plugin_get_data_handle"));
145
146    ret = key_handle_write_data(handle4, (unsigned char*)"Only dummy implementation behind custom library", READ_SIZE);
147
148
149    // open handle ---------------------------------------------------
150    handle3 = key_handle_open(0xFF, "/statusHandle/open_document", 3, 2);
151    fail_unless(handle3 >= 0, "Failed to open handle /statusHandle/open_document");
152
153    ret = key_handle_read_data(handle3, buffer, READ_SIZE);
154    fail_unless(strncmp((char*)buffer, sysTimeBuffer, strlen(sysTimeBuffer)) == 0, "Buffer not correctly read");
155
156    size = key_handle_get_size(handle3);
157    fail_unless(size = strlen(sysTimeBuffer));
158
159    // close handle
160    ret = key_handle_close(handle);
161    ret = key_handle_close(handle3);
162    ret = key_handle_close(handle4);
163
164
165 }
166 END_TEST
167
168
169
170 START_TEST(test_persSetData)
171 {
172    int ret = 0;
173    unsigned char buffer[READ_SIZE];
174    char write1[READ_SIZE];
175    char write2[READ_SIZE];
176    char sysTimeBuffer[256];
177
178    struct tm *locTime;
179    time_t t = time(0);
180
181    locTime = localtime(&t);
182    memset(buffer, 0, READ_SIZE);
183    memset(write1, 0, READ_SIZE);
184    memset(write2, 0, READ_SIZE);
185
186    // write data
187    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),
188                                                                  locTime->tm_hour, locTime->tm_min, locTime->tm_sec);
189    ret = key_write_data(0xFF, "/69", 1, 2, (unsigned char*)sysTimeBuffer, strlen(sysTimeBuffer));
190    fail_unless(ret == strlen(sysTimeBuffer), "Wrong write size");
191
192    snprintf(write1, 128, "%s %s", "/70",  sysTimeBuffer);
193    ret = key_write_data(0xFF, "/70", 1, 2, (unsigned char*)write1, strlen(write1));
194    fail_unless(ret == strlen(write1), "Wrong write size");
195
196    snprintf(write2, 128, "%s %s", "/key_70",  sysTimeBuffer);
197    ret = key_write_data(0xFF, "/key_70", 1, 2, (unsigned char*)write2, strlen(write2));
198    fail_unless(ret == strlen(write2), "Wrong write size");
199
200    // read data again and and verify datat has been written correctly
201    memset(buffer, 0, READ_SIZE);
202    ret = key_read_data(0xFF, "/69", 1, 2, buffer, READ_SIZE);
203    fail_unless(strncmp((char*)buffer, sysTimeBuffer, strlen(sysTimeBuffer)) == 0, "Buffer not correctly read");
204    fail_unless(ret == strlen(sysTimeBuffer), "Wrong read size");
205
206    memset(buffer, 0, READ_SIZE);
207    ret = key_read_data(0xFF, "/70", 1, 2, buffer, READ_SIZE);
208    fail_unless(strncmp((char*)buffer, write1, strlen(write1)) == 0, "Buffer not correctly read");
209    fail_unless(ret == strlen(write1), "Wrong read size");
210
211    memset(buffer, 0, READ_SIZE);
212    ret = key_read_data(0xFF, "/key_70", 1, 2, buffer, READ_SIZE);
213    fail_unless(strncmp((char*)buffer, write2, strlen(write2)) == 0, "Buffer not correctly read");
214    fail_unless(ret == strlen(write2), "Wrong read size");
215
216 }
217 END_TEST
218
219
220
221 START_TEST(test_persGetDataSize)
222 {
223    int size = 0;
224
225    size = key_get_size(0xFF, "/status/open_document", 3, 2);
226    fail_unless(size == strlen("/var/opt/user_manual_climateControl.pdf"), "Invalid size");
227
228    size = key_get_size(0x84, "/links/last link", 2, 1);
229    fail_unless(size == strlen("/last_exit/queens"), "Invalid size");
230 }
231 END_TEST
232
233
234
235 START_TEST(test_persDeleteData)
236 {
237    int rval = 0;
238    unsigned char buffer[READ_SIZE];
239
240    // delete key
241    rval = key_delete(0xFF, "/key_70", 1, 2);
242    fail_unless(rval == 0, "Failed to delete key");
243    // reading from key must fail now
244    rval = key_read_data(0xFF, "/key_70", 1, 2, buffer, READ_SIZE);
245    fail_unless(rval == EPERS_NOKEY, "Read form key key_70 works, but should fail");
246
247
248    rval = key_delete(0xFF, "/70", 1, 2);
249    fail_unless(rval == 0, "Failed to delete key");
250    rval = key_read_data(0xFF, "/70", 1, 2, buffer, READ_SIZE);
251    fail_unless(rval == EPERS_NOKEY, "Read form key 70 works, but should fail");
252 }
253 END_TEST
254
255
256
257 START_TEST(test_persDataFile)
258 {
259    int fd = 0, i = 0, idx = 0;
260    int size = 0, ret = 0;
261    int writeSize = 16*1024;
262    unsigned char buffer[READ_SIZE];
263    const char* refBuffer = "/Data/mnt-wt/lt-persistence_client_library_test/user/1/seat/1/media";
264    char* writeBuffer;
265    char* fileMap = NULL;
266    writeBuffer = malloc(writeSize);
267
268
269    // fill buffer a sequence
270    for(i = 0; i<(writeSize/8); i++)
271    {
272       writeBuffer[idx++] = 'A';
273       writeBuffer[idx++] = 'B';
274       writeBuffer[idx++] = 'C';
275       writeBuffer[idx++] = ' ';
276       writeBuffer[idx++] = 'D';
277       writeBuffer[idx++] = 'E';
278       writeBuffer[idx++] = 'F';
279       writeBuffer[idx++] = ' ';
280    }
281    memset(buffer, 0, READ_SIZE);
282
283    // create file
284    fd = open("/Data/mnt-wt/lt-persistence_client_library_test/user/1/seat/1/media/mediaDBWrite.db",
285              O_CREAT|O_RDWR|O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
286    close(fd);
287
288    // open ----------------------------------------------------------
289    fd = file_open(0xFF, "/media/mediaDB.db", 1, 1);
290    fail_unless(fd != -1, "Could not open file ==> /media/mediaDB.db");
291
292    size = file_get_size(fd);
293    fail_unless(size == 68, "Wrong file size");
294
295    size = file_read_data(fd, buffer, READ_SIZE);
296    fail_unless(strncmp((char*)buffer, refBuffer, strlen(refBuffer)) == 0, "Buffer not correctly read");
297    fail_unless(size == (strlen(refBuffer)+1), "Wrong size returned");      // strlen + 1 ==> inlcude cr/lf
298
299    ret = file_close(fd);
300    fail_unless(ret == 0, "Failed to close file");
301
302
303    // open ----------------------------------------------------------
304    fd = file_open(0xFF, "/media/mediaDBWrite.db", 1, 1);
305    fail_unless(fd != -1, "Could not open file ==> /media/mediaDBWrite.db");
306
307    size = file_write_data(fd, writeBuffer, strlen(writeBuffer));
308    fail_unless(size == strlen(writeBuffer), "Failed to write data");
309
310    ret = file_close(fd);
311    fail_unless(ret == 0, "Failed to close file");
312
313
314    // remove ----------------------------------------------------------
315    ret = file_remove(0xFF, "/media/mediaDBWrite.db", 1, 1);
316    fail_unless(ret == 0, "File can't be removed ==> /media/mediaDBWrite.db");
317
318    fd = file_open(0xFF, "/media/mediaDBWrite.db", 1, 1);
319    fail_unless(fd == -1, "File can be opend, but should not ==> /media/mediaDBWrite.db");
320
321
322    // map file ------------------------------------------------------
323    fd = file_open(0xFF, "/media/mediaDB.db", 1, 1);
324
325    size = file_get_size(fd);
326    file_map_data(fileMap, size, 0, fd);
327    fail_unless(fileMap != MAP_FAILED, "Failed to map file");
328
329    ret = file_unmap_data(fileMap, size);
330    fail_unless(ret != -1, "Failed to unmap file");
331
332    // negative test
333    size = file_get_size(1024);
334    fail_unless(ret == 0, "Got size, but should not");
335
336
337    free(writeBuffer);
338 }
339 END_TEST
340
341
342
343 START_TEST(test_persDataHandle)
344 {
345    int handle1 = 0, handle2 = 0;
346    int ret = 0;
347
348    // test file handles
349    handle1 = file_open(0xFF, "/media/mediaDB.db", 1, 1);
350    fail_unless(handle1 != -1, "Could not open file ==> /media/mediaDB.db");
351
352    ret = file_close(handle1);
353    fail_unless(handle1 != -1, "Could not open file ==> /media/mediaDB.db");
354
355    ret = file_close(1024);
356    fail_unless(ret == -1, "Could close file, but should not!!");
357
358    ret = file_close(17);
359    fail_unless(ret == -1, "Could close file, but should not!!");
360
361
362    // test key handles
363    handle2 = key_handle_open(0xFF, "/statusHandle/open_document", 3, 2);
364    fail_unless(handle2 >= 0, "Failed to open handle /statusHandle/open_document");
365
366    ret = key_handle_close(handle2);
367    fail_unless(ret != -1, "Failed to close handle!!");
368
369    ret = key_handle_close(1024);
370    fail_unless(ret == -1, "Could close, but should not!!");
371 }
372 END_TEST
373
374
375
376 static Suite * persistencyClientLib_suite()
377 {
378    Suite * s  = suite_create("Persistency client library");
379
380    TCase * tc_persGetData = tcase_create("persGetData");
381    tcase_add_test(tc_persGetData, test_persGetData);
382
383    TCase * tc_persSetData = tcase_create("persSetData");
384    tcase_add_test(tc_persSetData, test_persSetData);
385
386    TCase * tc_persGetDataSize = tcase_create("persGetDataSize");
387    tcase_add_test(tc_persGetDataSize, test_persGetDataSize);
388
389    TCase * tc_persDeleteData = tcase_create("persDeleteData");
390    tcase_add_test(tc_persDeleteData, test_persDeleteData);
391
392    TCase * tc_persGetDataHandle = tcase_create("persGetDataHandle");
393    tcase_add_test(tc_persGetDataHandle, test_persGetDataHandle);
394
395    TCase * tc_persDataHandle = tcase_create("persDataHandle");
396    tcase_add_test(tc_persDataHandle, test_persDataHandle);
397
398    TCase * tc_persDataFile = tcase_create("persDataFile");
399    tcase_add_test(tc_persDataFile, test_persDataFile);
400
401
402    suite_add_tcase(s, tc_persGetData);
403    suite_add_tcase(s, tc_persSetData);
404    suite_add_tcase(s, tc_persGetDataSize);
405    suite_add_tcase(s, tc_persDeleteData);
406    suite_add_tcase(s, tc_persGetDataHandle);
407    suite_add_tcase(s, tc_persDataHandle);
408    suite_add_tcase(s, tc_persDataFile);
409
410    return s;
411 }
412
413
414
415
416 int main(int argc, char *argv[])
417 {
418    int nr_failed;
419
420    Suite * s = persistencyClientLib_suite();
421    SRunner * sr = srunner_create(s);
422    srunner_run_all(sr, CK_NORMAL);
423    nr_failed = srunner_ntests_failed(sr);
424    srunner_free(sr);
425
426    return (0==nr_failed)?EXIT_SUCCESS:EXIT_FAILURE;
427
428 }
429