logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsdbconnector.cpp
changeset 0 4a5361db8937
child 6 41c0a814d878
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsdbconnector.cpp	Tue May 04 12:39:37 2010 +0300
@@ -0,0 +1,456 @@
+/*
+* 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:
+*
+*/
+#include "ut_logsdbconnector.h"
+#include "logsdbconnector.h"
+#include "logsevent.h"
+#include "logsmodel.h"
+#include "logsreader.h"
+#include "logscommondata.h"
+#include "centralrepository_stub_helper.h"
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QList<int>)
+
+#define LOGS_TEST_CREATE_EVENT(eventName, index, eventState ) \
+LogsEvent* eventName = new LogsEvent; \
+eventName->setIndex(index); \
+eventName->setLogId(index);\
+eventName->setIsInView(true); \
+eventName->mEventState = eventState; \
+mDbConnector->mEvents.insert(index, eventName)
+
+void UT_LogsDbConnector::initTestCase()
+{
+
+}
+
+void UT_LogsDbConnector::cleanupTestCase()
+{
+}
+
+
+void UT_LogsDbConnector::init()
+{
+    mDbConnector = new LogsDbConnector(mEvents);
+}
+
+void UT_LogsDbConnector::cleanup()
+{
+    delete mDbConnector;
+    mDbConnector = 0;
+}
+
+void UT_LogsDbConnector::testConstructor()
+{
+    QVERIFY( mDbConnector );
+}
+
+void UT_LogsDbConnector::testInit()
+{
+    QVERIFY( !mDbConnector->mLogsRemove );
+    QVERIFY( mDbConnector->init() == 0 );
+    QVERIFY( mDbConnector->mReader );
+    QVERIFY( mDbConnector->mLogsRemove );
+    QVERIFY( mDbConnector->mLogEventStrings.iFetched.length() > 0 );
+    QVERIFY( !mDbConnector->mCompressionEnabled );
+    QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeUndefined );
+    
+    // Resource control enabled
+    LogsDbConnector* connector = new LogsDbConnector(mEvents, false, true);
+    QVERIFY( connector->init() == 0 );
+    QVERIFY( connector->mReader );
+    QVERIFY( connector->mLogsRemove );
+    QVERIFY( connector->mCompressionEnabled );
+    QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeCompressEnabled );
+    delete connector;
+}
+
+void  UT_LogsDbConnector::testClearList()
+{
+    QVERIFY( !mDbConnector->mLogsRemove );
+    QVERIFY( !mDbConnector->clearList(LogsModel::TypeLogsClearAll) );
+    
+    mDbConnector->init();
+    QVERIFY( mDbConnector->mLogsRemove );
+    QVERIFY( mDbConnector->clearList(LogsModel::TypeLogsClearAll) );
+}
+
+void UT_LogsDbConnector::testClearEvents()
+{
+    QVERIFY( !mDbConnector->mLogsRemove );
+    QList<int> events;
+    events.append(1);
+    QVERIFY( !mDbConnector->clearEvents(events) ); // sync
+    
+    mDbConnector->init();
+    QVERIFY( mDbConnector->mLogsRemove );
+    mDbConnector->clearEvents(events); 
+    QVERIFY( !mDbConnector->clearEvents(events) ); // sync
+}
+
+void UT_LogsDbConnector::testMarkEventsSeen()
+{
+    QList<int> events;
+    QSignalSpy spy( mDbConnector, SIGNAL(markingCompleted(int)) );
+    
+    // Not ready
+    mDbConnector->mEventsSeen.clear();
+    mDbConnector->markEventsSeen(events);
+    QVERIFY( mDbConnector->mEventsSeen.count() == 0 );
+    
+    // No events
+    mDbConnector->init();
+    mDbConnector->markEventsSeen(events);
+    QVERIFY( mDbConnector->mEventsSeen.count() == 0 );
+    
+    // Marking missed as seen (one is already seen)
+    LOGS_TEST_CREATE_EVENT(event, 0, LogsEvent::EventAdded );
+    event->setDirection(LogsEvent::DirMissed);
+    LOGS_TEST_CREATE_EVENT(event2, 1, LogsEvent::EventAdded );
+    event2->setDirection(LogsEvent::DirMissed);
+    LOGS_TEST_CREATE_EVENT(event3, 2, LogsEvent::EventAdded );
+    event3->setDirection(LogsEvent::DirMissed);
+    events.append(0);
+    events.append(1);
+    QVERIFY( mDbConnector->markEventsSeen(events) );
+    QVERIFY( mDbConnector->mEventsSeen.count() == 2 );
+    QVERIFY( mDbConnector->mReader->mCurrentEventId == 0 ); // Started modifying
+    
+    // Trying to clear missed again, id is appended to mark list, old modifying process in ongoing
+    // and is not interrupted
+    events.append(2);
+    QVERIFY( !mDbConnector->markEventsSeen(events) );
+    QVERIFY( mDbConnector->mEventsSeen.count() == 3 );
+    QVERIFY( mDbConnector->mReader->mCurrentEventId == 0 ); // Modifying still previous
+    
+    // Completed previous modifying, next one in queue is modified
+    mDbConnector->mReader->Cancel();
+    mDbConnector->eventModifyingCompleted();
+    QVERIFY( mDbConnector->mEventsSeen.count() == 2 );
+    QVERIFY( mDbConnector->mReader->mCurrentEventId == 1 ); // Started modifying next one
+    QVERIFY( spy.count() == 0 ); // Not yet totally completed
+    
+    // Last pending gets completed
+    mDbConnector->mEventsSeen.takeLast(); // Now only one pending left
+    mDbConnector->eventModifyingCompleted();
+    QVERIFY( mDbConnector->mEventsSeen.count() == 0 );
+    QVERIFY( spy.count() == 1 ); // Completion was signaled with err 0
+    QVERIFY( spy.takeFirst().at(0).toInt() == 0 );
+    
+    // Clearing all, ids are not appended as those are already in modification list
+    mDbConnector->mEventsSeen.clear();
+    mDbConnector->mEventsSeen.append(0);
+    mDbConnector->mEventsSeen.append(1);
+    mDbConnector->mEventsSeen.append(2);
+    QVERIFY( !mDbConnector->markEventsSeen(events) );
+    QVERIFY( mDbConnector->mEventsSeen.count() == 3 );
+}
+
+void UT_LogsDbConnector::testReadDuplicates()
+{
+    QSignalSpy spy( mDbConnector, SIGNAL(duplicatesRead()) );
+    
+    // Not ready
+    QVERIFY( mDbConnector->readDuplicates(2) != 0 );
+    
+    // Previous results are cleared when starting ok
+    LogsEvent* event = new LogsEvent;
+    mDbConnector->mDuplicatedEvents.append(event);
+    mDbConnector->init();
+    mDbConnector->readDuplicates(2);
+    QVERIFY( mDbConnector->mDuplicatedEvents.count() == 0 );
+    
+    // Completes
+    LogsEvent* event2 = new LogsEvent;
+    LogsEvent* event3 = new LogsEvent;
+    QList<LogsEvent*> duplicates;
+    duplicates.append(event2);
+    duplicates.append(event3);
+    mDbConnector->duplicatesReadingCompleted(duplicates);
+    QVERIFY( mDbConnector->mDuplicatedEvents.count() == 2 );
+    QVERIFY( spy.count() == 1 );
+    
+    // Client reads those events
+    QList<LogsEvent*> takenEvents = mDbConnector->takeDuplicates();
+    QVERIFY( mDbConnector->mDuplicatedEvents.count() == 0 );
+    QVERIFY( takenEvents.count() == 2 );
+    
+}
+
+void UT_LogsDbConnector::testStart()
+{
+    // No reader, starting fails
+    QVERIFY( mDbConnector->start() == -1 );
+    
+    // Starting ok
+    mDbConnector->init();
+    QVERIFY( mDbConnector->start() == 0 );
+}
+
+void UT_LogsDbConnector::testReadCompleted()
+{
+    qRegisterMetaType< QList<int> >("QList<int>");
+    QSignalSpy spyAdded(mDbConnector, SIGNAL(dataAdded(QList<int>)));
+    QSignalSpy spyRemoved(mDbConnector, SIGNAL(dataRemoved(QList<int>)));
+    QSignalSpy spyUpdated(mDbConnector, SIGNAL(dataUpdated(QList<int>)));
+
+    // No events, no signal
+    mDbConnector->readCompleted(0);
+    QVERIFY( spyAdded.count() == 0 );
+    QVERIFY( spyRemoved.count() == 0 );
+    QVERIFY( spyUpdated.count() == 0 );
+    
+    // Events exists, their indexes are signaled
+    LOGS_TEST_CREATE_EVENT(event, 0, LogsEvent::EventAdded );
+    mDbConnector->readCompleted(1);
+    QVERIFY( spyAdded.count() == 1 );
+    QList<int> addedIndexes = qvariant_cast< QList<int> >(spyAdded.at(0).at(0));
+    QVERIFY( addedIndexes.count() == 1 );
+    QVERIFY( addedIndexes.at(0) == 0 );
+    QVERIFY( spyRemoved.count() == 0 );
+    QVERIFY( spyUpdated.count() == 0 );
+    QVERIFY( mDbConnector->mEvents.count() == 1 );
+    QVERIFY( mEvents.count() == 1 );
+    
+    // 2 more events added, their indexes are signaled
+    event->mEventState = LogsEvent::EventNotUpdated;
+    event->setIndex(2);
+    LOGS_TEST_CREATE_EVENT(event2, 0, LogsEvent::EventAdded );
+    LOGS_TEST_CREATE_EVENT(event3, 1, LogsEvent::EventAdded );
+    mDbConnector->readCompleted(3);
+    QVERIFY( spyAdded.count() == 2 );
+    QList<int> addedIndexes2 = qvariant_cast< QList<int> >(spyAdded.at(1).at(0));
+    QVERIFY( addedIndexes2.count() == 2 );
+    QVERIFY( addedIndexes2.at(0) == 0 );
+    QVERIFY( addedIndexes2.at(1) == 1 );
+    QVERIFY( spyRemoved.count() == 0 );
+    QVERIFY( spyUpdated.count() == 0 );
+    QVERIFY( mDbConnector->mEvents.count() == 3 );
+    QVERIFY( mEvents.count() == 3 );
+    
+    // One of the events updated (index 1)
+    event->mEventState = LogsEvent::EventNotUpdated;
+    event2->mEventState = LogsEvent::EventNotUpdated;
+    event3->mEventState = LogsEvent::EventUpdated;
+    mDbConnector->readCompleted(3); 
+    QVERIFY( spyAdded.count() == 2 );
+    QVERIFY( spyRemoved.count() == 0 );
+    QVERIFY( spyUpdated.count() == 1 );
+    QList<int> updatedIndexes = qvariant_cast< QList<int> >(spyUpdated.at(0).at(0));
+    QVERIFY( updatedIndexes.count() == 1 );
+    QVERIFY( updatedIndexes.at(0) == 1 );
+    QVERIFY( mDbConnector->mEvents.count() == 3 );
+    QVERIFY( mEvents.count() == 3 );
+    
+    // One of the events removed (index 2)
+    event->setIsInView(false);
+    event3->mEventState = LogsEvent::EventNotUpdated;
+    mDbConnector->readCompleted(2);
+    QVERIFY( spyAdded.count() == 2 );
+    QVERIFY( spyRemoved.count() == 1 );
+    QVERIFY( spyUpdated.count() == 1 );
+    QList<int> removedIndexes = qvariant_cast< QList<int> >(spyRemoved.at(0).at(0));
+    QVERIFY( removedIndexes.count() == 1 );
+    QVERIFY( removedIndexes.at(0) == 2 ); // index 2
+    QVERIFY( mDbConnector->mEvents.count() == 2 );
+    QVERIFY( mEvents.count() == 2 );
+    
+    // Read completed when compression is enabled, reader is stopped
+    QVERIFY( mDbConnector->init() == 0 );
+    QVERIFY( mDbConnector->start() == 0 );
+    QVERIFY( mDbConnector->mReader->mLogViewRecent != 0 );
+    mDbConnector->mCompressionEnabled = true;
+    mDbConnector->readCompleted(0);
+    QVERIFY( mDbConnector->mReader->mLogViewRecent == 0 );
+}
+
+void UT_LogsDbConnector::testErrorOccurred()
+{
+    // If pending event modifying, completion is signaled
+    QSignalSpy spy( mDbConnector, SIGNAL(markingCompleted(int)) );
+    mDbConnector->mEventsSeen.append(0);
+    mDbConnector->mEventsSeen.append(1);
+    mDbConnector->errorOccurred(-3);
+    QVERIFY( spy.count() == 1 ); // Completion was signaled with err -3
+    QVERIFY( spy.takeFirst().at(0).toInt() == -3 );
+    QVERIFY( mDbConnector->mEventsSeen.count() == 0 );
+}
+
+void UT_LogsDbConnector::testUpdateDetails()
+{
+    QSignalSpy spyUpdated(mDbConnector, SIGNAL(dataUpdated(QList<int>)));
+    QVERIFY( !mDbConnector->mReader );
+    QVERIFY( mDbConnector->updateDetails(false) == -1 );
+    QVERIFY( spyUpdated.count() == 0 );
+    
+    mDbConnector->init();
+    QVERIFY( mDbConnector->mReader );
+    LOGS_TEST_CREATE_EVENT(event, 0, LogsEvent::EventUpdated );
+    QVERIFY( mDbConnector->updateDetails(false) == 0 );
+    QVERIFY( spyUpdated.count() == 1 );
+}
+
+void UT_LogsDbConnector::testClearMissedCallsCounter()
+{
+    // Not ready
+    QVERIFY( mDbConnector->clearMissedCallsCounter() != 0 );
+    
+    // Ready and value is changed
+    mDbConnector->init();
+    CentralRepositoryStubHelper::reset();
+    CentralRepositoryStubHelper::setCurrentVal(5);
+    QVERIFY( mDbConnector->clearMissedCallsCounter() == 0 );
+    QVERIFY( CentralRepositoryStubHelper::currentVal() == 0 );
+    
+    // Ready and no need to change value as it is already zero
+    QVERIFY( mDbConnector->clearMissedCallsCounter() == 0 );
+    QVERIFY( CentralRepositoryStubHelper::currentVal() == 0 );
+    
+    // Fails with some error
+    CentralRepositoryStubHelper::setCurrentVal(100);
+    CentralRepositoryStubHelper::setFailCode(KErrNotFound);
+    QVERIFY( mDbConnector->clearMissedCallsCounter() != 0 );
+}
+
+void UT_LogsDbConnector::testRefreshData()
+{
+    QVERIFY( mDbConnector->refreshData() != 0 );
+    
+    // Resource control enabled, no reader
+    mDbConnector->mResourceControl = true;
+    QVERIFY( mDbConnector->refreshData() == 0 );
+    
+    // Reader exists, not compressed before, nothing done
+    mDbConnector->init();
+    mDbConnector->mCompressionEnabled = false;
+    QVERIFY( mDbConnector->refreshData() == 0 );
+    QVERIFY( !mDbConnector->mReader->IsActive() );
+    QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeUndefined );
+    
+    // Reader exists, compressed before, reading started
+    mDbConnector->mCompressionEnabled = true;
+    QVERIFY( mDbConnector->refreshData() == 0 );
+    QVERIFY( mDbConnector->mReader->IsActive() );
+    QVERIFY( !mDbConnector->mCompressionEnabled );
+    QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeUndefined );
+    
+    // Reading not started again as already active
+    LogsCommonData::getInstance().configureReadSize(30, LogsEvent::DirUndefined);
+    mDbConnector->mCompressionEnabled = true;
+    QVERIFY( mDbConnector->refreshData() == 0 );
+    QVERIFY( mDbConnector->mReader->IsActive() );
+    QVERIFY( !mDbConnector->mCompressionEnabled );
+    QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeUndefined );
+}
+
+void UT_LogsDbConnector::testCompressData()
+{
+    qRegisterMetaType< QList<int> >("QList<int>");
+    QSignalSpy spyRemoved(mDbConnector, SIGNAL(dataRemoved(QList<int>)));
+    
+    QVERIFY( mDbConnector->compressData() != 0 );
+    
+    // Reader exists, zero events, nothing really done
+    mDbConnector->mResourceControl = true;
+    mDbConnector->init();
+    mDbConnector->mCompressionEnabled = false;
+    QVERIFY( mDbConnector->compressData() == 0 );
+    QVERIFY( mDbConnector->mCompressionEnabled );
+    QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeCompressEnabled );
+    QVERIFY( spyRemoved.count() == 1 );
+    QList<int> removedIndexes = qvariant_cast< QList<int> >(spyRemoved.at(0).at(0));
+    QVERIFY( removedIndexes.count() == 0 );
+        
+    // Less events than compression limit is, nothing really done
+    int numEvents = 3;
+    for ( int i = 0; i < numEvents; i++ ){
+        LOGS_TEST_CREATE_EVENT(event, i, LogsEvent::EventAdded );
+    }
+    mDbConnector->mCompressionEnabled = false;
+    QVERIFY( mDbConnector->compressData() == 0 );
+    QVERIFY( mDbConnector->mCompressionEnabled );
+    QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeCompressEnabled );
+    QVERIFY( spyRemoved.count() == 2 );
+    QList<int> removedIndexes2 = qvariant_cast< QList<int> >(spyRemoved.at(1).at(0));
+    QVERIFY( removedIndexes2.count() == 0 );
+    QVERIFY( mDbConnector->mModelEvents.count() == numEvents );
+    
+    // More events than compression limit is, extra events removed
+    int numEventsMoreThanCompressLimit = ( numEvents + logsReadSizeCompressEnabled );
+    for ( int i = numEvents; i < numEventsMoreThanCompressLimit; i++ ){
+       LOGS_TEST_CREATE_EVENT(event, i, LogsEvent::EventAdded );
+    }
+    mDbConnector->mCompressionEnabled = false;
+    QVERIFY( mDbConnector->compressData() == 0 );
+    QVERIFY( mDbConnector->mCompressionEnabled );
+    QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeCompressEnabled );
+    QVERIFY( spyRemoved.count() == 3 );
+    QList<int> removedIndexes3 = qvariant_cast< QList<int> >(spyRemoved.at(2).at(0));
+    QVERIFY( removedIndexes3.count() == numEvents );
+    // Check indexes of those removed events (3 oldest events)
+    QVERIFY( removedIndexes3.at(0) == ( numEventsMoreThanCompressLimit - 3 ) ); 
+    QVERIFY( removedIndexes3.at(1) == ( numEventsMoreThanCompressLimit - 2) );
+    QVERIFY( removedIndexes3.at(2) == ( numEventsMoreThanCompressLimit - 1 ) );
+    QVERIFY( mDbConnector->mModelEvents.count() == logsReadSizeCompressEnabled );
+}
+
+void UT_LogsDbConnector::testPredictiveSearchStatus()
+{
+    // Not ready
+    QVERIFY( mDbConnector->predictiveSearchStatus() != 0 );
+    
+    // Ready and value returned
+    mDbConnector->init();
+    CentralRepositoryStubHelper::reset();
+    CentralRepositoryStubHelper::setCurrentVal(2);
+    QVERIFY( mDbConnector->predictiveSearchStatus() == 2 );
+    
+    // Fails with some error
+    CentralRepositoryStubHelper::setCurrentVal(2);
+    CentralRepositoryStubHelper::setFailCode(KErrNotSupported);
+    QVERIFY( mDbConnector->predictiveSearchStatus() == KErrNotSupported );
+}
+
+void UT_LogsDbConnector::testSetPredictiveSearch()
+{
+    // Not ready
+    QVERIFY( mDbConnector->setPredictiveSearch(true) != 0 );
+    
+    // Ready and value change is not allowed
+    mDbConnector->init();
+    CentralRepositoryStubHelper::reset();
+    CentralRepositoryStubHelper::setCurrentVal(0);
+    QVERIFY( mDbConnector->setPredictiveSearch(true) != 0 );
+    QVERIFY( CentralRepositoryStubHelper::currentVal() == 0 );
+    
+    // Ready and value is changed
+    CentralRepositoryStubHelper::setCurrentVal(2);
+    QVERIFY( mDbConnector->setPredictiveSearch(true) == 0 );
+    QVERIFY( CentralRepositoryStubHelper::currentVal() == 1 );
+    
+    // Ready and value is changed
+    CentralRepositoryStubHelper::setCurrentVal(1);
+    QVERIFY( mDbConnector->setPredictiveSearch(false) == 0 );
+    QVERIFY( CentralRepositoryStubHelper::currentVal() == 2 );
+        
+    // Fails with some error
+    CentralRepositoryStubHelper::setCurrentVal(1);
+    CentralRepositoryStubHelper::setFailCode(KErrNotFound);
+    QVERIFY( mDbConnector->setPredictiveSearch(false) == KErrNotFound ); 
+}
+