qtmobility/plugins/contacts/qtcontacts-tracker/tests/ut_qtcontacts_add_async/ut_qtcontacts_add_async.cpp
changeset 4 90517678cc4f
child 11 06b8e2af4411
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qtmobility/plugins/contacts/qtcontacts-tracker/tests/ut_qtcontacts_add_async/ut_qtcontacts_add_async.cpp	Mon May 03 13:18:40 2010 +0300
@@ -0,0 +1,262 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "ut_qtcontacts_add_async.h"
+
+#include <QContactManager>
+#include <QContactName>
+#include <QContactDetailFilter>
+#include <QContactPhoneNumber>
+#include <QtTest/QtTest>
+#include <QDebug>
+
+// Note that we try to avoid using any names that might already be in the database:
+const char* TESTNAME_FIRST = "ut_qtcontacts_add_firstname";
+const char* TESTNAME_LAST = "ut_qtcontacts_add_firstlast";
+
+ut_qtcontacts_add::ut_qtcontacts_add()
+: getExistingContactFinishedCallback(0),
+  waiting(false)
+{
+}
+
+ut_qtcontacts_add::~ut_qtcontacts_add()
+{
+
+}
+
+void ut_qtcontacts_add::initTestCase()
+{
+}
+
+void ut_qtcontacts_add::cleanupTestCase()
+{
+}
+
+void ut_qtcontacts_add::init()
+{
+}
+
+void ut_qtcontacts_add::cleanup()
+{
+  waiting = false;
+}
+
+bool ut_qtcontacts_add::waitForStop()
+{
+    waiting = true;
+
+    const int max_secs = 100000;
+
+    // wait for signal
+    int i = 0;
+    while(waiting && i++ < max_secs) {
+        // Allow the mainloop to run:
+        QTest::qWait(10);
+    }
+
+    return !waiting;
+}
+
+QContactManager* ut_qtcontacts_add::getContactManager()
+{
+    static QContactManager manager("tracker");
+    return &manager;
+}
+
+void ut_qtcontacts_add::onContactFetchRequestProgress()
+{
+    //qDebug() << "onContactFetchRequestProgress";
+    if (!contactFetchRequest.isFinished())
+        return;
+
+    //Store the contact so the callback can use it.
+    if(!(contactFetchRequest.contacts().isEmpty())) {
+        contact = contactFetchRequest.contacts()[0];
+        QVERIFY(contact.localId() != 0);
+        contactFetchRequest.cancel(); //Stop any more slot calls.
+    }
+
+    //qDebug() << "debug: fetched localId=" << contact.localId();
+
+    //Avoid more slot calls, though this is unlikely because it has finished.
+    contactFetchRequest.cancel();
+
+    //Call the callback method that was specified to getExistingContact():
+    if(getExistingContactFinishedCallback) {
+        FinishedCallbackFunc func = getExistingContactFinishedCallback;
+        getExistingContactFinishedCallback = 0;
+        (this->*func)();
+    }
+}
+
+
+void ut_qtcontacts_add::getExistingContact(FinishedCallbackFunc finishedCallback)
+{
+    QContactManager* manager = getContactManager();
+    Q_ASSERT(manager);
+
+    // Stop pending fetch requests
+    if (contactFetchRequest.isActive())
+        contactFetchRequest.cancel();
+
+    // Initialize the result.
+    contact = QContact();
+
+    //TODO: How can we AND on both the first and last name?
+    getExistingContactFinishedCallback = finishedCallback; //Call this when the contact has been retrieved.
+    connect(&contactFetchRequest, SIGNAL(resultsAvailable()),
+        SLOT(onContactFetchRequestProgress()));
+
+    QContactDetailFilter nameFilter;
+    nameFilter.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldFirst);
+    nameFilter.setValue(QLatin1String(TESTNAME_FIRST));
+    nameFilter.setMatchFlags(QContactFilter::MatchExactly);
+    contactFetchRequest.setManager(manager);
+    contactFetchRequest.setFilter(nameFilter);
+
+    //qDebug() << "debug: start request";
+    contactFetchRequest.start();
+}
+
+//This is our actual test function:
+void ut_qtcontacts_add::ut_testAddContact()
+{
+    //qDebug() << "debug: ut_testAddContact";
+    //Make sure that the contact is not already in the database.
+    getExistingContact(&ut_qtcontacts_add::onContactFoundThenRemoveAndTest);
+
+    //Block (allowing the mainloop to run) until we have finished.
+    waitForStop();
+}
+
+void ut_qtcontacts_add::onContactFoundThenRemoveAndTest()
+{
+    //qDebug() << "debug: Removing the existing contact, if it exists.";
+    QContactManager* manager = getContactManager();
+    Q_ASSERT(manager);
+
+    //TODO: Find and use an async API that tells us when it has finished.
+    manager->removeContact(contact.localId());
+
+    // Run the Qt UI's main loop, showing the editor while it is running:
+    QTimer::singleShot(2000, this, SLOT(onTimeoutAddContact()));
+}
+
+void ut_qtcontacts_add::onTimeoutAddContact()
+{
+    //qDebug() << "debug: Trying to add contact.";
+
+    // Offer a UI to edit a prefilled contact.
+    QContactName name;
+    name.setFirstName(QLatin1String(TESTNAME_FIRST));
+    name.setLastName(QLatin1String(TESTNAME_LAST));
+    //TODO: Find and use an async API that tells us when it has finished.
+    contact.saveDetail(&name);
+    //const bool saved = contact.saveDetail(&name);
+    //Q_ASSERT(saved); //This won't necessarily be useful because our implementation doesn't support sync methods.
+
+    //Save the contact.
+    //But note that our QContactManager backend does not set localId when returning.
+    QContactManager* manager = getContactManager();
+    Q_ASSERT(manager);
+
+
+    manager->saveContact(&contact);
+    //This works too:
+    //QContact copy(contact);
+    //manager->saveContact(&copy);
+
+    //Check that it was really saved:
+    //qDebug() << "debug: checking that the contact was saved.";
+    getExistingContact(&ut_qtcontacts_add::onContactFoundThenCheck);
+}
+
+void ut_qtcontacts_add::onContactFoundThenCheck()
+{
+    //Check that it was really saved:
+    // The ContactManager::saveContact() documentation suggests that localeId=0 is for non-saved contacts.
+    //QEXPECT_FAIL("", "QContactManager::saveContact() saves the contact (see it by running the contacts UI), but returns false and doesn't set error(). Find out why.", Continue);
+    QVERIFY(contact.localId() != 0);
+
+    //Check that the correct details were saved:
+    const QContactName name = contact.detail<QContactName>();
+    QVERIFY(name.firstName() == QLatin1String(TESTNAME_FIRST));
+    QVERIFY(name.lastName() == QLatin1String(TESTNAME_LAST));
+
+    //Try to restore original conditions:
+    getExistingContact(&ut_qtcontacts_add::onContactFoundThenRemoveAndStop);
+}
+
+void ut_qtcontacts_add::onContactFoundThenRemoveAndStop()
+{
+    //qDebug() << "debug: ut_qtcontacts_add::onContactFoundThenRemoveAndStop";
+    QContactManager* manager = getContactManager();
+    Q_ASSERT(manager);
+    manager->removeContact(contact.localId());
+
+    // Allow the actual test function to return:
+    waiting = false;
+}
+
+void ut_qtcontacts_add::checkSubTypes()
+{
+    QContact contact;
+
+    QContactManager* manager = getContactManager();
+
+    QContactPhoneNumber phone;
+
+    phone.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+    phone.setContexts(QContactPhoneNumber::ContextHome);
+    phone.setNumber("12345");
+
+    contact.saveDetail(&phone);
+    manager->saveContact(&contact);
+
+    phone.setSubTypes(QContactPhoneNumber::SubTypeFacsimile);
+
+    contact.saveDetail(&phone);
+    manager->saveContact(&contact);
+
+}
+
+QTEST_MAIN(ut_qtcontacts_add)