diff -r 000000000000 -r ba25891c3a9e installationservices/swi/test/tsisregistrytest/tsisregistryteststep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/installationservices/swi/test/tsisregistrytest/tsisregistryteststep.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,508 @@ +/* +* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + + +/** + @file + @test + @internalTechnology +*/ + +#include +#include "tsisregistryteststep.h" +#include "testutilclientswi.h" +#include "filesisdataprovider.h" +#include "siscontents.h" +#include "sisparser.h" + +///////////////////////////////////////////////////////////////////// +// defs, Constants used by test steps +///////////////////////////////////////////////////////////////////// + +_LIT(KSisRegistryPath, "\\sys\\install\\sisregistry\\"); +_LIT(KBackupPath, "\\sys\\install\\backup\\"); +_LIT(KTestRegistryPath, "z:\\tswi\\tsisregistrytest\\data\\"); +_LIT(KSaveRegistryPath, "\\tswi\\tsisregistrytest\\generated\\"); + +_LIT(KScrDbFileName, "scr.db"); +_LIT(KScrDbFilePath, "\\sys\\install\\scr\\"); + +_LIT(KKeyFormat, "-%02d"); + +///////////////////////////////////////////////////////////////////// +// Tags used by test steps +///////////////////////////////////////////////////////////////////// + +void CSisRegistryTestStepBase:: MarkAsPerformanceStep() + { + iIsPerformanceTest = ETrue; + } + +void CSisRegistryTestStepBase::PrintPerformanceLog(TTime aTime) + { + _LIT(KPerformanceTestInfo, "PERFORMANCE_LOG_INFORMATION"); + TDateTime timer = aTime.DateTime(); + INFO_PRINTF6(_L("%S,%d:%d:%d:%d"), &KPerformanceTestInfo(), timer.Hour(), timer.Minute(), timer.Second(), timer.MicroSecond()); + } + +TVerdict CSisRegistryTestStepBase::PrintErrorAndReturnFailL(const TDesC& aMsg) + { + ERR_PRINTF1(aMsg); + SetTestStepResult(EFail); + return TestStepResult(); + } + +void CSisRegistryTestStepBase::StartTimer() + { + if(!iIsPerformanceTest) + return; // Do nothing if not performance test + iStartTime.HomeTime(); + PrintPerformanceLog(iStartTime); + } + +void CSisRegistryTestStepBase::StopTimerAndPrintResultL() + { + if(!iIsPerformanceTest) + return; // Do nothing if not performance test + + TTime endTime; + endTime.HomeTime(); + PrintPerformanceLog(endTime); + + TTimeIntervalMicroSeconds duration = endTime.MicroSecondsFrom(iStartTime); + TInt actualDuration = I64INT(duration.Int64())/1000; // in millisecond + + if(iTimeMeasuredExternally) + { // if the time has been measured externally, update the actual duration value with that. + actualDuration = iTimeMeasuredExternally; + } + + // Performance related names + _LIT(KMaxDurationName, "MaxDuration"); + _LIT(KMaxTestCaseDuration, "TEST_CASE_MAXIMUM_ALLOWED_DURATION"); + _LIT(KActualTestCaseDuration, "TEST_CASE_ACTUAL_DURATION"); + + TInt maxDuration = 0; + if(!GetIntFromConfig(ConfigSection(), KMaxDurationName, maxDuration)) + { + ERR_PRINTF2(_L("%S could not be found in configuration."), &KMaxDurationName()); + User::Leave(KErrNotFound); + } + else + { + INFO_PRINTF3(_L("%S,%d"), &KMaxTestCaseDuration(), maxDuration); + INFO_PRINTF3(_L("%S,%d"), &KActualTestCaseDuration(), actualDuration); + } + + if(actualDuration <= maxDuration) + { + INFO_PRINTF2(_L("This test meets performance requirement (Duration=%d)."), actualDuration); + } + else + { + ERR_PRINTF2(_L("This test does not meet performance requirement (Duration=%d)."), actualDuration); + SetTestStepResult(EFail); + } + } + +void CSisRegistryTestStepBase::GetStringArrayFromConfigL(const TDesC& aSectName, const TDesC& aKeyName, RArray& aArray) + { + HBufC* buf = HBufC::NewLC(aKeyName.Length() + KKeyFormat().Length()); + TPtr ptr(buf->Des()); + INFO_PRINTF2(_L("Parsing attribute: %S"), &aKeyName); + + TInt i = 0; + TBool cont = ETrue; + do + { + ++i; + ptr = aKeyName; + ptr.AppendFormat(KKeyFormat(), i); + TPtrC val; + + cont = GetStringFromConfig(aSectName, ptr, val); + if (cont) + { + TInt error = aArray.Append(val); + + INFO_PRINTF2(_L("String name: %S"), &val); + + User::LeaveIfError(error); + } + } while (cont); + + INFO_PRINTF2(_L("Element count: %d"), i-1); + CleanupStack::PopAndDestroy(buf); + } + +TBool CSisRegistryTestStepBase::GetUidFromConfig(const TDesC& aSectName, const TDesC& aKeyName, TUid& aUid) + { + TInt val; + if(GetHexFromConfig(aSectName, aKeyName, val)) + { + aUid = TUid::Uid(val); + return ETrue; + } + else + { + return EFalse; + } + } + +void CSisRegistryTestStepBase::GetUidArrayFromConfigL(const TDesC& aSectName, const TDesC& aKeyName, RArray& aArray) + { + HBufC* buf = HBufC::NewLC(aKeyName.Length() + KKeyFormat().Length()); + TPtr ptr(buf->Des()); + INFO_PRINTF2(_L("Parsing attribute: %S"), &aKeyName); + + TInt i = 0; + TBool cont = ETrue; + do + { + ++i; + ptr = aKeyName; + ptr.AppendFormat(KKeyFormat(), i); + TUid uid; + + cont = GetUidFromConfig(aSectName, ptr, uid); + if (cont) + { + User::LeaveIfError(aArray.Append(uid)); + } + } while (cont); + + INFO_PRINTF2(_L("Element count: %d"), i-1); + CleanupStack::PopAndDestroy(buf); + } + +void CSisRegistryTestStepBase::GetIntArrayFromConfigL(const TDesC& aSectName, const TDesC& aKeyName, RArray& aArray) + { + HBufC* buf = HBufC::NewLC(aKeyName.Length() + KKeyFormat().Length()); + TPtr ptr(buf->Des()); + INFO_PRINTF2(_L("Parsing attribute: %S"), &aKeyName); + + TInt i = 0; + TBool cont = ETrue; + do + { + ++i; + ptr = aKeyName; + ptr.AppendFormat(KKeyFormat(), i); + TInt val; + + cont = GetIntFromConfig(aSectName, ptr, val); + if (cont) + { + User::LeaveIfError(aArray.Append(val)); + } + } while (cont); + + INFO_PRINTF2(_L("Element count: %d"), i-1); + CleanupStack::PopAndDestroy(buf); + } + +HBufC8* CSisRegistryTestStepBase::GetControllerFromSisLC(const TDesC& aSisFileName) + { + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + RFile file; + User::LeaveIfError(file.Open(fs, aSisFileName, EFileRead)); + CleanupClosePushL(file); + + // Create a file data provider + MSisDataProvider* dataProvider = CFileSisDataProvider::NewLC(file); + + // Extract raw controller data into a buffer + TInt64 pos(0); + User::LeaveIfError(dataProvider->Seek(ESeekStart, pos)); + Sis::CContents *contents = Sis::Parser::ContentsL(*dataProvider); + CleanupStack::PushL(contents); + HBufC8* ret = contents->ReadControllerL(); + CleanupStack::PopAndDestroy(4, &fs); //contents, dataProvier, file + CleanupStack::PushL(ret); + return ret; + } +///////////////////////////////////////////////////////////////////// +// CBackupRegistryStep +///////////////////////////////////////////////////////////////////// +CBackupRegistryStep::CBackupRegistryStep() + { + SetTestStepName(KBackupRegistry); + } + +TVerdict CBackupRegistryStep::doTestStepL() + { + RTestUtilSessionSwi util; + User::LeaveIfError(util.Connect()); + CleanupClosePushL(util); + + TDriveUnit sysDrive (RFs::GetSystemDrive()); + TDriveName sysDriveName (sysDrive.Name()); + + TBuf<128> backUpPath (sysDriveName); + backUpPath.Append(KBackupPath); + + (void) util.RmDir(backUpPath); + + TBuf<128> sisRegistryPath (sysDriveName); + sisRegistryPath.Append(KSisRegistryPath); + TInt err = util.Move(sisRegistryPath, backUpPath); + if(err != KErrNone && err != KErrPathNotFound && err != KErrNotFound) + { + User::Leave(err); + } + + TBuf<128> backupDbPath(sysDriveName); + backupDbPath.Append(KBackupPath); + backupDbPath.Append(KScrDbFileName); + + TBuf<128> scrDbPath(sysDriveName); + scrDbPath.Append(KScrDbFilePath); + scrDbPath.Append(KScrDbFileName); + + // Copy the current SCR in to backup location + err = util.Move(scrDbPath, backupDbPath); + if(err != KErrNone && err != KErrPathNotFound && err != KErrNotFound) + { + User::Leave(err); + } + + CleanupStack::PopAndDestroy(&util); + + SetTestStepResult(EPass); + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CCreateTestRegistryStep +///////////////////////////////////////////////////////////////////// +CCreateTestRegistryStep::CCreateTestRegistryStep() + { + SetTestStepName(KCreateTestRegistry); + } + +TVerdict CCreateTestRegistryStep::doTestStepL() + { + RTestUtilSessionSwi util; + User::LeaveIfError(util.Connect()); + CleanupClosePushL(util); + + TDriveUnit sysDrive (RFs::GetSystemDrive()); + TBuf<128> sisRegistryPath (sysDrive.Name()); + sisRegistryPath.Append(KSisRegistryPath); + + User::LeaveIfError(util.Copy(KTestRegistryPath, sisRegistryPath)); + + TBuf<128> emptyDbPath(KTestRegistryPath); + emptyDbPath.Append(KScrDbFileName); + + TBuf<128> scrDbPath(sysDrive.Name()); + scrDbPath.Append(KScrDbFilePath); + scrDbPath.Append(KScrDbFileName); + + TBuf<128> exesDbFile(sysDrive.Name()); + exesDbFile.Append(KSisRegistryPath); + exesDbFile.Append(KScrDbFileName); + + // Remove the extra SCR DB file copied from KTestRegistryPath to sisRegistryPath + util.Delete(exesDbFile); + + // Copy the empty SCR DB in place + User::LeaveIfError(util.Copy(emptyDbPath, scrDbPath)); + + CleanupStack::PopAndDestroy(&util); + + SetTestStepResult(EPass); + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CDeleteRegistryStep +///////////////////////////////////////////////////////////////////// +CDeleteRegistryStep::CDeleteRegistryStep() + { + SetTestStepName(KDeleteRegistry); + } + +TVerdict CDeleteRegistryStep::doTestStepL() + { + // Wait up to 30 seconds to ensure both the sisregistry server and SCRServer + // have shut down + _LIT(KSisRegistryServerName, "!SisRegistryServer"); + _LIT(KScrServerName, "!ScrServer"); + TInt delaytime = 30; + + while (delaytime-- > 0) + { + TFullName serverName; + TFindServer find(KSisRegistryServerName); + if (KErrNotFound == find.Next(serverName)) + { + find.Find(KScrServerName); + if (KErrNotFound == find.Next(serverName)) + { + break; + } + } + User::After(1000000); // wait a second until the next test + } + + RTestUtilSessionSwi util; + User::LeaveIfError(util.Connect()); + CleanupClosePushL(util); + + TDriveUnit sysDrive (RFs::GetSystemDrive()); + TBuf<128> sisRegistryPath (sysDrive.Name()); + sisRegistryPath.Append(KSisRegistryPath); + + TInt err = util.RmDir(sisRegistryPath); + if(err != KErrNone && err != KErrPathNotFound && err != KErrNotFound) + { + User::Leave(err); + } + + TBuf<128> scrDbPath(sysDrive.Name()); + scrDbPath.Append(KScrDbFilePath); + scrDbPath.Append(KScrDbFileName); + + // Delete the current SCR DB + err = util.Delete(scrDbPath); + if(err != KErrNone && err != KErrPathNotFound && err != KErrNotFound) + { + User::Leave(err); + } + + CleanupStack::PopAndDestroy(&util); + + SetTestStepResult(EPass); + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CRestoreRegistryStep +///////////////////////////////////////////////////////////////////// +CRestoreRegistryStep::CRestoreRegistryStep() + { + SetTestStepName(KRestoreRegistry); + } + +TVerdict CRestoreRegistryStep::doTestStepL() + { + RTestUtilSessionSwi util; + User::LeaveIfError(util.Connect()); + CleanupClosePushL(util); + + TDriveUnit sysDrive (RFs::GetSystemDrive()); + TDriveName sysDriveName (sysDrive.Name()); + + TBuf<128> backUpPath (sysDriveName); + backUpPath.Append(KBackupPath); + + TBuf<128> sisRegistryPath (sysDriveName); + sisRegistryPath.Append(KSisRegistryPath); + + TInt err = util.Move(backUpPath, sisRegistryPath); + if(err != KErrNone && err != KErrPathNotFound && err != KErrNotFound) + { + User::Leave(err); + } + + TBuf<128> backupDbPath(sysDriveName); + backupDbPath.Append(KSisRegistryPath); + backupDbPath.Append(KScrDbFileName); + + TBuf<128> scrDbPath(sysDriveName); + scrDbPath.Append(KScrDbFilePath); + scrDbPath.Append(KScrDbFileName); + + // SCR DB already copied from backup path to sisregistrypath, + // so, copy the file from there to SCR path. + err = util.Move(backupDbPath, scrDbPath); + if(err != KErrNone && err != KErrPathNotFound && err != KErrNotFound) + { + User::Leave(err); + } + CleanupStack::PopAndDestroy(&util); + + SetTestStepResult(EPass); + return TestStepResult(); + } + +///////////////////////////////////////////////////////////////////// +// CSaveRegistryStep +///////////////////////////////////////////////////////////////////// +CSaveRegistryStep::CSaveRegistryStep() + { + SetTestStepName(KSaveGeneratedRegistry); + } + +TVerdict CSaveRegistryStep::doTestStepL() + { + // Wait up to 30 seconds to ensure both the sisregistry server and SCRServer + // have shut down + _LIT(KSisRegistryServerName, "!SisRegistryServer"); + _LIT(KScrServerName, "!ScrServer"); + TInt delaytime = 30; + + while (delaytime-- > 0) + { + TFullName serverName; + TFindServer find(KSisRegistryServerName); + if (KErrNotFound == find.Next(serverName)) + { + find.Find(KScrServerName); + if (KErrNotFound == find.Next(serverName)) + { + break; + } + } + User::After(1000000); // wait a second until the next test + } + + RTestUtilSessionSwi util; + User::LeaveIfError(util.Connect()); + CleanupClosePushL(util); + + TDriveUnit sysDrive (RFs::GetSystemDrive()); + TDriveName sysDriveName(sysDrive.Name()); + + TFileName saveRegistryPath (sysDriveName); + saveRegistryPath.Append(KSaveRegistryPath); + + TInt err = util.RmDir(saveRegistryPath); + TFileName sisRegistryPath (sysDriveName); + sisRegistryPath.Append(KSisRegistryPath); + + User::LeaveIfError(util.Copy(sisRegistryPath, saveRegistryPath)); + + TBuf<128> dbSavePath(sysDriveName); + dbSavePath.Append(KSaveRegistryPath); + dbSavePath.Append(KScrDbFileName); + + TBuf<128> scrDbPath(sysDriveName); + scrDbPath.Append(KScrDbFilePath); + scrDbPath.Append(KScrDbFileName); + + // Save the SCR DB to the saving location + User::LeaveIfError(util.Copy(scrDbPath, dbSavePath)); + + CleanupStack::PopAndDestroy(&util); + + SetTestStepResult(EPass); + return TestStepResult(); + }