diff -r 3ab5c078b490 -r c63ee96dbe5f contentstorage/castorage/tsrc/t_castorage/src/castoragetestgetentries.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentstorage/castorage/tsrc/t_castorage/src/castoragetestgetentries.cpp Thu Sep 16 12:11:40 2010 +0100 @@ -0,0 +1,1480 @@ +/* +* 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: +* +*/ +/* + * castoragetestgetentries.cpp + * + * Created on: 2009-08-05 + * Author: michal.czerwiec + */ + +#include +#include +#include +#include +#include + +#include "castoragetest.h" +#include "cainnerquery.h" +#include "castoragefactory.h" +#include "castorage.h" +#include "cainnerentry.h" +#include "castoragetestsqlcommands.h" +#include "casqlcommands.h" +#include "casqlquery.h" +#include "casqlitestorage.h" +#include "cadef.h" + + +// --------------------------------------------------------------------------- +// Test that two data arrays have opposite order. +// +// --------------------------------------------------------------------------- +// +TInt CCAStorageTest::verifyOppositeOrder(RPointerArray& aArray1, + RPointerArray& aArray2) +{ + TInt err; + + __UHEAP_MARK; + + err = (aArray1.Count() == aArray2.Count())? KErrNone : KErrWrongData; + if (!err) { + TInt count(aArray1.Count()); + for (TInt i = 0; i < aArray1.Count(); i++) { + if (aArray1[i]->GetId() != aArray2[count-1-i]->GetId()) { + err = KErrWrongData; + break; + } + } + } + + __UHEAP_MARKEND; + + return err; +} + +// --------------------------------------------------------------------------- +// Test Sorting Order giving different attributes. +// +// --------------------------------------------------------------------------- +// +TInt CCAStorageTest::testSortingBySortOrder(CCaInnerQuery::TSortAttribute sortAttr1, + CCaInnerQuery::TSortAttribute sortAttr2) +{ + + __UHEAP_MARK; + + TRAPD(err, + CCaInnerQuery *innerQuery1 = CCaInnerQuery::NewLC(); + innerQuery1->SetSort(sortAttr1); + + CCaInnerQuery *innerQuery2 = CCaInnerQuery::NewLC(); + innerQuery2->SetSort(sortAttr2); + + err = testSortingBySortOrder(innerQuery1, innerQuery2); + + CleanupStack::PopAndDestroy(innerQuery2); + CleanupStack::PopAndDestroy(innerQuery1); + ); + __UHEAP_MARKEND; + + return err; +} + + +// --------------------------------------------------------------------------- +// Test Sorting Order giving different attributes. +// +// --------------------------------------------------------------------------- +// +TInt CCAStorageTest::testSortingBySortOrder(CCaInnerQuery *aInnerQuery1, + CCaInnerQuery *aInnerQuery2) +{ + __UHEAP_MARK; + TInt err(KErrNone); + RPointerArray resultArray; + TRAP(err, + CleanupResetAndDestroyPushL(resultArray); + mStorage->GetEntriesL(aInnerQuery1,resultArray); + + RPointerArray resultArrayDesc; + CleanupResetAndDestroyPushL(resultArrayDesc); + mStorage->GetEntriesL(aInnerQuery2,resultArrayDesc); + + err = (resultArray.Count() > 0)? KErrNone : KErrWrongData; + + if (err == KErrNone) { + err = (resultArrayDesc.Count() > 0)? KErrNone : KErrWrongData; + } + + if (err == KErrNone) { + err = verifyOppositeOrder(resultArray, resultArrayDesc); + } + CleanupStack::PopAndDestroy(&resultArrayDesc); + CleanupStack::PopAndDestroy(&resultArray); + ); + + + __UHEAP_MARKEND; + + return err; +} +// --------------------------------------------------------------------------- +// Test Select several entries by id. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesById() +{ + __UHEAP_MARK; + { + QList expectedIdList; + expectedIdList << 1 << 2 << 3 << 4 << 5 << 6; + QList actualIdList; + + + TRAPD(err, + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + RArray idArray; + CleanupClosePushL(idArray); + idArray.AppendL(expectedIdList[0]); + idArray.AppendL(expectedIdList[1]); + idArray.AppendL(expectedIdList[2]); + idArray.AppendL(expectedIdList[3]); + idArray.AppendL(expectedIdList[4]); + idArray.AppendL(expectedIdList[5]); + + innerQuery->SetIdsL(idArray); + + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + + mStorage->GetEntriesL(innerQuery,resultArray); + + // check if the actual items were returned + for (TInt i = 0; i < resultArray.Count(); i++) { + actualIdList << resultArray[i]->GetId(); + } + + CleanupStack::PopAndDestroy(&resultArray); + CleanupStack::PopAndDestroy(&idArray); + CleanupStack::PopAndDestroy(innerQuery); + ); + + + QCOMPARE(err, KErrNone); + QCOMPARE(actualIdList, expectedIdList); + } + + __UHEAP_MARKEND; +} + +// --------------------------------------------------------------------------- +// Test Select entries by group id. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesByGroupId() +{ + TInt expectedGroupEntryCount(0); + TInt actualGroupEntryCount(0); + + __UHEAP_MARK; + + TRAPD(err, + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + + // check before test entries count in sfecific group + CCaSqlQuery *query = CCaSqlQuery::NewLC(((CCaSqLiteStorage *)mStorage)->iSqlDb); + query->SetQueryL(KSQLGetEntriesCountFromSpecificGroup); + query->PrepareL(); + query->BindIntL(query->iStatement.ParameterIndex(KSQLGEIdGroup), KAllCollectionsGroupId); + + query->ExecuteL(expectedGroupEntryCount); + + CleanupStack::PopAndDestroy(query); + + innerQuery->SetParentId(KAllCollectionsGroupId); + + // get entries from specific group + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + + mStorage->GetEntriesL(innerQuery, resultArray); + + actualGroupEntryCount = resultArray.Count(); + + CleanupStack::PopAndDestroy(&resultArray); + CleanupStack::PopAndDestroy(innerQuery); + ); + + __UHEAP_MARKEND; + + QCOMPARE(err, KErrNone); + QCOMPARE(actualGroupEntryCount, expectedGroupEntryCount); +} + +// --------------------------------------------------------------------------- +// Test Select entries by group id. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesByTypeName() +{ + bool nonWidgetEntryFound(false); + const int expectedNumberOfWidgets(2); + int numberOfWidgetsFound(0); + + __UHEAP_MARK; + + _LIT(KTypeNameWidget, "Widget"); + + TRAPD(err, + // add 2 new entries - typename widget + CCaInnerEntry *innerEntry = CCaInnerEntry::NewLC(); + innerEntry->SetTextL(KTestName1); + innerEntry->SetEntryTypeNameL(KTypeNameWidget); + innerEntry->SetFlags(flag); + innerEntry->SetRole(CCaInnerQuery::Item); + mStorage->AddL(innerEntry); + CleanupStack::PopAndDestroy(innerEntry); + + innerEntry = CCaInnerEntry::NewLC(); + innerEntry->SetTextL(KTestName2); + innerEntry->SetEntryTypeNameL(KTypeNameWidget); + innerEntry->SetFlags(flag); + innerEntry->SetRole(CCaInnerQuery::Item); + mStorage->AddL(innerEntry); + CleanupStack::PopAndDestroy(innerEntry); + + + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + CDesC16ArrayFlat *typenameArray = new(ELeave) CDesC16ArrayFlat(KDefaultGranularity); + CleanupStack::PushL(typenameArray); + + TBufC<20> typeName(KTypeNameWidget); + typenameArray->AppendL(typeName); + + innerQuery->SetEntryTypeNames(typenameArray); + CleanupStack::Pop(typenameArray); + + // get entries from specific group + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + + + // get entries - widgets + mStorage->GetEntriesL(innerQuery,resultArray); + + numberOfWidgetsFound = resultArray.Count(); + // check results + for (TInt i = 0; i < numberOfWidgetsFound; ++i) { + if ((resultArray[i]->GetEntryTypeName()).Compare( + KTypeNameWidget) != 0) { + nonWidgetEntryFound = true; + } + } + + CleanupStack::PopAndDestroy(&resultArray); + CleanupStack::PopAndDestroy(innerQuery); + ); + __UHEAP_MARKEND; + + QCOMPARE(err, KErrNone); + QCOMPARE(numberOfWidgetsFound, expectedNumberOfWidgets); + QVERIFY(!nonWidgetEntryFound); +} + +// --------------------------------------------------------------------------- +// Test Select entries sorted by name alphabetically. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesSortByName() +{ + __UHEAP_MARK; + { + TInt entriesACount(0); + QMap comparisonAResults; + TInt entriesBCount(0); + QMap comparisonBResults; + bool orderCheckPassed(false); + + TRAPD(err, + // test ascending + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + innerQuery->SetSort(CCaInnerQuery::Name); + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + mStorage->GetEntriesL(innerQuery,resultArray); + + // change all odd entries texts to be lower case + for (TInt i = 0; i < resultArray.Count(); ++i) { + if (resultArray[i]->GetId() % 2 == 1) { + RBuf tempBuf; + tempBuf.CleanupClosePushL(); + tempBuf.CreateL(resultArray[i]->GetText()); + tempBuf.LowerCase(); + resultArray[i]->SetTextL(tempBuf); + CleanupStack::PopAndDestroy(&tempBuf); + mStorage->AddL(resultArray[i]); + } + } + // fetch the table again + resultArray.ResetAndDestroy(); + mStorage->GetEntriesL(innerQuery,resultArray); + + entriesACount = resultArray.Count(); + + RBuf previousText; + previousText.CleanupClosePushL(); + RBuf currentText; + currentText.CleanupClosePushL(); + if (!err) { + for (TInt i = 0; i < resultArray.Count(); i++) { + currentText.CreateL(resultArray[i]->GetText()); + currentText.LowerCase(); + + comparisonAResults[descToQString(currentText)] = true; + + if (i!=0 && currentText.Compare(previousText) < 0) { + comparisonAResults[descToQString(currentText)] = false; + err = KErrWrongData; + break; + } + currentText.Close(); + previousText.Close(); + previousText.CreateL(resultArray[i]->GetText()); + previousText.LowerCase(); + } + } + // test descending + CCaInnerQuery *innerQuery2 = CCaInnerQuery::NewLC(); + innerQuery2->SetSort(CCaInnerQuery::NameDesc); + RPointerArray resultArrayDesc; + CleanupResetAndDestroyPushL(resultArrayDesc); + mStorage->GetEntriesL(innerQuery2,resultArrayDesc); + + entriesBCount = resultArrayDesc.Count(); + + previousText.Close(); + currentText.Close(); + + if (!err) { + for (TInt i = 0; i < resultArrayDesc.Count(); i++) { + currentText.CreateL(resultArrayDesc[i]->GetText()); + currentText.LowerCase(); + + comparisonBResults[descToQString(currentText)] = true; + + if (i!=0 && resultArrayDesc[i]->GetText().Compare(previousText) > 0) { + comparisonBResults[descToQString(currentText)] = false; + break; + } + currentText.Close(); + previousText.Close(); + previousText.CreateL(resultArrayDesc[i]->GetText()); + previousText.LowerCase(); + } + } + + if (!err) { + orderCheckPassed = verifyOppositeOrder(resultArray, resultArrayDesc) == 0; + } + + CleanupStack::PopAndDestroy(&resultArrayDesc); + CleanupStack::PopAndDestroy(innerQuery2); + CleanupStack::PopAndDestroy(¤tText); + CleanupStack::PopAndDestroy(&previousText); + CleanupStack::PopAndDestroy(&resultArray); + CleanupStack::PopAndDestroy(innerQuery); + ); + + QCOMPARE(err, KErrNone); + foreach(QString str, comparisonAResults.keys()) { + QVERIFY2(comparisonAResults[str], str.toUtf8()); + }; + QCOMPARE(comparisonAResults.size(), entriesACount); + + + foreach(QString str, comparisonAResults.keys()) { + QVERIFY2(comparisonBResults[str], str.toUtf8()); + }; + QCOMPARE(comparisonBResults.size(), entriesBCount); + + QVERIFY(orderCheckPassed); + } + __UHEAP_MARKEND; +} + +// --------------------------------------------------------------------------- +// tests getentries sorted by created timestamp ascending. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesSortByCreatedTimestamp() +{ + + __UHEAP_MARK; + { + QMap ascendingOrderCheckResults; + QMap descendingOrderCheckResults; + + TRAPD(err, + // check ascending + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + innerQuery->SetSort(CCaInnerQuery::CreatedTimestamp); + mStorage->GetEntriesL(innerQuery,resultArray); + CleanupStack::PopAndDestroy(innerQuery); + + TInt64 previousTimestamp(0); + for (TInt i = 0; i ids; + CleanupClosePushL(ids); + const TInt id = resultArray[i]->GetId(); + ids.AppendL(id); + innerQuery->SetIdsL(ids); + + TInt64 timestamp(0); + CCaSqlQuery *query = CCaSqlQuery::NewLC(STATIC_CAST(CCaSqLiteStorage *,mStorage)->iSqlDb); + query->SetQueryL(KSQLGetEntryTimestamp); + query->PrepareL(); + query->BindIdsL(ids, KSQLEntryId); + query->ExecuteL(timestamp); + + if (i != 0 && timestamp < previousTimestamp) { + ascendingOrderCheckResults[id] = false; + break; + } + previousTimestamp = timestamp; + CleanupStack::PopAndDestroy(query); + CleanupStack::PopAndDestroy(&ids); + CleanupStack::PopAndDestroy(innerQuery); + } + + CleanupStack::PopAndDestroy(&resultArray); + + // check descending + CleanupResetAndDestroyPushL(resultArray); + innerQuery = CCaInnerQuery::NewLC(); + innerQuery->SetSort(CCaInnerQuery::CreatedTimestampDesc); + mStorage->GetEntriesL(innerQuery,resultArray); + CleanupStack::PopAndDestroy(innerQuery); + + previousTimestamp = 0; + for (TInt i = 0; i ids; + CleanupClosePushL(ids); + ids.AppendL(resultArray[i]->GetId()); + const TInt id = ids[0]; + innerQuery->SetIdsL(ids); + + TInt64 timestamp(0); + CCaSqlQuery *query = CCaSqlQuery::NewLC(STATIC_CAST(CCaSqLiteStorage *,mStorage)->iSqlDb); + query->SetQueryL(KSQLGetEntryTimestamp); + query->PrepareL(); + query->BindIdsL(ids, KSQLEntryId); + query->ExecuteL(timestamp); + if (i != 0 && timestamp > previousTimestamp) { + descendingOrderCheckResults[id] = false; + break; + } + previousTimestamp = timestamp; + CleanupStack::PopAndDestroy(query); + CleanupStack::PopAndDestroy(&ids); + CleanupStack::PopAndDestroy(innerQuery); + } + + CleanupStack::PopAndDestroy(&resultArray); + ); + + + QCOMPARE(err, KErrNone); + QCOMPARE(ascendingOrderCheckResults.size(), 0); + QCOMPARE(descendingOrderCheckResults.size(), 0); + } + __UHEAP_MARKEND; +} + +// --------------------------------------------------------------------------- +// tests getentries sorted by used timestamp. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesSortByMostUsedTimestamp() +{ + __UHEAP_MARK; + + const TInt mostUsedIds[3] = {14, 9, 2}; + + const TInt mostUsedIdsSize = sizeof(mostUsedIds) / sizeof(TInt); + + TInt err(KErrNone); + + TRAP(err, + + for (TInt i = 0; i < mostUsedIdsSize; ++i) { + for (TInt j = mostUsedIdsSize - i; j >= 0; --j) { + mStorage->TouchL(mostUsedIds[i], ETrue); + } + } + + CCaInnerQuery *innerQuery1 = CCaInnerQuery::NewLC(); + innerQuery1->SetSort(CCaInnerQuery::MostUsedDesc); + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + + + // get entries - most used desscending + mStorage->GetEntriesL(innerQuery1, resultArray); + + if (resultArray.Count() < mostUsedIdsSize) { + err = KErrNotFound; +} else { + for (TInt i = 0; i < mostUsedIdsSize; ++i) { + if (resultArray[i]->GetId() != mostUsedIds[i]) { + err = KErrGeneral; + break; + } + } + } + + CleanupStack::PopAndDestroy(&resultArray); + CleanupStack::PopAndDestroy(innerQuery1); + ); + + QCOMPARE(err, KErrNone); + + + TRAP(err, + CCaInnerQuery *innerQuery1 = CCaInnerQuery::NewLC(); + innerQuery1->SetSort(CCaInnerQuery::MostUsed); + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + + + // get entries - most used desscending + mStorage->GetEntriesL(innerQuery1, resultArray); + + const TInt resultCount = resultArray.Count(); + + if (resultCount < mostUsedIdsSize) { + err = KErrNotFound; +} else { + for (TInt i = 0; i < mostUsedIdsSize; ++i) { + if (resultArray[resultCount - i - 1]->GetId() != mostUsedIds[i]) { + err = KErrGeneral; + break; + } + } + } + CleanupStack::PopAndDestroy(&resultArray); + CleanupStack::PopAndDestroy(innerQuery1); + ); + __UHEAP_MARKEND; + + +} + + +// --------------------------------------------------------------------------- +// tests getentries sorted by used timestamp ascending. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesSortByLastUsedTimestamp() +{ + __UHEAP_MARK; + + const TInt lastUsedIds[3] = {14, 9, 2}; + + const TInt lastUsedIdsSize = sizeof(lastUsedIds) / sizeof(TInt); + + TInt err(KErrNone); + + TRAP(err, + + for (TInt i = lastUsedIdsSize - 1; i >= 0 ; --i) { + mStorage->TouchL(lastUsedIds[i], EFalse); + } + + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + innerQuery->SetSort(CCaInnerQuery::LastUsedDesc); + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + + + // get entries - last used descending + mStorage->GetEntriesL(innerQuery, resultArray); + + + if (resultArray.Count() < lastUsedIdsSize) { + err = KErrNotFound; +} else { + for (TInt i = 0; i < lastUsedIdsSize; ++i) { + if (resultArray[i]->GetId() != lastUsedIds[i]) { + err = KErrGeneral; + break; + } + } + } + + CleanupStack::PopAndDestroy(&resultArray); + CleanupStack::PopAndDestroy(innerQuery); + ); + + + QCOMPARE(err, KErrNone); + + TRAP(err, + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + innerQuery->SetSort(CCaInnerQuery::LastUsed); + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + + + // get entries - last used descending + mStorage->GetEntriesL(innerQuery, resultArray); + + const TInt resultCount = resultArray.Count(); + + if (resultCount < lastUsedIdsSize) { + err = KErrNotFound; +} else { + for (TInt i = 0; i < lastUsedIdsSize; ++i) { + if (resultArray[resultCount - 1 - i]->GetId() != + lastUsedIds[i]) { + err = KErrGeneral; + break; + } + } + } + + + CleanupStack::PopAndDestroy(&resultArray); + CleanupStack::PopAndDestroy(innerQuery); + ); + + __UHEAP_MARKEND; +} + +// --------------------------------------------------------------------------- +// tests getentries sorted by default ascending. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesSortByDefault() +{ + + __UHEAP_MARK; + + TRAPD(err, + + CCaSqlQuery *query = CCaSqlQuery::NewLC(((CCaSqLiteStorage *)mStorage)->iSqlDb); + query->SetQueryL(KSQLGetIdEntryFromSpecificGroup); + query->PrepareL(); + query->BindIntL(query->iStatement.ParameterIndex(KSQLGEIdGroup), KAllCollectionsGroupId); + RArray resultHelpArray; + CleanupClosePushL(resultHelpArray); + query->ExecuteL(resultHelpArray, CCaSqlQuery::EEntryTable); + query->CloseStatement(); + + CCaInnerQuery *innerQuery1 = CCaInnerQuery::NewLC(); + innerQuery1->SetSort(CCaInnerQuery::Default); + innerQuery1->SetParentId(KAllCollectionsGroupId); + + CCaInnerQuery *innerQuery2 = CCaInnerQuery::NewLC(); + innerQuery2->SetSort(CCaInnerQuery::DefaultDesc); + innerQuery2->SetParentId(KAllCollectionsGroupId); + + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + + // get entries - bu default from group + mStorage->GetEntriesL(innerQuery1, resultArray); + + // check results - compare Entry_Id + for (TInt i=0; iGetId() != resultHelpArray[i]) { + err = KErrWrongData; + } + } + + if (!err) { + err = testSortingBySortOrder(innerQuery1, innerQuery2); + } + + // clear after test + CleanupStack::PopAndDestroy(&resultArray); + CleanupStack::PopAndDestroy(innerQuery2); + CleanupStack::PopAndDestroy(innerQuery1); + CleanupStack::PopAndDestroy(&resultHelpArray); + CleanupStack::PopAndDestroy(query); + ); + + __UHEAP_MARKEND; + + QCOMPARE(err, KErrNone); +} + + +// --------------------------------------------------------------------------- +// tests getentries sorted by used timestamp ascending. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesByFlags() +{ + + __UHEAP_MARK; + + TRAPD(err, + + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); +// test all flags on in KMaxFlagsMask range + for (TUint flagsOnMask = 0; flagsOnMask <= KMaxFlagsMask; flagsOnMask++) { + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + innerQuery->SetFlagsOn(flagsOnMask); + mStorage->GetEntriesL(innerQuery,resultArray); + TInt entryCount = resultArray.Count(); + if (entryCount > 0) { + for (TInt j = 0; j < entryCount; j++) { + if (resultArray[j]->GetFlags() & flagsOnMask != flagsOnMask) { + err = KErrWrongData; + } + } + } + innerQuery->SetFlagsOn(0); + CleanupStack::PopAndDestroy(&resultArray); + } + +// test all flags off in KMaxFlagsMask range + for (TUint flagsOffMask = 0; flagsOffMask <= KMaxFlagsMask; flagsOffMask++) { + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + innerQuery->SetFlagsOff(flagsOffMask); + mStorage->GetEntriesL(innerQuery,resultArray); + TInt entryCount = resultArray.Count(); + if (entryCount > 0) { + for (TInt j = 0; j < entryCount; j++) { + if ((!resultArray[j]->GetFlags()) & flagsOffMask != flagsOffMask) { + err = KErrWrongData; + } + } + } + innerQuery->SetFlagsOff(0); + CleanupStack::PopAndDestroy(&resultArray); + } + +// test combination of flags on flags off + for (TUint flagsOnMask = 0; flagsOnMask <= KMaxFlagsMaskForCombinedTest; flagsOnMask++) { + for (TUint flagsOffMask = 0; flagsOffMask + <= KMaxFlagsMaskForCombinedTest; flagsOffMask++) { + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + innerQuery->SetFlagsOff(flagsOffMask); + innerQuery->SetFlagsOn(flagsOnMask); + mStorage->GetEntriesL(innerQuery,resultArray); + TInt entryCount = resultArray.Count(); + if (entryCount > 0) { + for (TInt j = 0; j < entryCount; j++) { + if ((!resultArray[j]->GetFlags()) & flagsOffMask != flagsOffMask + && resultArray[j]->GetFlags() & flagsOnMask != flagsOnMask) { + err = KErrWrongData; + } + } + } + innerQuery->SetFlagsOff(0); + innerQuery->SetFlagsOn(0); + CleanupStack::PopAndDestroy(&resultArray); + } + } + + CleanupStack::PopAndDestroy(innerQuery); + ); + + __UHEAP_MARKEND; + + QCOMPARE(err, KErrNone); +} + +// --------------------------------------------------------------------------- +// tests getentries with flags which are on +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesByFlagsOn() +{ + + __UHEAP_MARK; + TRAPD(err, + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + RPointerArray resultArrayTemp; + CleanupResetAndDestroyPushL(resultArrayTemp); + RArray testEntries; + CleanupClosePushL(testEntries); + + mStorage->GetEntriesL(innerQuery,resultArrayTemp); + + TInt entryCount = resultArrayTemp.Count(); + + // Change five random elements' flags + err = (entryCount >= 5) ? err : KErrNoData; + // Set all flags on to test flags on. + for (TInt i = 0; i < entryCount; i++) { + resultArrayTemp[i]->SetFlags(0); + mStorage->AddL(resultArrayTemp[i]); + } + + // get random entries to test on + TInt testIdCount(0); + while (testEntries.Count() < 5) { + TInt randomEntryInArray = Math::Random() % entryCount; + TBool exists(EFalse); + for (TInt i = 0; i < testEntries.Count(); i++) { + if (testEntries[i]== randomEntryInArray) { + exists = ETrue; + break; + } + } + if (!exists) { + testEntries.AppendL(randomEntryInArray); + } + } + + // test flags on with flags from KFlagsOnTable + + CCaInnerQuery *innerQueryFlagsOn = CCaInnerQuery::NewLC(); + for (TInt j = 0; j < 5; j++) { + // fill database with flag + for (TInt i = 0; i < 5; i++) { + TInt x = testEntries[i]; + resultArrayTemp[x]->SetFlags(KFlagsOnTable[j]); + mStorage->AddL(resultArrayTemp[x]); + } + + // check filled database + RPointerArray resultArrayFlagsOn; + CleanupResetAndDestroyPushL(resultArrayFlagsOn); + innerQueryFlagsOn->SetFlagsOn(KFlagsOnTable[j]); + mStorage->GetEntriesL(innerQueryFlagsOn,resultArrayFlagsOn); + TInt count = resultArrayFlagsOn.Count(); + err = (resultArrayFlagsOn.Count() >= 5) ? err : KErrWrongData; + + // check that the right entries were fetched + for (TInt i = 0; i < 5; i++) { + for (TInt j = 0; j < resultArrayFlagsOn.Count(); j++) { + if (resultArrayFlagsOn[j]->GetId() == + resultArrayTemp[testEntries[i]]->GetId()) { + break; + } else if (j == resultArrayFlagsOn.Count()-1) { + err = KErrWrongData; + } + } + } + + CleanupStack::PopAndDestroy(&resultArrayFlagsOn); + } + CleanupStack::PopAndDestroy(innerQueryFlagsOn); + CleanupStack::PopAndDestroy(&testEntries); + CleanupStack::PopAndDestroy(&resultArrayTemp); + CleanupStack::PopAndDestroy(innerQuery); + ); + __UHEAP_MARKEND; + + QCOMPARE(err, KErrNone); +} + + +// --------------------------------------------------------------------------- +// tests getentries with flags which are off +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesByFlagsOff() +{ + __UHEAP_MARK; + TRAPD(err, + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + RPointerArray resultArrayTemp; + CleanupResetAndDestroyPushL(resultArrayTemp); + RArray testEntries; + CleanupClosePushL(testEntries); + + mStorage->GetEntriesL(innerQuery,resultArrayTemp); + + TInt entryCount = resultArrayTemp.Count(); + + // Change five random elements' flags + err = (entryCount >= 5) ? err : KErrNoData; + // Set all flags off to test flags off assuming that there are 5 flags (63 bitwise) + for (TInt i = 0; i < entryCount; i++) { + resultArrayTemp[i]->SetFlags(63); + mStorage->AddL(resultArrayTemp[i]); + } + + // get random entries to test on + TInt testIdCount(0); + while (testEntries.Count() < 5) { + TInt randomEntryInArray = Math::Random() % entryCount; + TBool exists(EFalse); + for (TInt i = 0; i < testEntries.Count(); i++) { + if (testEntries[i]== randomEntryInArray) { + exists = ETrue; + break; + } + } + if (!exists) { + testEntries.AppendL(randomEntryInArray); + } + } + + // test flags on with flags from KFlagsOffTable + + CCaInnerQuery *innerQueryFlagsOff = CCaInnerQuery::NewLC(); + for (TInt j = 0; j < 5; j++) { + // fill database with flag + for (TInt i = 0; i < 5; i++) { + TInt x = testEntries[i]; + resultArrayTemp[x]->SetFlags(KFlagsOffTable[j]); + mStorage->AddL(resultArrayTemp[x]); + } + + // check filled database + RPointerArray resultArrayFlagsOff; + CleanupResetAndDestroyPushL(resultArrayFlagsOff); + innerQueryFlagsOff->SetFlagsOff(KFlagsOffTableMasks[j]); + mStorage->GetEntriesL(innerQueryFlagsOff,resultArrayFlagsOff); + TInt count = resultArrayFlagsOff.Count(); + err = (resultArrayFlagsOff.Count() >= 5) ? err : KErrWrongData; + + // check that the right entries were fetched + for (TInt i = 0; i < 5; i++) { + for (TInt j = 0; j < resultArrayFlagsOff.Count(); j++) { + if (resultArrayFlagsOff[j]->GetId() == + resultArrayTemp[testEntries[i]]->GetId()) { + break; + } else if (j == resultArrayFlagsOff.Count()-1) { + err = KErrWrongData; + } + } + } + + CleanupStack::PopAndDestroy(&resultArrayFlagsOff); + } + CleanupStack::PopAndDestroy(innerQueryFlagsOff); + CleanupStack::PopAndDestroy(&testEntries); + CleanupStack::PopAndDestroy(&resultArrayTemp); + CleanupStack::PopAndDestroy(innerQuery); + ); + __UHEAP_MARKEND; + QCOMPARE(err, KErrNone); +} + + +// --------------------------------------------------------------------------- +// tests getentries by uid. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesByUid() +{ + __UHEAP_MARK; + TRAPD(err, + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + innerQuery->SetUid(KCalendarAppUid); + + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + + mStorage->GetEntriesL(innerQuery,resultArray); + + TInt entryCount = resultArray.Count(); + + err = (entryCount == 1 && resultArray[0]->GetUid() == KCalendarAppUid) + ? err : KErrWrongData; + + CleanupStack::PopAndDestroy(&resultArray); + CleanupStack::PopAndDestroy(innerQuery); + ); + __UHEAP_MARKEND; + + QCOMPARE(err, KErrNone); +} + +// --------------------------------------------------------------------------- +// tests getentries by uid. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesIds() +{ + __UHEAP_MARK; + + TRAPD(err, + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + RArray idArray; + CleanupClosePushL(idArray); + + mStorage->GetEntriesIdsL(innerQuery,idArray); + + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + + mStorage->GetEntriesL(innerQuery,resultArray); + + err = (idArray.Count() > 0) ? err : KErrNoData; + if (!err) { + err = (idArray.Count() == resultArray.Count()) ? err : KErrWrongData; + } + + CleanupStack::PopAndDestroy(&resultArray); + CleanupStack::PopAndDestroy(&idArray); + CleanupStack::PopAndDestroy(innerQuery); + ); + __UHEAP_MARKEND; + + QCOMPARE(err, KErrNone); +} + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetNewEntryWithAttributes() +{ + __UHEAP_MARK; + TInt err(KErrGeneral); + TRAP(err, + // Check database entries count + CCaSqlQuery *query = CCaSqlQuery::NewLC(((CCaSqLiteStorage *)mStorage)->iSqlDb); + query->SetQueryL(KSQLGetIdCountFromEntryTable); + query->PrepareL(); + TInt entriesCount(0); + query->ExecuteL(entriesCount); + CleanupStack::PopAndDestroy(query); + + + // add new entry with attributes + CCaInnerEntry *innerEntry = CCaInnerEntry::NewL(); + RPointerArray innerEntryArray; + CleanupResetAndDestroyPushL(innerEntryArray); + innerEntryArray.AppendL(innerEntry); + + innerEntry->SetTextL(KTestName); + innerEntry->SetEntryTypeNameL(KTypeName); + innerEntry->SetFlags(flag); + innerEntry->SetRole(CCaInnerQuery::Item); + innerEntry->SetIconDataL(_L("filename"), _L("skinId"), _L("268458321")); + + innerEntry->AddAttributeL(KAttrName_1, KAttrValue_1); + innerEntry->AddAttributeL(KAttrName_2, KAttrValue_2); + innerEntry->AddAttributeL(KAttrName_3, KAttrValue_3); + + mStorage->AddL(innerEntry); + CleanupStack::PopAndDestroy(&innerEntryArray); + + + // get new entry with attributes + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + RArray idArray; + CleanupClosePushL(idArray); + idArray.AppendL(entriesCount + 1); // new entry + + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + innerQuery->SetIdsL(idArray); + + mStorage->GetEntriesL(innerQuery, resultArray); + + // check results + TInt attributesCount = resultArray[0]->GetAttributes().Count(); + + if (attributesCount == 3) { + err = KErrNone; +} else { + err = KErrGeneral; +} + +// clear after test +CleanupStack::PopAndDestroy(innerQuery); +CleanupStack::PopAndDestroy(&idArray); +CleanupStack::PopAndDestroy(&resultArray); + ); + + __UHEAP_MARKEND; + + QCOMPARE(err, KErrNone); +} + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetNewEntryWithAttributesByUid() +{ + __UHEAP_MARK; + + TInt err(KErrGeneral); + + TRAP(err, + // add new entry with attributes + CCaInnerEntry *innerEntry = CCaInnerEntry::NewL(); + RPointerArray innerEntryArray; + CleanupResetAndDestroyPushL(innerEntryArray); + innerEntryArray.AppendL(innerEntry); + + innerEntry->SetTextL(KTestName); + innerEntry->SetEntryTypeNameL(KTypeName2); + innerEntry->SetFlags(flag); + innerEntry->SetRole(CCaInnerQuery::Item); + innerEntry->SetUid(KTestAppUid); + innerEntry->SetIconDataL(_L("filename"), _L("skinId"), _L("268458321")); + + innerEntry->AddAttributeL(KAttrName_1, KAttrValue_1); + innerEntry->AddAttributeL(KAttrName_2, KAttrValue_2); + innerEntry->AddAttributeL(KAttrName_3, KAttrValue_3); + + mStorage->AddL(innerEntry); + CleanupStack::PopAndDestroy(&innerEntryArray); + + + // get new entry with attributes by uid + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + innerQuery->SetUid(KTestAppUid); + + mStorage->GetEntriesL(innerQuery, resultArray); + + // check results + TInt attributesCount = resultArray[0]->GetAttributes().Count(); + + if (attributesCount == 3) { + err = KErrNone; +} else { + err = KErrGeneral; +} + +// clear after test +CleanupStack::PopAndDestroy(innerQuery); +CleanupStack::PopAndDestroy(&resultArray); + ); + __UHEAP_MARKEND; + + QCOMPARE(err, KErrNone); +} + +// --------------------------------------------------------------------------- +// Test Select entries with limit. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesWhenLimitSetTo() +{ + + + QList entryCountList; + entryCountList << 5 << -15 << 0 << 50; + __UHEAP_MARK; + + int limit(0); + foreach(limit, entryCountList) { + // Check database entries count + TRAPD(err, + CCaSqlQuery *query = CCaSqlQuery::NewLC(((CCaSqLiteStorage *)mStorage)->iSqlDb); + query->SetQueryL(KSQLGetIdCountFromEntryTable); + query->PrepareL(); + TInt entriesCount(0); + query->ExecuteL(entriesCount); + CleanupStack::PopAndDestroy(query); + + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + + innerQuery->SetCount(limit); + + // limit is set to stif parser param + mStorage->GetEntriesL(innerQuery, resultArray); + + + // check results + if ((0 < limit) && (limit <= entriesCount)) { + if (resultArray.Count() == innerQuery->GetCount()) { + err = KErrNone; + } else { + err = KErrGeneral; + } + } else { + if (resultArray.Count() == entriesCount) { + err = KErrNone; + } else { + err = KErrGeneral; + } + } + + // clear after test + CleanupStack::PopAndDestroy(innerQuery); + CleanupStack::PopAndDestroy(&resultArray); + ); + // limit added to make easier to identify where failure occured + QCOMPARE(err + limit, KErrNone + limit); + } + __UHEAP_MARKEND; +} + +// --------------------------------------------------------------------------- +// Test Select entries by role. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesByRole() +{ + + + __UHEAP_MARK; + TRAPD(err, + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + + RPointerArray resultArrayGroups; + CleanupResetAndDestroyPushL(resultArrayGroups); + innerQuery->SetRole(CCaInnerQuery::Group); + mStorage->GetEntriesL(innerQuery, resultArrayGroups); + TInt groupsCount = resultArrayGroups.Count(); + CleanupStack::PopAndDestroy(&resultArrayGroups); + + RPointerArray resultArrayItems; + CleanupResetAndDestroyPushL(resultArrayItems); + innerQuery->SetRole(CCaInnerQuery::Item); + mStorage->GetEntriesL(innerQuery, resultArrayItems); + TInt itemsCount = resultArrayItems.Count(); +// changes the role of two items to be groups + + resultArrayItems[0]->SetRole(CCaInnerQuery::Group); + resultArrayItems[1]->SetRole(CCaInnerQuery::Group); + TInt entry1Id = resultArrayItems[0]->GetId(); + TInt entry2Id = resultArrayItems[1]->GetId(); + mStorage->AddL(resultArrayItems[0]); + mStorage->AddL(resultArrayItems[1]); + CleanupStack::PopAndDestroy(&resultArrayItems); + + RPointerArray resultArrayGroups2; + CleanupResetAndDestroyPushL(resultArrayGroups2); + innerQuery->SetRole(CCaInnerQuery::Group); + mStorage->GetEntriesL(innerQuery, resultArrayGroups2); + TInt groupsCountAfterModifyRole = resultArrayGroups2.Count(); + err = (groupsCountAfterModifyRole == groupsCount + 2)? err : KErrWrongData; + +// Check that entry 1 is now group + for (TInt i = 0; i < groupsCountAfterModifyRole; i++) { + if (resultArrayGroups2[i]->GetId() == entry1Id) { + break; + } else if (i == groupsCountAfterModifyRole - 1) { + err = KErrWrongData; + } + } + +// Check that entry 2 is now group + for (TInt i = 0; i < groupsCountAfterModifyRole; i++) { + if (resultArrayGroups2[i]->GetId() == entry2Id) { + break; + } else if (i == groupsCountAfterModifyRole - 1) { + err = KErrWrongData; + } + } + + CleanupStack::PopAndDestroy(&resultArrayGroups2); + + RPointerArray resultArrayItems2; + CleanupResetAndDestroyPushL(resultArrayItems2); + innerQuery->SetRole(CCaInnerQuery::Item); + mStorage->GetEntriesL(innerQuery, resultArrayItems2); + TInt itemsCountAfterModifyRole = resultArrayItems2.Count(); + err = (itemsCountAfterModifyRole == itemsCount - 2)? err : KErrWrongData; + CleanupStack::PopAndDestroy(&resultArrayItems2); + + CleanupStack::PopAndDestroy(innerQuery); + ); + __UHEAP_MARKEND; + + QCOMPARE(err, KErrNone); +} + +void CCAStorageTest::testGetEntriesByAttributes() +{ + __UHEAP_MARK; + int uid; + TInt attributesCount; + TInt attributesCountFromQuery; + TRAPD(err, + + // add new entry with attributes + CCaInnerEntry *innerEntry = CCaInnerEntry::NewLC(); + + innerEntry->SetTextL(KTestName); + innerEntry->SetEntryTypeNameL(KTypeName2); + innerEntry->SetFlags(flag); + innerEntry->SetRole(CCaInnerQuery::Item); + innerEntry->SetUid(KTestAppUid); + innerEntry->SetIconDataL(_L("filename"), _L("skinId"), _L("268458321")); + + innerEntry->AddAttributeL(KAttrName_1, KAttrValue_1); + innerEntry->AddAttributeL(KAttrName_2, KAttrValue_2); + innerEntry->AddAttributeL(KAttrName_3, KAttrValue_3); + + mStorage->AddL(innerEntry); + + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + innerQuery->AddAttributeL(KAttrName_2, KAttrValue_2); + innerQuery->AddAttributeL(KAttrName_3, KAttrValue_3); + attributesCountFromQuery = innerQuery->GetAttributes().Count(); + + // get entries by attributes + RPointerArray resultArrayItems; + CleanupResetAndDestroyPushL(resultArrayItems); + mStorage->GetEntriesL(innerQuery, resultArrayItems); + + if( resultArrayItems.Count() ) + { + uid = resultArrayItems[0]->GetUid(); + attributesCount = resultArrayItems[0]->GetAttributes().Count(); + } + + CleanupStack::PopAndDestroy(&resultArrayItems); + CleanupStack::PopAndDestroy(innerQuery); + CleanupStack::PopAndDestroy(innerEntry); + ); + __UHEAP_MARKEND; + + QCOMPARE(uid, KTestAppUid); + QCOMPARE((attributesCount-1), attributesCountFromQuery); + QCOMPARE(err, KErrNone); +} + +void CCAStorageTest::testGetEntriesByAttributes2() +{ + __UHEAP_MARK; + int getEntriesCount; + TRAPD(err, + + // add new entry with attributes + CCaInnerEntry *innerEntry = CCaInnerEntry::NewLC(); + + innerEntry->SetTextL(KTestName); + innerEntry->SetEntryTypeNameL(KTypeName2); + innerEntry->SetFlags(flag); + innerEntry->SetRole(CCaInnerQuery::Item); + innerEntry->SetUid(KTestAppUid); + innerEntry->SetIconDataL(_L("filename"), _L("skinId"), _L("268458321")); + + innerEntry->AddAttributeL(KAttrName_1, KAttrValue_1); + innerEntry->AddAttributeL(KAttrName_2, KAttrValue_2); + innerEntry->AddAttributeL(KAttrName_3, KAttrValue_3); + + mStorage->AddL(innerEntry); + + // add new entry with attributes + CCaInnerEntry *innerEntry2 = CCaInnerEntry::NewLC(); + + innerEntry2->SetTextL(KTestName2); + innerEntry2->SetEntryTypeNameL(KTypeName2); + innerEntry2->SetFlags(flag); + innerEntry2->SetRole(CCaInnerQuery::Item); + innerEntry2->SetUid(KTestAppUid2); + + // add new entry with attributes + innerEntry2->AddAttributeL(KAttrName_1, KAttrValue_1); + innerEntry2->AddAttributeL(KAttrName_2, KAttrValue_2); + + mStorage->AddL(innerEntry2); + + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + innerQuery->AddAttributeL(KAttrName_1, KAttrValue_1); + innerQuery->AddAttributeL(KAttrName_2, KAttrValue_2); + + // get entries by attributes + RPointerArray resultArrayItems; + CleanupResetAndDestroyPushL(resultArrayItems); + mStorage->GetEntriesL(innerQuery, resultArrayItems); + + TInt attributesCount = resultArrayItems[0]->GetAttributes().Count(); + getEntriesCount = resultArrayItems.Count(); + + CleanupStack::PopAndDestroy(&resultArrayItems); + CleanupStack::PopAndDestroy(innerQuery); + CleanupStack::PopAndDestroy(innerEntry2); + CleanupStack::PopAndDestroy(innerEntry); + ); + __UHEAP_MARKEND; + + QCOMPARE(getEntriesCount, 2); + QCOMPARE(err, KErrNone); +} + +// --------------------------------------------------------------------------- +// Test Select entries by child id. +// +// --------------------------------------------------------------------------- +// +void CCAStorageTest::testGetEntriesByChildId() +{ + TInt expectedGroupEntryCount(0); + TInt actualGroupEntryCount(0); + + __UHEAP_MARK; + + TRAPD(err, + CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC(); + + // check before test entries count in sfecific group + CCaSqlQuery *query = CCaSqlQuery::NewLC(((CCaSqLiteStorage *)mStorage)->iSqlDb); + query->SetQueryL(KSQLGetEntriesCountAsParentsForSpecificEntry); + query->PrepareL(); + query->BindIntL(query->iStatement.ParameterIndex(KSQLGEEntryId), 7); + + query->ExecuteL(expectedGroupEntryCount); + + CleanupStack::PopAndDestroy(query); + + innerQuery->SetChildId(7); + + // get entries from specific group + RPointerArray resultArray; + CleanupResetAndDestroyPushL(resultArray); + + mStorage->GetEntriesL(innerQuery, resultArray); + + actualGroupEntryCount = resultArray.Count(); + + CleanupStack::PopAndDestroy(&resultArray); + CleanupStack::PopAndDestroy(innerQuery); + ); + + __UHEAP_MARKEND; + + QCOMPARE(err, KErrNone); + QCOMPARE(actualGroupEntryCount, expectedGroupEntryCount); +} +