Restructured signon database and added unit tests
[accounts-sso:vitalyrepins-signon.git] / tests / signond-tests / databasetest.cpp
1 /*
2  * This file is part of signon
3  *
4  * Copyright (C) 2009-2010 Nokia Corporation.
5  *
6  * Contact: Alberto Mardegan <alberto.mardegan@nokia.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * version 2.1 as published by the Free Software Foundation.
11  *
12  * This library is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  */
22 #include "databasetest.h"
23 #include <signond/signoncommon.h>
24 #include <QDBusMessage>
25
26 #include "credentialsdb.h"
27 #include "signonidentityinfo.cpp"
28
29 const QString dbFile = QLatin1String("/tmp/signon_test.db");
30
31 void TestDatabase::initTestCase()
32 {
33     QFile::remove(dbFile);
34     m_db = new CredentialsDB(dbFile);
35     QVERIFY(m_db != 0);
36 }
37
38 void TestDatabase::cleanupTestCase()
39 {
40     delete m_db;
41     m_db = NULL;
42     //remove database file
43     //QFile::remove(dbFile);
44 }
45
46 void TestDatabase::init()
47 {
48 }
49
50 void TestDatabase::cleanup()
51 {
52 }
53
54 void TestDatabase::sqlDBConfigurationTest()
55 {
56     QMap<QString, QString> conf = m_db->sqlDBConfiguration();
57     qDebug() << conf;
58     QVERIFY(conf.value(QLatin1String("Database Name")) == QLatin1String("/tmp/signon_test.db"));
59 }
60
61 void TestDatabase::createTableStructureTest()
62 {
63     QVERIFY(!m_db->hasTableStructure());
64     m_db->createTableStructure();
65     QMap<QString, QString> conf = m_db->sqlDBConfiguration();
66     QVERIFY(!conf.value(QLatin1String("Tables")).isEmpty());
67     QVERIFY(m_db->hasTableStructure());
68 }
69
70 void TestDatabase::insertMethodsTest()
71 {
72     QMap<QString, QStringList> methods;
73     m_db->insertMethods(10, methods);
74     QStringList methodsList = m_db->methods(10);
75     QVERIFY(methodsList.count() == 0);
76     QStringList mechs = QStringList() << QLatin1String("M1")<< QLatin1String("M2");
77     methods.insert(QLatin1String("Test"), mechs);
78     methods.insert(QLatin1String("Test2"), mechs);
79     m_db->insertMethods(11, methods);
80     methodsList = m_db->methods(11);
81     QVERIFY(methodsList.count() == 2);
82     QVERIFY(methodsList.contains(QLatin1String("Test")));
83 }
84
85 void TestDatabase::removeMethodsTest()
86 {
87     QStringList methodsList = m_db->methods(10);
88     QVERIFY(methodsList.count() == 0);
89     m_db->removeMethods(10);
90     methodsList = m_db->methods(10);
91     QVERIFY(methodsList.count() == 0);
92
93     methodsList = m_db->methods(11);
94     QVERIFY(methodsList.count() == 2);
95     m_db->removeMethods(11);
96     methodsList = m_db->methods(11);
97     QVERIFY(methodsList.count() == 0);
98 }
99
100 void TestDatabase::insertListTest()
101 {
102     QStringList list;
103     m_db->startTransaction();
104     m_db->insertList(list,QString::fromLatin1("INSERT INTO REALMS(identity_id, realm) "
105                                    ), 67);
106     m_db->commit();
107     QStringList listRes = m_db->queryList(QString::fromLatin1(
108             "SELECT realm FROM REALMS WHERE identity_id = 67"));
109     QVERIFY(list == listRes);
110     list.append(QLatin1String("Test"));
111     list.append(QLatin1String("Test2"));
112
113     m_db->startTransaction();
114     m_db->insertList(list,QString::fromLatin1("INSERT INTO REALMS(identity_id, realm) "
115                                    ), 68);
116     m_db->commit();
117     listRes = m_db->queryList(QString::fromLatin1(
118             "SELECT realm FROM REALMS WHERE identity_id = 68"));
119     QVERIFY(list == listRes);
120 }
121
122 void TestDatabase::removeListTest()
123 {
124     QStringList listRes = m_db->queryList(QString::fromLatin1(
125             "SELECT realm FROM REALMS WHERE identity_id = 68"));
126     QVERIFY(listRes.count() == 2);
127     m_db->removeList(QString::fromLatin1("DELETE FROM REALMS WHERE identity_id = %1"  ).arg(68));
128     listRes = m_db->queryList(QString::fromLatin1(
129             "SELECT realm FROM REALMS WHERE identity_id = 68"));
130     QVERIFY(listRes.count() == 0);
131 }
132
133 void TestDatabase::queryListTest()
134 {
135     QString queryStr;
136     queryStr = QString::fromLatin1(
137             "INSERT INTO REALMS (identity_id, realm) "
138             "VALUES('%1', '%2')")
139             .arg(80).arg(QLatin1String("a"));
140     QSqlQuery insertQuery = m_db->exec(queryStr);
141     queryStr = QString::fromLatin1(
142             "INSERT INTO REALMS (identity_id, realm) "
143             "VALUES('%1', '%2')")
144             .arg(80).arg(QLatin1String("b"));
145     insertQuery = m_db->exec(queryStr);
146     QStringList list = m_db->queryList(QString::fromLatin1(
147             "SELECT realm FROM REALMS WHERE identity_id = 80"));
148     QVERIFY(list.contains(QLatin1String("a")));
149     QVERIFY(list.contains(QLatin1String("b")));
150     QVERIFY(list.count() == 2);
151 }
152
153 void TestDatabase::insertCredentialsTest()
154 {
155     SignonIdentityInfo info;
156     SignonIdentityInfo retInfo;
157     quint32 id;
158
159     //insert empty
160     id = m_db->insertCredentials(info, false);
161     retInfo = m_db->credentials(id, false);
162     QVERIFY(id != info.m_id);
163     info.m_id = id;
164     QVERIFY(retInfo == info);
165
166     //insert complete
167     info.m_caption = QLatin1String("Caption");
168     info.m_userName = QLatin1String("User");
169     info.m_password = QLatin1String("Pass");
170     info.m_realms = QStringList() << QLatin1String("Realm1.com") << QLatin1String("Realm2.com") << QLatin1String("Realm3.com") ;
171     QMap<MethodName,MechanismsList> methods;
172     QStringList mechs = QStringList() << QString::fromLatin1("Mech1") << QString::fromLatin1("Mech2") ;
173     methods.insert(QLatin1String("Method1"), mechs);
174     methods.insert(QLatin1String("Method2"), mechs);
175     methods.insert(QLatin1String("Method3"), QStringList());
176     info.m_methods = methods;
177     info.m_accessControlList = QStringList() << QLatin1String("AID::12345678") << QLatin1String("AID::87654321") << QLatin1String("test::property") ;
178     info.m_type = 3;
179
180     id = m_db->insertCredentials(info, true);
181     retInfo = m_db->credentials(id, false);
182     QVERIFY(id != info.m_id);
183     info.m_id = id;
184     QVERIFY(info.m_password != retInfo.m_password);
185     retInfo.m_password = info.m_password;
186
187     QVERIFY(retInfo == info);
188
189     //with password
190     id = m_db->insertCredentials(info, true);
191     retInfo = m_db->credentials(id, true);
192     QVERIFY(id != info.m_id);
193     info.m_id = id;
194     QVERIFY(retInfo == info);
195 }
196
197 void TestDatabase::updateCredentialsTest()
198 {
199     SignonIdentityInfo info;
200     SignonIdentityInfo updateInfo;
201     SignonIdentityInfo retInfo;
202     quint32 id;
203
204     //insert complete
205     info.m_caption = QLatin1String("Caption");
206     info.m_userName = QLatin1String("User");
207     info.m_password = QLatin1String("Pass");
208     info.m_realms = QStringList() << QLatin1String("Realm1.com") << QLatin1String("Realm2.com") << QLatin1String("Realm3.com") ;
209     QMap<MethodName,MechanismsList> methods;
210     QStringList mechs = QStringList() << QString::fromLatin1("Mech1") << QString::fromLatin1("Mech2") ;
211     methods.insert(QLatin1String("Method1"), mechs);
212     methods.insert(QLatin1String("Method2"), mechs);
213     methods.insert(QLatin1String("Method3"), QStringList());
214     info.m_methods = methods;
215     info.m_accessControlList = QStringList() << QLatin1String("AID::12345678") << QLatin1String("AID::87654321") << QLatin1String("test::property") ;
216
217     id = m_db->insertCredentials(info, true);
218     retInfo = m_db->credentials(id, true);
219     QVERIFY(id != info.m_id);
220     info.m_id = id;
221     QVERIFY(retInfo == info);
222
223     //update complete
224     updateInfo.m_caption = QLatin1String("Updated Caption");
225     updateInfo.m_userName = QLatin1String("UpUser");
226     updateInfo.m_password = QLatin1String("UpdatedPass");
227     updateInfo.m_realms = QStringList() << QLatin1String("URealm1.com") << QLatin1String("URealm2.com") << QLatin1String("Realm3.com") ;
228     QMap<MethodName,MechanismsList> umethods;
229     QStringList umechs = QStringList() << QString::fromLatin1("UMech1") << QString::fromLatin1("Mech2") ;
230     umethods.insert(QLatin1String("Method1"), umechs);
231     umethods.insert(QLatin1String("UMethod2"), umechs);
232     umethods.insert(QLatin1String("Method3"), QStringList());
233     updateInfo.m_methods = umethods;
234     updateInfo.m_accessControlList = QStringList() << QLatin1String("AID::12345678") << QLatin1String("AID::87654321") << QLatin1String("test::property") ;
235     updateInfo.m_id = id;
236     updateInfo.m_type = 2;
237
238     QVERIFY(m_db->updateCredentials(updateInfo, true));
239
240     retInfo = m_db->credentials(id, true);
241
242 QVERIFY (updateInfo.m_id == retInfo.m_id);
243 QVERIFY (updateInfo.m_userName == retInfo.m_userName);
244 QVERIFY (updateInfo.m_password == retInfo.m_password);
245 QVERIFY (updateInfo.m_caption == retInfo.m_caption);
246 QVERIFY (updateInfo.m_realms == retInfo.m_realms);
247 QVERIFY (updateInfo.m_accessControlList == retInfo.m_accessControlList);
248 QVERIFY (updateInfo.m_type == retInfo.m_type);
249 QVERIFY (updateInfo.m_methods == retInfo.m_methods);
250
251     QVERIFY(!(retInfo == info));
252     QVERIFY((retInfo ==updateInfo));
253
254 }
255
256 void TestDatabase::removeCredentialsTest()
257 {
258     SignonIdentityInfo info;
259     SignonIdentityInfo retInfo;
260     quint32 id;
261
262     //insert complete
263     info.m_caption = QLatin1String("Caption");
264     info.m_userName = QLatin1String("User");
265     info.m_password = QLatin1String("Pass");
266     info.m_realms = QStringList() << QLatin1String("Realm1.com") << QLatin1String("Realm2.com") << QLatin1String("Realm3.com") ;
267     QMap<MethodName,MechanismsList> methods;
268     QStringList mechs = QStringList() << QString::fromLatin1("Mech1") << QString::fromLatin1("Mech2") ;
269     methods.insert(QLatin1String("Method1"), mechs);
270     methods.insert(QLatin1String("Method2"), mechs);
271     methods.insert(QLatin1String("Method3"), QStringList());
272     info.m_methods = methods;
273     info.m_accessControlList = QStringList() << QLatin1String("AID::12345678") << QLatin1String("AID::87654321") << QLatin1String("test::property") ;
274
275     id = m_db->insertCredentials(info, true);
276     retInfo = m_db->credentials(id, true);
277     QVERIFY(id != info.m_id);
278     info.m_id = id;
279     QVERIFY(retInfo == info);
280
281     QVERIFY(m_db->removeCredentials(id));
282
283     retInfo = m_db->credentials(id, true);
284     QVERIFY(!(retInfo == info));
285     QVERIFY(retInfo.m_id == 0);
286 }
287
288 void TestDatabase::checkPasswordTest()
289 {
290     SignonIdentityInfo info;
291     quint32 id;
292
293     //insert complete
294     info.m_caption = QLatin1String("Caption");
295     info.m_userName = QLatin1String("User");
296     info.m_password = QLatin1String("Pass");
297     info.m_realms = QStringList() << QLatin1String("Realm1.com") << QLatin1String("Realm2.com") << QLatin1String("Realm3.com") ;
298     QMap<MethodName,MechanismsList> methods;
299     QStringList mechs = QStringList() << QString::fromLatin1("Mech1") << QString::fromLatin1("Mech2") ;
300     methods.insert(QLatin1String("Method1"), mechs);
301     methods.insert(QLatin1String("Method2"), mechs);
302     methods.insert(QLatin1String("Method3"), QStringList());
303     info.m_methods = methods;
304     info.m_accessControlList = QStringList() << QLatin1String("AID::12345678") << QLatin1String("AID::87654321") << QLatin1String("test::property") ;
305
306     id = m_db->insertCredentials(info, true);
307
308     QVERIFY(m_db->checkPassword(id, info.m_userName, info.m_password));
309     QVERIFY(!m_db->checkPassword(id, info.m_userName, QLatin1String("PassWd")));
310     QVERIFY(!m_db->checkPassword(id, QLatin1String("User2"), info.m_password));
311 }
312
313 void TestDatabase::credentialsTest()
314 {
315 }
316
317 void TestDatabase::methodsTest()
318 {
319     SignonIdentityInfo info;
320     quint32 id;
321
322     //insert complete
323     info.m_caption = QLatin1String("Caption");
324     info.m_userName = QLatin1String("User");
325     info.m_password = QLatin1String("Pass");
326     info.m_realms = QStringList() << QLatin1String("Realm1.com") << QLatin1String("Realm2.com") << QLatin1String("Realm3.com") ;
327     QMap<MethodName,MechanismsList> methods;
328     QStringList mechs = QStringList() << QString::fromLatin1("Mech1") << QString::fromLatin1("Mech2") ;
329     methods.insert(QLatin1String("Method1"), mechs);
330     methods.insert(QLatin1String("Method2"), mechs);
331     methods.insert(QLatin1String("Method3"), QStringList());
332     info.m_methods = methods;
333     info.m_accessControlList = QStringList() << QLatin1String("AID::12345678") << QLatin1String("AID::87654321") << QLatin1String("test::property") ;
334
335     id = m_db->insertCredentials(info, true);
336
337     QStringList meths = m_db->methods(id);
338     QVERIFY(meths.contains(QLatin1String("Method1")));
339     QVERIFY(meths.contains(QLatin1String("Method2")));
340     QVERIFY(meths.contains(QLatin1String("Method3")));
341     QVERIFY(meths.count() == 3);
342 }
343
344 void TestDatabase::clearTest()
345 {
346     m_db->clear();
347     QSqlQuery query = m_db->exec(QLatin1String("SELECT * FROM credentials"));
348     QVERIFY(!query.next());
349 }
350
351 void TestDatabase::accessControlListTest()
352 {
353     SignonIdentityInfo info;
354     quint32 id;
355
356     //insert complete
357     info.m_caption = QLatin1String("Caption");
358     info.m_userName = QLatin1String("User");
359     info.m_password = QLatin1String("Pass");
360     info.m_realms = QStringList() << QLatin1String("Realm1.com") << QLatin1String("Realm2.com") << QLatin1String("Realm3.com") ;
361     QMap<MethodName,MechanismsList> methods;
362     QStringList mechs = QStringList() << QString::fromLatin1("Mech1") << QString::fromLatin1("Mech2") ;
363     methods.insert(QLatin1String("Method1"), mechs);
364     methods.insert(QLatin1String("Method2"), mechs);
365     methods.insert(QLatin1String("Method3"), QStringList());
366     info.m_methods = methods;
367     info.m_accessControlList = QStringList() << QLatin1String("AID::12345678") << QLatin1String("AID::87654321") << QLatin1String("test::property") ;
368
369     id = m_db->insertCredentials(info, true);
370
371     QStringList acl = m_db->accessControlList(id);
372     qDebug() << acl;
373     QVERIFY(acl == info.m_accessControlList);
374 }
375
376 void TestDatabase::credentialsOwnerSecurityTokenTest()
377 {
378     SignonIdentityInfo info;
379     quint32 id;
380
381     //insert complete
382     info.m_caption = QLatin1String("Caption");
383     info.m_userName = QLatin1String("User");
384     info.m_password = QLatin1String("Pass");
385     info.m_realms = QStringList() << QLatin1String("Realm1.com") << QLatin1String("Realm2.com") << QLatin1String("Realm3.com") ;
386     QMap<MethodName,MechanismsList> methods;
387     QStringList mechs = QStringList() << QString::fromLatin1("Mech1") << QString::fromLatin1("Mech2") ;
388     methods.insert(QLatin1String("Method1"), mechs);
389     methods.insert(QLatin1String("Method2"), mechs);
390     methods.insert(QLatin1String("Method3"), QStringList());
391     info.m_methods = methods;
392     info.m_accessControlList = QStringList() << QLatin1String("AID::12345678") << QLatin1String("AID::87654321") << QLatin1String("test::property") ;
393
394     id = m_db->insertCredentials(info, true);
395
396     QString token = m_db->credentialsOwnerSecurityToken(id);
397     qDebug() << token;
398     QVERIFY(token == QLatin1String("AID::12345678"));
399 }
400
401 void TestDatabase::runAllTests()
402 {
403     initTestCase();
404
405     init();
406     sqlDBConfigurationTest();
407     cleanup();
408
409     init();
410     createTableStructureTest();
411     cleanup();
412
413     init();
414     insertMethodsTest();
415     cleanup();
416
417     init();
418     removeMethodsTest();
419     cleanup();
420
421     init();
422     insertListTest();
423     cleanup();
424
425     init();
426     removeListTest();
427     cleanup();
428
429     init();
430     queryListTest();
431     cleanup();
432
433     init();
434     insertCredentialsTest();
435     cleanup();
436
437     init();
438     updateCredentialsTest();
439     cleanup();
440
441     init();
442     removeCredentialsTest();
443     cleanup();
444
445     init();
446     checkPasswordTest();
447     cleanup();
448
449     init();
450     credentialsTest();
451     cleanup();
452
453     init();
454     methodsTest();
455     cleanup();
456
457     init();
458     clearTest();
459     cleanup();
460
461     init();
462     accessControlListTest();
463     cleanup();
464
465     init();
466     credentialsOwnerSecurityTokenTest();
467     cleanup();
468
469     cleanupTestCase();
470 }
471
472 #if !defined(SSO_CI_TESTMANAGEMENT)
473     QTEST_MAIN(TestDatabase)
474 #endif