--- /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 );
+}
+