diff -r 000000000000 -r 2e3d3ce01487 tzservices/tzserver/test/component/t_tzlocalizationdbcreationtests.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tzservices/tzserver/test/component/t_tzlocalizationdbcreationtests.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,473 @@ +// Copyright (c) 2008-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 +#include +#include +#include "testserver.h" +#include +#include + +// These literals are copied from the product code as we don't want to export them +_LIT(KTzLocalizationDbName, "c:TzLocalization.db"); +_LIT(KTzLocalizationDbSecurityPolicy,"secure[10206A8B]"); +_LIT(KlocDbStart_test_source, "z:\\testresourcefiles\\locDbStart_test.db"); +_LIT(KlocDbStart_test_destination, "c:\\private\\100012a5\\DBS_10206A8B_TzLocalization.db"); +_LIT(KTimeStamp, "c:\\private\\1020383e\\timestamps"); + +/** +This is a series of tests that check that the frequently used timezones table and +the user-defined cities table stored in the c:TzLocalization.db DBMS database are +created correctly when they don't exist, are corrupted or need to be upgraded from +an old format to a new format. +*/ +class CTzLocalizationDbCreationTests : public CBase + { +public: + static CTzLocalizationDbCreationTests* NewLC(RTest& aTest); + ~CTzLocalizationDbCreationTests(); + +private: + CTzLocalizationDbCreationTests(RTest& aTest); + void ConstructL(); + +public: + void RunL(); + +private: + void RunTzLocalizationDbSchemaUpgradeTestL(); + void RunTzLocalizationDbStartUpdateTestL(); + +private: + void CheckTzServerNotRunningL(); + void EnsureTzServerNotRunning(); + void EnsureAgendaServerNotRunning(); + void DeleteTzLocalizationDbL(); + void CreateTzLocalizationDbUsingOldSchemaL(); + void CreateFrequentlyUsedTimeZonesTableUsingOldSchemaL(RDbNamedDatabase& aDatabase); + void CreateUserAddedCitiesTableL(RDbNamedDatabase& aDatabase); + +private: + RTest& iTest; + RPIMTestServer iPIMTestServer; + RDbs iDbsSession; + }; + + +CTzLocalizationDbCreationTests* CTzLocalizationDbCreationTests::NewLC(RTest& aTest) + { + CTzLocalizationDbCreationTests* self = new(ELeave) CTzLocalizationDbCreationTests(aTest); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CTzLocalizationDbCreationTests::~CTzLocalizationDbCreationTests() + { + iDbsSession.Close(); + iPIMTestServer.Close(); + } + +CTzLocalizationDbCreationTests::CTzLocalizationDbCreationTests(RTest& aTest) + : iTest(aTest) + { + } + +void CTzLocalizationDbCreationTests::ConstructL() + { + User::LeaveIfError(iPIMTestServer.Connect()); + iPIMTestServer.CloseTzSession(); + User::LeaveIfError(iDbsSession.Connect()); + } + +void CTzLocalizationDbCreationTests::RunL() + { + _LIT(KTestName, "@SYMTestCaseID:PIM-APPSERV-tzlocalizationdbcreationtests-0001 TzLocalizationDbSchemaUpgradeTest"); + + iTest.Start(KTestName); + TRAPD(err, RunTzLocalizationDbSchemaUpgradeTestL()) + if (err != KErrNone) + { + _LIT(KErrorMsg, "RunTzLocalizationDbSchemaUpgradeTestL with error code: %d\n"); + iTest.Printf(KErrorMsg, err); + User::Leave(err); + } + + _LIT(KTestName1, "RunTzLocalizationDbStartUpdateTestL"); + + iTest.Next(KTestName1); + TRAP(err, RunTzLocalizationDbStartUpdateTestL()); + if (err != KErrNone) + { + _LIT(KErrorMsg1, "RunTzLocalizationDbStartUpdateTestL with error code: %d\n"); + iTest.Printf(KErrorMsg1, err); + User::Leave(err); + } + iTest.End(); + } + +void CTzLocalizationDbCreationTests::RunTzLocalizationDbSchemaUpgradeTestL() + { + // Delete the current database and replace it with an old version + DeleteTzLocalizationDbL(); + CreateTzLocalizationDbUsingOldSchemaL(); + + // Create a CTzLocalizer object and check that the database + // is upgraded correctly + CTzLocalizer* localizer = 0; + TRAPD(err, localizer = CTzLocalizer::NewL()); + if (err != KErrNone) + { + _LIT(KErrorMsg, "CTzLocalizer creation failed with error code: %d\n"); + iTest.Printf(KErrorMsg, err); + User::Leave(err); + } + delete localizer; + + // Creation of the CTzLocalizer should have caused a database upgrade + RDbNamedDatabase tzLocalizationDb; + User::LeaveIfError(tzLocalizationDb.Open(iDbsSession,KTzLocalizationDbName,KTzLocalizationDbSecurityPolicy)); + CleanupClosePushL(tzLocalizationDb); + RDbView zoneView; + CleanupClosePushL(zoneView); + _LIT(KReadZoneView,"SELECT * FROM FrequentlyUsedZones"); + User::LeaveIfError(zoneView.Prepare(tzLocalizationDb, TDbQuery(KReadZoneView), zoneView.EUpdatable)); + User::LeaveIfError(zoneView.EvaluateAll()); + zoneView.Reset(); + const TInt KExpectedNumberOfColumns = 9; + _LIT(KMsg1, "Expected number of columns: %d\n"); + iTest.Printf(KMsg1, KExpectedNumberOfColumns); + const TInt colCount = zoneView.ColCount(); + _LIT(KMsg2, "Actual number of columns: %d\n"); + iTest.Printf(KMsg2, colCount); + if (colCount != KExpectedNumberOfColumns) + { + iTest(EFalse); + } + CleanupStack::PopAndDestroy(&zoneView); + CleanupStack::PopAndDestroy(&tzLocalizationDb); + + // Cleanup database file + DeleteTzLocalizationDbL(); + } +/* Localization Database start up + * Verify that the localization database start-up copes well when it contains some + * time zone infomation whose Tz ID no longer exists in the TZ database. + */ +void CTzLocalizationDbCreationTests::RunTzLocalizationDbStartUpdateTestL() + { + //Make sure the Tz server is not running. + EnsureTzServerNotRunning(); + //Copy a localization DB contained few frequently used Tz zones which do not exist in the current Tz database. + iTest.Printf(_L("Copy test file DBS_10206A8B_TzLocalization.db")); + iPIMTestServer.CopyFileL(KlocDbStart_test_source ,KlocDbStart_test_destination); + iPIMTestServer.DeleteFileL(KTimeStamp); + + //Connect to the Tz server which result in the localization DB updating its tables. + iTest.Printf(_L("Connect to the Tz server")); + RTz tz; + CleanupClosePushL(tz); + User::LeaveIfError(tz.Connect()); + CTzId* tzid = tz.GetTimeZoneIdL(); + TUint id = tzid->TimeZoneNumericID(); + delete tzid; + + //Carry some basic operations which access to the localization DB. + iTest.Printf(_L("Access to the localization DB")); + CTzLocalizer* localizer = CTzLocalizer::NewL(); + CleanupStack::PushL(localizer); + + CTzLocalizedTimeZone* locTzId = localizer->GetFrequentlyUsedZoneL(CTzLocalizedTimeZone::ECurrentZone); + iTest (locTzId->TimeZoneId() == id); + delete locTzId; + + CTzLocalizedCity* locCity = localizer->GetFrequentlyUsedZoneCityL(CTzLocalizedTimeZone::ECurrentZone); + iTest (locCity->TimeZoneId() == id); + delete locCity; + + //Disconnect to the Tz server and delete the localization DB + CleanupStack::PopAndDestroy(2, &tz); + iPIMTestServer.DeleteFileL(KlocDbStart_test_destination); + } + +void CTzLocalizationDbCreationTests::CheckTzServerNotRunningL() + { + _LIT(KTzServerProcessPattern, "tzserver.exe*"); + TFindProcess finder(KTzServerProcessPattern); + TFileName foundName; + while (finder.Next(foundName) == KErrNone) + { + RProcess proc; + TInt err = proc.Open(foundName); + if (err == KErrNone) + { + if (proc.ExitType() == EExitPending) + { + _LIT(KErrorMsg, "TzServer must not be running\n"); + iTest.Printf(KErrorMsg); + User::Leave(KErrNotReady); + } + } + } + } + + +void CTzLocalizationDbCreationTests::EnsureAgendaServerNotRunning() + { + _LIT(KAgendaServerProcessPattern, "agsvexe.exe*"); + TFindProcess finder(KAgendaServerProcessPattern); + TFileName foundName; + while (finder.Next(foundName) == KErrNone) + { + RProcess proc; + TInt err = proc.Open(foundName); + if (err == KErrNone) + { + if (proc.ExitType() == EExitPending) + { + _LIT(KInfoMsg, "INFO: Agenda server must not be running - killing it now.\n"); + iTest.Printf(KInfoMsg); + TRAP_IGNORE(iPIMTestServer.KillProcessL(KAgendaServerProcessPattern)); + } + } + } + } + +void CTzLocalizationDbCreationTests::EnsureTzServerNotRunning() + { + _LIT(KTzServerProcessPattern, "tzserver.exe*"); + TFindProcess finder(KTzServerProcessPattern); + TFileName foundName; + while (finder.Next(foundName) == KErrNone) + { + RProcess proc; + TInt err = proc.Open(foundName); + if (err == KErrNone) + { + if (proc.ExitType() == EExitPending) + { + _LIT(KInfoMsg, "INFO: TzServer must not be running - killing it now.\n"); + iTest.Printf(KInfoMsg); + TRAP_IGNORE(iPIMTestServer.KillProcessL(KTzServerProcessPattern)); + } + } + } + } + +void CTzLocalizationDbCreationTests::DeleteTzLocalizationDbL() + { + EnsureAgendaServerNotRunning(); + EnsureTzServerNotRunning(); + + _LIT(KTzLocalizationDbFilePath, "c:\\private\\100012a5\\DBS_10206A8B_TzLocalization.db"); + TRAPD(err, iPIMTestServer.DeleteFileL(KTzLocalizationDbFilePath)); + if (err != KErrNone) + { + _LIT(KErrorMsg, "Database deletion failed with error code: %d\n"); + iTest.Printf(KErrorMsg, err); + User::Leave(err); + } + } + +void CTzLocalizationDbCreationTests::CreateTzLocalizationDbUsingOldSchemaL() + { + EnsureAgendaServerNotRunning(); + EnsureTzServerNotRunning(); + + RDbNamedDatabase tzLocalizationDb; + CleanupClosePushL(tzLocalizationDb); + TInt err = tzLocalizationDb.Create(iDbsSession, KTzLocalizationDbName, KTzLocalizationDbSecurityPolicy); + if (err != KErrNone) + { + _LIT(KErrorMsg, "Database creation failed with error code: %d\n"); + iTest.Printf(KErrorMsg, err); + User::Leave(err); + } + CreateFrequentlyUsedTimeZonesTableUsingOldSchemaL(tzLocalizationDb); + CreateUserAddedCitiesTableL(tzLocalizationDb); + CleanupStack::PopAndDestroy(&tzLocalizationDb); + } + +/** +This is mostly a copy/paste of CTzLocalizationDb::CreateFrequentlyUsedTimeZonesTableL() but +modified so that it creates a database without the city index column. +*/ +void CTzLocalizationDbCreationTests::CreateFrequentlyUsedTimeZonesTableUsingOldSchemaL(RDbNamedDatabase& aDatabase) + { + //Table and Column names for Cached Time Zone Table + //These text strings are never visible and do not need localizing + _LIT(KCZTableName, "FrequentlyUsedZones"); + _LIT(KCZTableTzIdCol, "TzId"); + _LIT(KCZTableStdCol, "StandardName"); + _LIT(KCZTableDSTCol, "DSTName"); + _LIT(KCZTableShortStdCol, "ShortStandardName"); + _LIT(KCZTableShortDSTCol, "ShortDSTName"); + _LIT(KCZTableCityCol, "City"); + _LIT(KCZTableCityGroupCol, "GroupId"); + _LIT(KCZTableResourceIdCol, "ResourceId"); + + // Create the columns for the cached zones table + RArray cachedTableCols; + CleanupClosePushL(cachedTableCols); + cachedTableCols.AppendL(TDbCol(KCZTableTzIdCol, EDbColUint16)); + cachedTableCols.AppendL(TDbCol(KCZTableStdCol, EDbColText)); + cachedTableCols.AppendL(TDbCol(KCZTableDSTCol, EDbColText)); + cachedTableCols.AppendL(TDbCol(KCZTableShortStdCol, EDbColText)); + cachedTableCols.AppendL(TDbCol(KCZTableShortDSTCol, EDbColText)); + cachedTableCols.AppendL(TDbCol(KCZTableCityCol, EDbColText)); + cachedTableCols.AppendL(TDbCol(KCZTableCityGroupCol, EDbColUint8)); + cachedTableCols.AppendL(TDbCol(KCZTableResourceIdCol, EDbColUint32)); + // We do not add the city index column as we want to create a database using + // the old schema + + // Create the columnset - add the columns + // Columns MUST be added in the same order they appear in TTzZoneColumn + CDbColSet* frequentlyUsedTimeZonesColSet = CDbColSet::NewLC(); + TInt numCols = cachedTableCols.Count(); + for(TInt i = 0; i < numCols; ++i) + { + frequentlyUsedTimeZonesColSet->AddL(cachedTableCols[i]); + } + + // Create the Cached Time Zone table + User::LeaveIfError(aDatabase.CreateTable(KCZTableName, *frequentlyUsedTimeZonesColSet)); + + //Open the newly created table + RDbView zoneView; + CleanupClosePushL(zoneView); + _LIT(KReadZoneView,"SELECT * FROM FrequentlyUsedZones"); + User::LeaveIfError(zoneView.Prepare(aDatabase, TDbQuery(KReadZoneView), zoneView.EUpdatable)); + User::LeaveIfError(zoneView.EvaluateAll()); + zoneView.Reset(); + //Populate with initial (blank) data. + + _LIT(KEmptyString," "); + + enum TTzOldSchemaZoneColumn + { + // Enum will used as a DB column index, so it must start at 1 + ETzZoneId = 1, + ETzZoneStdName, + ETzZoneDSTName, + ETzZoneShortStdName, + ETzZoneShortDSTName, + ETzZoneCity, + ETzZoneGroupId, + ETzZoneResourceId, + }; + + for (TInt x = 0; x < CTzLocalizedTimeZone::ECachedTimeZones; ++x) + { + // Insert empty row + zoneView.InsertL(); + // Fill the table with blank data + zoneView.SetColL(ETzZoneId, 0); + zoneView.SetColL(ETzZoneStdName, KEmptyString); + zoneView.SetColL(ETzZoneDSTName, KEmptyString); + zoneView.SetColL(ETzZoneShortStdName, KEmptyString); + zoneView.SetColL(ETzZoneShortDSTName, KEmptyString); + zoneView.SetColL(ETzZoneCity, KEmptyString); + zoneView.SetColL(ETzZoneGroupId, 0); + zoneView.SetColL(ETzZoneResourceId, 0); + zoneView.PutL(); // Complete insertion + } + + CleanupStack::PopAndDestroy(&zoneView); + CleanupStack::PopAndDestroy(frequentlyUsedTimeZonesColSet); + CleanupStack::PopAndDestroy(&cachedTableCols); + } + +/** +This is a copy/paste of CTzLocalizationDb::CreateUserAddedCitiesTableL() that +we can't use as it is not exported. +*/ +void CTzLocalizationDbCreationTests::CreateUserAddedCitiesTableL(RDbNamedDatabase& aDatabase) + { + //Table and Column names for User Added Cities Table + //These text strings are never visible and do not need localizing + _LIT(KUCTableName, "UserCities"); + _LIT(KUCTableTzId, "TzId"); + _LIT(KUCTableCity, "City"); + _LIT(KUCTableGroup, "GroupId"); + _LIT(KUCTableResourceId, "ResourceId"); + + //Create the columns for the user aded cities table + RArray cityTableCols; + CleanupClosePushL(cityTableCols); + cityTableCols.AppendL(TDbCol(KUCTableTzId, EDbColUint16)); + cityTableCols.AppendL(TDbCol(KUCTableCity, EDbColText)); + cityTableCols.AppendL(TDbCol(KUCTableGroup, EDbColUint8)); + cityTableCols.AppendL(TDbCol(KUCTableResourceId, EDbColUint32)); + + // Create the columnset - add the columns + // Columns MUST be added in the same order they appear in TTzCityColumn + CDbColSet* userAddedCitiesColSet = CDbColSet::NewLC(); + TInt numCols = cityTableCols.Count(); + for(TInt i = 0; i < numCols; ++i) + { + userAddedCitiesColSet->AddL(cityTableCols[i]); + } + + // Create the User City table + User::LeaveIfError(aDatabase.CreateTable(KUCTableName, *userAddedCitiesColSet)); + + CleanupStack::PopAndDestroy(userAddedCitiesColSet); + CleanupStack::PopAndDestroy(&cityTableCols); + } + +static void DoTestsL(RTest& aTest) + { + CTzLocalizationDbCreationTests* tests = CTzLocalizationDbCreationTests::NewLC(aTest); + tests->RunL(); + CleanupStack::PopAndDestroy(tests); + } + +/** + +@SYMTestCaseID PIM-APPSERV-tzlocalizationdbcreationtests-0001 + +*/ + +TInt E32Main() + { + __UHEAP_MARK; + + CTrapCleanup* trapCleanup = CTrapCleanup::New(); + if(!trapCleanup) + { + return KErrNoMemory; + } + + CActiveScheduler* scheduler = new CActiveScheduler; + if(!scheduler) + { + return KErrNoMemory; + } + CActiveScheduler::Install(scheduler); + + _LIT(KTestName, "t_tzlocalizationdbcreationtests"); + RTest test(KTestName); + TRAPD(ret, DoTestsL(test)); + test.Printf(_L("Trapped return value from DoTestsL(): %d\n"), ret); + test(ret == KErrNone); + test.Close(); + + delete scheduler; + delete trapCleanup; + + __UHEAP_MARKEND; + + return (KErrNone); + }