contentstorage/caclient/tsrc/t_caclient/src/t_caclient_notifier_ext.cpp
author Jaakko Haukipuro (Nokia-MS/Oulu) <Jaakko.Haukipuro@nokia.com>
Thu, 16 Sep 2010 12:11:40 +0100
changeset 117 c63ee96dbe5f
permissions -rw-r--r--
Missing activityfw and taskswitcher components - fix for Bug 3670

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  Extra tests notifications.
*
*/


#include "t_caclient.h"
#include "caservice.h"
#include "canotifier.h"
#include "canotifierfilter.h"
#include "t_caclientnotifier.h"

const int entryIdFake(-1);
const int waitTimeMin(100);
const int waitTime500ms(500);
const int waitTime1sec(1000);

const int noOfClients(3);
const int noOfManyClients(20);

class Thread: public QThread
{
public:
    enum OpType {None, AddItem, RemoveEntry, RemoveEntryId, TooMuchClients};
    void run();
    Thread(): mOpType(None), mRemoved(false), mEntry(), mId(0), mClientNotifier(NULL), mNotifier(NULL) { }
    ~Thread();

    OpType mOpType;
    bool mRemoved;
    QSharedPointer<CaEntry> mEntry;
    int mId;
    TestCaClientNotifier *mClientNotifier;
    CaNotifier *mNotifier;
};

Thread::~Thread()
{
    QSharedPointer<CaService> service = CaService::instance();
    service->removeEntry(mId);
    disconnect(mNotifier, SIGNAL(entryChanged(int,ChangeType)),
               mClientNotifier, SLOT(entryChanged(int,ChangeType)));
    QTest::qWait(waitTime500ms);
    delete mClientNotifier;
}

void Thread::run()
{
    QTest::qWait(waitTimeMin);
    QSharedPointer<CaService> service = CaService::instance();
    CaNotifierFilter *filter = new CaNotifierFilter();
    filter->setEntryRole(ItemEntryRole);
    filter->setTypeNames(QStringList() << "TypeName");
    mClientNotifier = new TestCaClientNotifier(*service, filter);
    mNotifier = mClientNotifier->getNotifier();
    CaEntry item;
    item.setText("Text");
    item.setEntryTypeName("TypeName");
    switch (mOpType) {
    case AddItem: {
        connect(mNotifier, SIGNAL(entryChanged(int,ChangeType)),
                mClientNotifier, SLOT(entryChanged(int,ChangeType)));
        QTest::qWait(waitTime1sec);
        QSharedPointer<CaEntry> entry = service->createEntry(item);
        mId = entry->id();
    }
    break;
    case RemoveEntry: {
        connect(mNotifier, SIGNAL(entryChanged(const CaEntry &,ChangeType)),
                mClientNotifier, SLOT(entryChanged(const CaEntry &,ChangeType)));
        QTest::qWait(waitTime1sec);
        mRemoved = service->removeEntry(*mEntry);
    }
    break;
    case RemoveEntryId: {
        connect(mNotifier, SIGNAL(entryChanged(int,ChangeType)),
                mClientNotifier, SLOT(entryChanged(int,ChangeType)));
        QTest::qWait(waitTime1sec);
        mRemoved = service->removeEntry(mId);
    }
    break;
    case TooMuchClients: {
        connect(mNotifier, SIGNAL(entryChanged(int,ChangeType)),
                mClientNotifier, SLOT(entryChanged(int,ChangeType)));
    }
    break;
    default:
        qWarning("Thread::run: unknown operation (mOpType)");
        break;
    }

    exec();
}

/*
class ThreadRemoveEntry: public QThread
{
public:
    void run();
    ~ThreadRemoveEntry();

    bool mRemoved;
    CaEntry *mEntry;
    int mId;
    TestCaClientNotifier *mClientNotifier;
    CaNotifier *mNotifier;
};

ThreadRemoveEntry::~ThreadRemoveEntry()
{
    disconnect(mNotifier, SIGNAL(entryChanged(int,ChangeType)),
        mClientNotifier, SLOT(entryChanged(int,ChangeType)) );
    QTest::qWait(waitTime500ms);
    delete mClientNotifier;
}

void ThreadRemoveEntry::run()
{
    QSharedPointer<CaService> service = CaService::instance();
    TestCaClientNotifier *clientNotifier = new TestCaClientNotifier(*service);
    CaNotifier *notifier = clientNotifier->getNotifier();
    connect( notifier, SIGNAL(entryChanged(const CaEntry &,ChangeType )),
            clientNotifier, SLOT(entryChanged(const CaEntry &,ChangeType )) );

    CaEntry item;
    item.setText("Text");
    item.setEntryTypeName("TypeName");

    mRemoved = service->removeEntry(*mEntry);

    exec();
}
*/

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void TestCaClient::TestAddItemChangeTypeNotifierNClients()
{
#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARK;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
    {
        QSharedPointer<CaService> service = CaService::instance();
        TestCaClientNotifier *clientNotifier = new TestCaClientNotifier(*service);
        CaNotifier *notifier = clientNotifier->getNotifier();
        connect(notifier, SIGNAL(entryChanged(int,ChangeType)),
                clientNotifier, SLOT(entryChanged(int,ChangeType)));

        QTest::qWait(waitTime1sec);
        CaEntry item;
        item.setText("Text");
        item.setEntryTypeName("TypeName");
        QSharedPointer<CaEntry> entries[noOfClients];
        for (int i=0; i<noOfClients; i++) {
            item.setText("Text");
            item.setEntryTypeName("TypeName");
            entries[i] = service->createEntry(item);
            QTest::qWait(waitTime1sec);
            QCOMPARE(clientNotifier->mChangeType, AddChangeType);
            QCOMPARE(clientNotifier->mEntryId, entries[i]->id());
            QCOMPARE(clientNotifier->mCount, i+1);
        }

        for (int i=0; i<noOfClients; i++) {
            for (int j=i+1; j<noOfClients; j++) {
                QVERIFY(entries[i]->id() != entries[j]->id());
            }
        }

        // cleanup
        disconnect(notifier, SIGNAL(entryChanged(int,ChangeType)),
                   clientNotifier, SLOT(entryChanged(int,ChangeType)));
        QTest::qWait(waitTime500ms);
        delete clientNotifier;
        for (int i=0; i<noOfClients; i++) {
            service->removeEntry(entries[i]->id());
        }
    }


#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARKEND;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
}

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void TestCaClient::TestAddItemChangeTypeNotifierNClientsFast()
{
#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARK;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
    {
        QSharedPointer<CaService> service = CaService::instance();
        TestCaClientNotifier *clientNotifier = new TestCaClientNotifier(*service);
        CaNotifier *notifier = clientNotifier->getNotifier();
        connect(notifier, SIGNAL(entryChanged(int,ChangeType)),
                clientNotifier, SLOT(entryChanged(int,ChangeType)));

        QTest::qWait(waitTime1sec);
        CaEntry item;
        item.setText("Text");
        item.setEntryTypeName("TypeName");
        QSharedPointer<CaEntry> entries[noOfClients];
        item.setText("Text");
        item.setEntryTypeName("TypeName");
        for (int i=0; i<noOfClients; i++) {
            entries[i] = service->createEntry(item);
        }
        QTest::qWait(waitTime1sec);
        QCOMPARE(clientNotifier->mCount, 3);
        for (int i=0; i<noOfClients; i++) {
            QVERIFY(clientNotifier->mEntryIds->contains(entries[i]->id()));
            for (int j=i+1; j<noOfClients; j++) {
                QVERIFY(entries[i]->id() != entries[j]->id());
            }
        }

        // cleanup
        disconnect(notifier, SIGNAL(entryChanged(int,ChangeType)),
                   clientNotifier, SLOT(entryChanged(int,ChangeType)));
        QTest::qWait(waitTime500ms);
        delete clientNotifier;
        for (int i=0; i<noOfClients; i++) {
            service->removeEntry(entries[i]->id());
        }
    }


#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARKEND;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
}

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void TestCaClient::TestAddItemChangeTypeNotifierNClientsThreads()
{
#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARK;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
    {
        Thread threads[noOfClients];
        for (int i=0; i<noOfClients; i++) {
            threads[i].mOpType = Thread::AddItem;
            threads[i].start();
        }
        QTest::qWait(6*noOfClients*waitTime1sec);

        for (int i=0; i<noOfClients; i++) {
            QCOMPARE(threads[i].mClientNotifier->mCount, noOfClients);
            for (int j=0; j<noOfClients; j++) {
                for (int k=j+1; k<noOfClients; k++) {
                    QVERIFY(threads[i].mClientNotifier->mEntryIds->at(j)
                            != threads[i].mClientNotifier->mEntryIds->at(k));
                }
            }
        }
        for (int i=0; i<noOfClients; i++) {
            for (int j=0; j<noOfClients; j++) {
                QVERIFY(threads[j].mClientNotifier->mEntryIds->contains(threads[i].mId));
            }
        }

        for (int i=0; i<noOfClients; i++) {
            threads[i].exit(0);
        }
        QTest::qWait(waitTime500ms);

    }

#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARKEND;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
}

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void TestCaClient::TestRemoveEntryChangeTypeNotifierNClients()
{
#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARK;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
    {
        QSharedPointer<CaService> service = CaService::instance();
        TestCaClientNotifier *clientNotifier = new TestCaClientNotifier(*service);
        CaNotifier *notifier = clientNotifier->getNotifier();
        connect(notifier, SIGNAL(entryChanged(int,ChangeType)),
                clientNotifier, SLOT(entryChanged(int,ChangeType)));
        QTest::qWait(waitTime500ms);
        connect(notifier, SIGNAL(entryChanged(const CaEntry &,ChangeType)),
                clientNotifier, SLOT(entryChanged(const CaEntry &,ChangeType)));

        QTest::qWait(waitTime1sec);
        CaEntry item;
        item.setText("Text");
        item.setEntryTypeName("TypeName");
        QSharedPointer<CaEntry> entries[noOfClients];
        for (int i=0; i<noOfClients; i++) {
            entries[i] = service->createEntry(item);
            QTest::qWait(waitTime1sec);
            QCOMPARE(clientNotifier->mChangeType, AddChangeType);
            QCOMPARE(clientNotifier->mEntryId, entries[i]->id());
            QCOMPARE(clientNotifier->mCount, 2*(i+1));
        }
        for (int i=0; i<noOfClients; i++) {
            bool removed = service->removeEntry(*entries[i]);
            QVERIFY(removed);
            QTest::qWait(waitTime1sec);
            QCOMPARE(clientNotifier->mChangeType, RemoveChangeType);
            QCOMPARE(clientNotifier->mEntryId, entries[i]->id());
        }

        // cleanup
        disconnect(notifier, SIGNAL(entryChanged(int,ChangeType)),
                   clientNotifier, SLOT(entryChanged(int,ChangeType)));
        QTest::qWait(waitTime500ms);
        delete clientNotifier;
    }

#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARKEND;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
}

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void TestCaClient::TestRemoveEntryChangeTypeNotifierNClientsThreads()
{
#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARK;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
    {
        QSharedPointer<CaService> service = CaService::instance();
        QTest::qWait(waitTime1sec);
        CaEntry item;
        item.setText("Text");
        item.setEntryTypeName("TypeName");
        QSharedPointer<CaEntry> entries[noOfClients];
        for (int i=0; i<noOfClients; i++) {
            entries[i] = service->createEntry(item);
        }

        QTest::qWait(waitTime1sec);
        Thread threads[noOfClients];
        for (int i=0; i<noOfClients; i++) {
            threads[i].mOpType = Thread::RemoveEntry;
            threads[i].mEntry = entries[i];
            threads[i].start();
        }
        QTest::qWait(6*noOfClients*waitTime1sec);
        for (int i=0; i<noOfClients; i++) {
            QVERIFY(threads[i].mRemoved);
            QCOMPARE(threads[i].mClientNotifier->mChangeType, RemoveChangeType);
            QCOMPARE(threads[i].mClientNotifier->mCount, noOfClients);
            QVERIFY(threads[i].mClientNotifier->mEntryIds->contains(entries[i]->id()));
        }

        for (int i=0; i<noOfClients; i++) {
            threads[i].exit(0);
        }
        QTest::qWait(waitTime500ms);
        
        // cleanup
        for (int i=0; i<noOfClients; i++) {
            bool removed = service->removeEntry(*entries[i]);
            QTest::qWait(waitTime1sec);
        }

    }

#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARKEND;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
}

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void TestCaClient::TestRemoveEntryIdChangeTypeNotifierNClientsThreads()
{
#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARK;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
    {
        QSharedPointer<CaService> service = CaService::instance();
        QTest::qWait(waitTime1sec);
        CaEntry item;
        item.setText("Text");
        item.setEntryTypeName("TypeName");
        int ids[noOfClients];
        for (int i=0; i<noOfClients; i++) {
            ids[i] = service->createEntry(item)->id();
        }

        QTest::qWait(waitTime1sec);
        Thread threads[noOfClients];
        for (int i=0; i<noOfClients; i++) {
            threads[i].mOpType = Thread::RemoveEntryId;
            threads[i].mId = ids[i];
            threads[i].start();
        }
        QTest::qWait(6*noOfClients*waitTime1sec);
        for (int i=0; i<noOfClients; i++) {
            QVERIFY(threads[i].mRemoved);
            QCOMPARE(threads[i].mClientNotifier->mChangeType, RemoveChangeType);
            QCOMPARE(threads[i].mClientNotifier->mCount, noOfClients);
            QVERIFY(threads[i].mClientNotifier->mEntryIds->contains(ids[i]));
        }

        for (int i=0; i<noOfClients; i++) {
            threads[i].exit(0);
        }
        QTest::qWait(waitTime500ms);
        
        // cleanup
        for (int i=0; i<noOfClients; i++) {
            bool removed = service->removeEntry(ids[i]);
            QTest::qWait(waitTime1sec);
        }

    }

#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARKEND;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
}

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void TestCaClient::TestAddItemChangeTypeNotifierManyClientsThreads()
{
#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARK;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
    {
        QSharedPointer<CaService> service = CaService::instance();

        Thread threads[noOfManyClients];
        for (int i=0; i<noOfManyClients; i++) {
            threads[i].mOpType = Thread::TooMuchClients;
            threads[i].start();
        }
        QTest::qWait(10*waitTime1sec);
        CaEntry item;
        item.setText("Text");
        item.setEntryTypeName("TypeName");
        int ids[noOfClients];
        for (int i=0; i<noOfClients; i++) {
            ids[i] = service->createEntry(item)->id();
        }
        QTest::qWait(6*noOfManyClients*waitTime1sec);

        for (int i=0; i<noOfManyClients; i++) {
            QCOMPARE(threads[i].mClientNotifier->mCount, noOfClients);
            for (int j=0; j<noOfClients; j++) {
                for (int k=j+1; k<noOfClients; k++) {
                    QVERIFY(threads[i].mClientNotifier->mEntryIds->at(j)
                            != threads[i].mClientNotifier->mEntryIds->at(k));
                }
            }
        }
        for (int i=0; i<noOfClients; i++) {
            for (int j=0; j<noOfManyClients; j++) {
                QVERIFY(threads[j].mClientNotifier->mEntryIds->contains(ids[i]));
            }
        }

        for (int i=0; i<noOfManyClients; i++) {
            threads[i].exit(0);
        }
        QTest::qWait(waitTime500ms);
        
        // cleanup
        for (int i=0; i<noOfClients; i++) {
            bool removed = service->removeEntry(ids[i]);
            QVERIFY(removed);
            QTest::qWait(waitTime1sec);
        }

    }

#ifdef Q_OS_SYMBIAN
#ifdef UT_MEMORY_CHECK
    __UHEAP_MARKEND;
#endif//UT_MEMORY_CHECK
#endif//Q_OS_SYMBIAN
}