Git init
[pkgs/e/elektra.git] / src / bindings / cpp / tests / test_key.cpp
1 #include <tests.h>
2
3 void test_keynew()
4 {
5         cout << "testing keynew" << endl;
6
7         char array[] = "here is some data stored";
8         char * getBack;
9
10         Key key0;
11         succeed_if(!key0.needSync(), "key1 need sync");
12         succeed_if(!key0.needRemove(), "key1 need remove");
13         succeed_if( key0.getName() == "", "key0 has wrong name");
14
15         // Empty key
16         Key key1 ("", KEY_END);
17         succeed_if(!key1.needSync(), "key1 need sync");
18         succeed_if(!key1.needRemove(), "key1 need remove");
19         succeed_if( key1.getName() == "", "key0 has wrong name");
20
21         // Key with name
22         Key key2 ("system/sw/test", KEY_END);
23         succeed_if( key2.needSync(), "key2 does not need sync");
24         succeed_if(!key2.needRemove(), "key2 need remove");
25         succeed_if (key2.getBaseName() == "test", "wrong base name");
26         succeed_if( key2.getName() == "system/sw/test", "key2 has wrong name");
27         key2.copy(key0);
28         succeed_if( key2.getName() == "", "key0 has wrong name");
29         succeed_if (key2.getBaseName() == "", "wrong base name");
30
31         // Key with name
32         Key key3 ("system/sw/test", KEY_REMOVE, KEY_END);
33         succeed_if(key3.needRemove(), "KEY_REMOVE not set");
34         succeed_if(key3.getName() == "system/sw/test", "key3 has wrong name");
35         succeed_if(key3.getBaseName() == "test", "wrong base name");
36         key3 = "system/other/name";
37         succeed_if(key3.getName() == "system/other/name", "key3 has wrong name");
38         succeed_if(key3.getBaseName() == "name", "wrong base name");
39         key3 += "base";
40         succeed_if(key3.getName() == "system/other/name/base", "key3 has wrong name");
41         succeed_if(key3.getBaseName() == "base", "wrong base name");
42         key3 -= "name";
43         succeed_if(key3.getName() == "system/other/name/name", "key3 has wrong name");
44         succeed_if(key3.getBaseName() == "name", "wrong base name");
45
46         // Key with name + value (default type must be KEY_TYPE_STRING)
47         Key key4 ("system/sw/test",
48                         KEY_VALUE, "test",
49                         KEY_END);
50         succeed_if(key4.getName() == "system/sw/test", "key4 has wrong name");
51         succeed_if(key4.get<string>() == "test", "key4 has wrong name");
52         // key4.generate(stdout, 0); cout << endl;
53
54         // Key with name + UID/GID
55         Key key5 ("system/sw/test",
56                         KEY_UID, 123,
57                         KEY_GID, 456,
58                         KEY_END);
59         succeed_if(key5.getUID() == 123, "key5 UID no set correctly");
60         succeed_if(key5.getGID() == 456, "key5 GID not set correctly");
61         succeed_if(key5.getName() == "system/sw/test", "key5 has wrong name");
62         // key5.output(stdout, 0);
63
64         // Key with name + MODE
65         Key key6 ("system/sw/test",
66                         KEY_MODE, 0642,
67                         KEY_END);
68         succeed_if(key6.getMode() == 0642, "key6 mode no set correctly");
69         succeed_if(key6.getName() == "system/sw/test", "key6 has wrong name");
70
71         // Key with name + owner
72         Key key7 ("system/sw/test",
73                         KEY_OWNER, "yl",
74                         KEY_END);
75         succeed_if( key7.getOwner() ==  "yl", "key7 owner not set correctly");
76         succeed_if (!key7.isInactive(), "key should not be inactive");
77
78         Key key8 ("system/valid/there",
79                         KEY_TYPE, KEY_TYPE_BINARY,
80                         KEY_SIZE, sizeof(array),
81                         KEY_VALUE, array,
82                         KEY_END);
83         succeed_if(key8.getName() == "system/valid/there", "key8 has wrong name");
84         succeed_if(key8.isBinary (), "Could not set type to binary");
85         succeed_if(key8.getValueSize() == sizeof(array), "Value size not correct");
86         getBack = new char [key8.getValueSize()];
87         key8.getBinary(getBack, key8.getValueSize());
88         succeed_if(memcmp(getBack, array, sizeof(array)) == 0, "could not get correct value with keyGetBinary");
89         delete [] getBack;
90         succeed_if (key8.getBaseName() == "there", "wrong base name");
91
92         Key key9("system/valid/.inactive", KEY_COMMENT, "inactive key", KEY_END);
93         succeed_if (key9.isInactive(), "key should be inactive");
94         succeed_if (key9.getComment() == "inactive key", "comment failed");
95         succeed_if (key9.getBaseName() == ".inactive", "wrong base name");
96 }
97
98 void test_constructor()
99 {
100         cout << "testing constructor" << endl;
101
102         ckdb::Key *ck = ckdb::keyNew(0);
103         Key k = ck; // constructor with (ckdb::Key)
104
105         cout << "ck:   " << (void*)ck << endl;
106         cout << "k:    " << (void*)&k << endl;
107         cout << "k.ck: " << (void*)k.getKey() << endl;
108
109         k.set<int>(30);
110         succeed_if (k.get<int> () == 30, "could not get same int");
111 }
112
113 void test_setkey()
114 {
115         cout << "testing setkey" << endl;
116
117         ckdb::Key *ck;
118         Key k;
119
120         ck = ckdb::keyNew(0);
121         k = ck; // operator= alias for setKey()
122
123         cout << "ck:   " << (void*)ck << endl;
124         cout << "k:    " << (void*)&k << endl;
125         cout << "k.ck: " << (void*)k.getKey() << endl;
126
127         k.set<int>(30);
128         succeed_if (k.get<int> () == 30, "could not get same int");
129 }
130
131 void test_cast()
132 {
133         cout << "testing cast" << endl;
134         ckdb::Key *ck;
135         Key *k;
136
137         ck = ckdb::keyNew(0);
138         k = (Key*) &ck; // no copy, just a cast
139
140         cout << "&ck:  " << (void*)&ck << endl;
141         cout << "k:    " << (void*)&k << endl;
142         cout << "ck:   " << (void*)ck << endl;
143         cout << "k.ck: " << (void*)k->getKey() << endl;
144
145         k->set<int>(30);
146         succeed_if (k->get<int> () == 30, "could not get same int");
147
148         ckdb::keyDel (ck);
149 }
150
151 void test_value ()
152 {
153         cout << "testing value" << endl;
154         Key test;
155
156         test.setString ("23.3");
157         succeed_if (test.get<double> () == 23.3, "could not get same double");
158         succeed_if (test.getValueSize () == 5, "value size not correct");
159
160         test.setString ("401");
161         succeed_if (test.get<int> () == 401, "could not get same int");
162         succeed_if (test.getValueSize () == 4, "value size not correct");
163
164         test.setString ("mystr");
165         succeed_if (test.get<string> () == "mystr", "could not get same string");
166         succeed_if (test.getValueSize () == 6, "value size not correct");
167
168         test.setString ("myoth");
169         succeed_if (test.get<string> () == "myoth", "could not get same string");
170         succeed_if (test.getValueSize () == 6, "value size not correct");
171
172         test.set<double> (23.3);
173         succeed_if (test.getString() == "23.3", "could not get same double");
174         succeed_if (test.getValueSize () == 5, "value size not correct");
175
176         test.set<int> (401);
177         succeed_if (test.getString() == "401", "could not get same int");
178         succeed_if (test.getValueSize () == 4, "value size not correct");
179
180         test.set<string> ("mystr");
181         succeed_if (test.getString() == "mystr", "could not get same string");
182         succeed_if (test.getValueSize () == 6, "value size not correct");
183
184         test.set<string> ("myoth");
185         succeed_if (test.getString () == "myoth", "could not get same string");
186         succeed_if (test.getValueSize () == 6, "value size not correct");
187
188         test.setComment ("mycomment");
189         succeed_if (test.getComment () == "mycomment", "could not get same comment");
190         succeed_if (test.getCommentSize () == 10, "comment size not correct");
191 }
192
193 void test_exceptions ()
194 {
195         cout << "testing exceptions" << endl;
196         Key test;
197
198         try {
199                 test.setName("no");
200         } catch (kdb::KeyInvalidName)
201         {
202                 succeed_if (test.getName() == "", "not set to noname");
203         }
204
205         test.setName ("user/name");
206         succeed_if (test.getName() == "user/name", "could not get same name");
207
208         try {
209                 test.setName("no");
210         } catch (kdb::KeyInvalidName)
211         {
212                 succeed_if (test.getName() == "", "not set to noname");
213         }
214         
215 }
216
217 void test_name()
218 {
219         cout << "testing name" << endl;
220
221         Key test;
222         test.setName("user:markus/test");
223         succeed_if (std::string(test.name()) == "user/test", "Wrong name");
224         succeed_if (test.getName() == "user/test", "Wrong name");
225         succeed_if (test.getFullName() == "user:markus/test", "Wrong full name");
226         succeed_if (std::string(test.owner()) == "markus", "Wrong owner");
227         succeed_if (test.getOwner() == "markus", "Wrong owner");
228         succeed_if (test.getNameSize() == 10, "wrong name size");
229         succeed_if (test.getFullNameSize() == 17, "wrong full name size");
230         succeed_if (!test.isSystem(), "key is system");
231         succeed_if ( test.isUser(), "key is not user");
232
233         test.setOwner("gerald");
234         succeed_if (std::string(test.name()) == "user/test", "Wrong name");
235         succeed_if (test.getName() == "user/test", "Wrong name");
236         succeed_if (test.getFullName() == "user:gerald/test", "Wrong full name");
237         succeed_if (test.getNameSize() == 10, "wrong name size");
238         succeed_if (test.getFullNameSize() == 17, "wrong full name size");
239         succeed_if (!test.isSystem(), "key is system");
240         succeed_if ( test.isUser(), "key is not user");
241
242         test.setName("system/test");
243         test.setOwner("markus"); // has no semantics...
244         succeed_if (std::string(test.name()) == "system/test", "Wrong name");
245         succeed_if (test.getName() == "system/test", "Wrong name");
246         succeed_if (test.getFullName() == "system/test", "Wrong full name");
247         succeed_if (std::string(test.owner()) == "markus", "Wrong owner");
248         succeed_if (test.getOwner() == "markus", "Wrong owner");
249         succeed_if (test.getNameSize() == 12, "wrong name size");
250         succeed_if (test.getFullNameSize() == 12, "wrong full name size");
251         succeed_if ( test.isSystem(), "key is system");
252         succeed_if (!test.isUser(), "key is not user");
253
254         test.setName("user/dir/test");
255         test.setBaseName ("mykey");
256         succeed_if (test.getName() == "user/dir/mykey", "Basename did not work");
257         test.setName (test.getName() + "/onedeeper"); // add basename is trivial
258         succeed_if (test.getName() == "user/dir/mykey/onedeeper", "Basename did not work");
259         succeed_if (test.getName().find('/') == 4, "user length"); // keyGetRootNameSize trivial
260         succeed_if (test.isBelow (Key("user/dir/mykey/onedeeper/below", KEY_END)), "key is below");
261         succeed_if (!test.isBelow (Key("user/dir/mykey/twodeeper/below", KEY_END)), "key is below");
262         succeed_if (test.isDirectBelow (Key("user/dir/mykey/onedeeper/below", KEY_END)), "key is direct below");
263         succeed_if (!test.isDirectBelow (Key("user/dir/mykey/onedeeper/twodeeper/below", KEY_END)), "key is direct below");
264         succeed_if (!test.isDirectBelow (Key("user/dir/mykey/twodeeper/below", KEY_END)), "key is direct below");
265 }
266
267 void test_meta()
268 {
269         cout << "testing metainfo" << endl;
270         Key test;
271
272         test.setUID(50);
273         succeed_if (test.getUID() == 50, "could not set UID");
274
275         test.setGID(50);
276         succeed_if (test.getGID() == 50, "could not set GID");
277
278         succeed_if (test.getMode() == 0664, "not correct default mode");
279         test.setDir ();
280         succeed_if (test.isDir(), "is not dir");
281         succeed_if (test.getMode() == 0775, "not correct default mode for dir");
282
283         test.setMTime (200);
284         succeed_if (test.getMTime() == 200, "could not set MTime");
285
286         test.setATime (200);
287         succeed_if (test.getATime() == 200, "could not set ATime");
288
289         test.setCTime (200);
290         succeed_if (test.getCTime() == 200, "could not set CTime");
291 }
292
293 void f(Key k)
294 {
295         Key h ("user/infunction", KEY_END);
296 }
297
298 void test_ref()
299 {
300         cout << "testing ref" << endl;
301
302         Key zgr1 ("user/zgr1", KEY_END);
303         {
304                 Key zgr2 ("user/zgr2", KEY_END);
305                 Key zgr3 ("user/zgr3", KEY_END);
306                 Key zgr4 ("user/zgr4", KEY_END);
307                 Key zgr5 ("user/zgr5", KEY_END);
308                 zgr2=zgr1;
309                 zgr3=zgr1;
310                 zgr4=zgr1;
311         }
312
313         f(zgr1);
314         f(Key ("user/passed", KEY_END));
315
316         Key test;
317         test.setName("user:markus/test");
318
319         Key ref1;
320         ref1 = test; // operator =
321
322         succeed_if (test.getName() == "user/test", "wrong name");
323         succeed_if (ref1.getName() == "user/test", "ref key wrong name");
324
325         Key ref2 = test; // copy constructor
326
327         succeed_if (test.getName() == "user/test", "wrong name");
328         succeed_if (ref2.getName() == "user/test", "ref key wrong name");
329
330         const Key consttest ("user/test", KEY_END);
331         Key ref3 = consttest; // const copy constructor
332
333         succeed_if (consttest.getName() == "user/test", "wrong name");
334         succeed_if (ref3.getName() == "user/test", "ref key wrong name");
335 }
336
337 void test_dup()
338 {
339         cout << "testing dup" << endl;
340
341         Key test;
342         test.setName("user:markus/test");
343
344         Key dup0 = test.dup(); // directly call of dup()
345
346         succeed_if (test.getName() == "user/test", "wrong name");
347         succeed_if (dup0.getName() == "user/test", "dup key wrong name");
348 }
349
350
351 int main()
352 {
353         cout << "KEY CLASS TESTS" << endl;
354         cout << "===============" << endl << endl;
355
356         /*
357         test_constructor();
358         test_setkey();
359         test_cast();
360         */
361
362         test_keynew();
363         test_name();
364         test_value();
365         test_exceptions();
366         test_meta();
367         test_dup();
368         test_ref();
369
370         cout << endl;
371         cout << "test_key RESULTS: " << nbTest << " test(s) done. " << nbError << " error(s)." << endl;
372         return nbError;
373 }