diff -r 000000000000 -r bde4ae8d615e os/ossrv/lowlevellibsandfws/pluginfw/Framework/EcomTestUtils/EcomTestUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/ossrv/lowlevellibsandfws/pluginfw/Framework/EcomTestUtils/EcomTestUtils.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,315 @@ +// 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 "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: +// Helper class for ECom test code. Allows various file manipulation operations +// that require higher Capabilities than shoud be given to test harnesses. +// +// + +#include "EcomTestUtils.h" +#include "hal.h" +#include + +_LIT(KEcomTestUtilsHelperPanic, "EComTestUtilsHelperPanic"); +_LIT(KSeparator, "|"); // Invalid filepath char used to separate filenames +const TInt KMAxProcessNameLength = 50; // Max process name length. + +// Processes with high Capablilities to perform restricted operations. +_LIT(KProcessMakeWriteable, "t_makefilewriteable"); +_LIT(KProcessMakeReadOnly, "t_makefilereadonly"); +_LIT(KProcessFileManDeleteFile, "t_processfilemandeletefile.exe"); +_LIT(KProcessFileManCopyFile, "t_processfilemancopyfile.exe"); +_LIT(KProcessFileManRename, "t_processfilemanrename.exe"); +_LIT(KProcessRfsDeleteFile, "t_processrfsdeletefile.exe"); +_LIT(KProcessRfsReplaceFile, "t_processrfsreplacefile.exe"); +_LIT(KProcessKillProcess, "t_processkillprocess.exe"); +_LIT(KProcessFileManDeleteDir, "t_processfilemandeletedir.exe"); +_LIT(KProcessRLoaderDeleteFile, "t_processrloaderdeletefile.exe"); + +/** Name format for locale DLLs. */ +_LIT(KLocaleDLLNameFormat, "ELOCL.%02d"); + + +// Start the high capability helper process +void LaunchProcessL(const TDesC& aProcessName, const TDesC& aCmdLine) +{ + TRequestStatus stat; + RProcess p; + User::LeaveIfError(p.Create(aProcessName, aCmdLine)); + + // Asynchronous logon: completes when process terminates with process + // exit code + p.Logon(stat); + p.Resume(); + User::WaitForRequest(stat); + + TExitType exitType = p.ExitType(); + TInt exitReason = p.ExitReason(); + __ASSERT_ALWAYS(exitType == EExitKill, User::Panic(KEcomTestUtilsHelperPanic, exitReason)); + + p.Close(); + User::LeaveIfError(exitReason); +} + +/** +CFileMan +*/ +EXPORT_C void EComTestUtils::FileManCopyFileL(const TDesC& anOld,const TDesC& aNew) + { + TBuf fileNames(anOld); + fileNames.Append(KSeparator); + fileNames.Append(aNew); + TBufC copyProcess(KProcessFileManCopyFile); + LaunchProcessL(copyProcess, fileNames); + } + +EXPORT_C void EComTestUtils::FileManDeleteFileL(const TDesC& aFile) + { + TBufC deleteProcess(KProcessFileManDeleteFile); + LaunchProcessL(deleteProcess, aFile); + } + +EXPORT_C void EComTestUtils::FileManRenameL(const TDesC& anOld,const TDesC& aNew) + { + TBuf fileNames(anOld); + fileNames.Append(KSeparator); + fileNames.Append(aNew); + TBufC renameProcess(KProcessFileManRename); + LaunchProcessL(renameProcess, fileNames); + } + +EXPORT_C void EComTestUtils::FileManDeleteDirL(const TDesC& aPath) + { + TBufC deleteDirProcess(KProcessFileManDeleteDir); + LaunchProcessL(deleteDirProcess, aPath); + } + +/** +RFs +*/ +EXPORT_C void EComTestUtils::RfsDeleteFileL(const TDesC& aFile) + { + TBufC deleteProcess(KProcessRfsDeleteFile); + LaunchProcessL(deleteProcess, aFile); + } + +EXPORT_C void EComTestUtils::RfsReplaceFileL(const TDesC& anOld,const TDesC& aNew) + { + TBuf fileNames(anOld); + fileNames.Append(KSeparator); + fileNames.Append(aNew); + TBufC replaceProcess(KProcessRfsReplaceFile); + LaunchProcessL(replaceProcess, fileNames); + } + + +EXPORT_C void EComTestUtils::MakeFileWriteableL(const TDesC& aFile) + { + TBufC makeWriteable(KProcessMakeWriteable); + LaunchProcessL(makeWriteable, aFile); + } + +EXPORT_C void EComTestUtils::MakeFileReadOnlyL(const TDesC& aFile) + { + TBufC makeReadOnly(KProcessMakeReadOnly); + LaunchProcessL(makeReadOnly, aFile); + } + +EXPORT_C void EComTestUtils::KillProcessL(const TDesC& aProcessName) + { + TBuf killProcess(KProcessKillProcess); + LaunchProcessL(killProcess, aProcessName); + } + + +/** +Switch the current locale to the given language. +@param aLang The language to switch to. +@leave KErrNotFound If locale DLL corresponding to the language cannot be found. +*/ +EXPORT_C void EComTestUtils::SwitchToLanguageL(TLanguage aLang) + { + RLibrary library; + TBuf<50> libraryName; + libraryName.Format(KLocaleDLLNameFormat,aLang); + User::LeaveIfError(library.Load(libraryName)); + CleanupClosePushL(library); + User::LeaveIfError(UserSvr::ChangeLocale(libraryName)); + CleanupStack::PopAndDestroy(); // library + } + + +/** +Ask the loader to delete an file. This function should be used instead +of RFs::Delete where the supplied file may be a paged executable, although +it can be used for any file. +@param aFile The file to be deleted +@leave KErrBadName If the supplied filename is not fully qualified. Else any of the Symbian OS error code +*/ +EXPORT_C void EComTestUtils::RLoaderDeleteFileL(const TDesC& aFile) + { + TBufC deleteTheProcess(KProcessRLoaderDeleteFile); + LaunchProcessL(deleteTheProcess, aFile); + } + +/** +Get Rom Build Type i.e. NAND or Default Rom build. +This function is created since in some test one needs to find if its a +NAND or a Non-Nand build. It returns enum "TRomBuildOption" that states the rom build type. +Enum "TRomBuildOption" is defined so that this function can be enhanced for a new Rom build type +@param aRfs Input Parameter RFs reference is passed so that we don't need to +connect to the file server again. +*/ +EXPORT_C TRomBuildOption EComTestUtils::RomBuildType(const RFs& aRfs) + { + + TRomBuildOption romBuildOption; + TDriveInfo driveInfo; + + aRfs.Drive(driveInfo, EDriveC); + + //C drive determines if its a NAND or a Non-NAND ROM build as per the + //H4-hrp-UserGuide, Thus CDrive's media type is checked if it is + //EMediaNANDFlash, EMediaRam or EMediaFlash... + //If it is EMediaRam or EMediaFlash it is considered as Default Rom Build. + if(driveInfo.iType==EMediaNANDFlash) + { + romBuildOption = ENandRomBuild; + } + else + { + romBuildOption = EDefaultRomBuild; + } + + return romBuildOption; + } + +/* +Method is used to detect the hardware configuration of the platform running the tests, +including both machine UID and C-drive type. +*/ +EXPORT_C THardwareConfiguration EComTestUtils::GetHardwareConfiguration() + { + //get the platform type + TInt muid; + if (KErrNone != HAL::Get(HAL::EMachineUid, muid)) + { + return EPlatformUnknown; + } + + //determine the ROM confguration (NAND or non-NAND) + TInt r = KErrNone; + RFs fs; + r = fs.Connect(); + if (r != KErrNone) + { + return r; + } + TBool nandBuild = (EComTestUtils::RomBuildType(fs)==ENandRomBuild); + fs.Close(); + + //determine whether this ROM is Demand-Paging enabled + TBool DP_rom = false; + if (nandBuild) + { + TRomHeader* romHeader = (TRomHeader*)UserSvr::RomHeaderAddress(); + DP_rom = romHeader->iPageableRomStart; + } + + if (muid == HAL::EMachineUid_OmapH2) + { + if (!nandBuild) + { + return EPlatformH2RAM; + } + else + { + if (DP_rom) + { + return EPlatformH2NANDDP; + } + else + { + return EPlatformH2NAND; + } + } + } + else if (muid == HAL::EMachineUid_OmapH4) + { + if (!nandBuild) + { + //Incase the ROM is not a nandBuild, + //then there could be a chance that it is a WDP enabled system. + //WDP enabled configuration is checked by checking for Media Type of C drive. + //Under WDP enabled configuration, the C drive is of type 'Hard Disk' + //This is done since the function EComTestUtils::RomBuildType, above, used for a similar purpose, + //is also checking the media type of C drive to determine the same. + //Currently added this check for WDP enabled in case of H4 'muid == HAL::EMachineUid_OmapH4' only + TDriveInfo driveInfo; + TInt rf = KErrNone; + rf = fs.Connect(); + if (rf != KErrNone) + { + return rf; + } + fs.Drive(driveInfo, EDriveC); + fs.Close(); + + if (EMediaHardDisk == driveInfo.iType) + { + return EPlatformH4MMC; //The system is WDP enabled + } + + return EPlatformH4RAM; + } + else + { + if (DP_rom) + { + return EPlatformH4NANDDP; + } + else + { + return EPlatformH4NAND; + } + } + } + //For H6 board OMAP3430 + else if (muid == HAL::EMachineUid_OmapH6) + { + if (!nandBuild) + { + return EPlatformH6RAM; + } + else + { + if (DP_rom) + { + return EPlatformH6NANDDP; + } + else + { + return EPlatformH6NAND; + } + } + } // H6 board 3430 ends here + else if (muid == HAL::EMachineUid_Win32Emulator) + { + return EPlatformWINSCW; + } + else + { + return EPlatformUnknown; + } + } +