diff -r 000000000000 -r 2f259fa3e83a commonuisupport/uikon/test/teiksrv/tbackup/tbackup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commonuisupport/uikon/test/teiksrv/tbackup/tbackup.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,1937 @@ +// Copyright (c) 2005-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: +// Tests CBaBackupSessionWrapper APIs and observers for backup server. +// +// + +/** + @file + @test + @internalComponent - Internal Symbian test code +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "tbackup.hrh" +#include + + +#include "tbackup.h" + +_LIT(KBackupFile1,"foo1"); +_LIT(KBackupFile2,"foo2"); +_LIT(KBackupFile3,"foo3"); +_LIT(KObserverStr, "Observer %d:"); +_LIT(KBackupOpMsg, "Backup Operation running"); +_LIT(KRegistrationDlgTitle, "Register and DeRegister Observers"); + +_LIT(KTBackupResourceFilePath, "z:\\system\\test\\tbackup\\tbackup.rsc"); + + + +/********************************************** + + + + CBackupDialogBase + + + +************************************************/ +CBackupDialogBase::CBackupDialogBase(CDesCArray& aFiles,TOperationGranularity& aGranularity,TDes& aFileName) + : iFiles(aFiles), iGranularity(aGranularity), iFileName(aFileName) +/** + Constructor + */ + {} + + +/** + Auxiliary Function for all Test Cases + + This method is an override from CEikDialog.It performs pre-layout dialog + initialisation. + + */ +void CBackupDialogBase::PreLayoutDynInitL() + { + SetHorOptionButListCurrentSet(EDlgBackupCloseOpButList,EDlgBackupCloseAll); + CEikChoiceList* list=static_cast(Control(EDlgBackupFileList)); + list->SetArrayExternalOwnership(ETrue); + list->SetArrayL(&iFiles); + UpdateFileListDimmedState(); + } + + +/** + Auxiliary Function for all Test Cases + + This method is an override from CEikDialog. Handles dialog button press 'All' + and 'File' to select a single file or all files to be closed by the dialog. + + */ +TBool CBackupDialogBase::OkToExitL(TInt /*aButtonId*/) + { + if (HorOptionButListCurrentSet(EDlgBackupCloseOpButList)==EDlgBackupCloseAll) + { + iGranularity=EAll; + } + else + { + iGranularity=ESingleFile; + const CEikChoiceList* list=static_cast(Control(EDlgBackupFileList)); + iFileName=iFiles[list->CurrentItem()]; + } + return ETrue; + } + +/** + Auxiliary Function for all Test Cases + + This method is an override from CEikDialog. This function is called when a + control event of type EEventStateChanged is received by the dialog from one + of its component controls. + + */ +void CBackupDialogBase::HandleControlStateChangeL(TInt aControlId) + { + if (aControlId==EDlgBackupCloseOpButList) + { + UpdateFileListDimmedState(); + } + } + +/** + Auxiliary Function for all Test Cases + + This method is an override from CEikDialog. This method dims and deactivates + the file choice list on the dialog. + + */ +void CBackupDialogBase::UpdateFileListDimmedState() + { + const TBool dimFileList=(HorOptionButListCurrentSet(EDlgBackupCloseOpButList)==EDlgBackupCloseAll); + const CEikChoiceList* list=static_cast(Control(EDlgBackupFileList)); + const TBool fileListDimmed=list->IsDimmed(); + if (dimFileList!=fileListDimmed) + { + SetLineDimmedNow(EDlgBackupFileList,dimFileList); + } + } + + +/********************************************** + + + + CBackupCloseDialog + + + +************************************************/ + +/** + Auxiliary function for TestCaseID tbackup-CmdCloseL + + This method initialises and launches the backup close dialog. + + */ +TBool CBackupCloseDialog::RunDlgLD(CDesCArray& aFiles,CBackupDialogBase::TOperationGranularity& aGranularity, + TDes& aFileName,MBackupObserver::TFileLockFlags& aFlag) + { // static + CBackupCloseDialog* dlg=new(ELeave) CBackupCloseDialog(aFiles,aGranularity,aFileName,aFlag); + return dlg->ExecuteLD(R_TBACKUP_FILE_OPTIONS); + } + +CBackupCloseDialog::CBackupCloseDialog(CDesCArray& aFiles,CBackupDialogBase::TOperationGranularity& aGranularity, + TDes& aFileName,MBackupObserver::TFileLockFlags& aFlag) + : CBackupDialogBase(aFiles,aGranularity,aFileName), iFileFlag(aFlag) +/** + Constructor + */ + { + } +/** + Auxiliary function for TestCaseID tbackup-CmdCloseL + + This method is an override from CEikDialog.It performs pre-layout dialog + initialisation. + + */ +void CBackupCloseDialog::PreLayoutDynInitL() + { + SetHorOptionButListCurrentSet(EDlgBackupFlagOpButList,EDlgBackupReadOnly); + CBackupDialogBase::PreLayoutDynInitL(); + } + +/** + Auxiliary function for TestCaseID tbackup-CmdCloseL + + This method is an override from CEikDialog. It is used to specify 'Read only' or + 'No access' file locks while CloseAll() & CloseFileL() APIs are invoked. + + */ +TBool CBackupCloseDialog::OkToExitL(TInt aButtonId) + { + if (HorOptionButListCurrentSet(EDlgBackupFlagOpButList)==EDlgBackupReadOnly) + { + iFileFlag=MBackupObserver::EReleaseLockReadOnly; + } + else + { + iFileFlag=MBackupObserver::EReleaseLockNoAccess; + } + return CBackupDialogBase::OkToExitL(aButtonId); + } + + +/********************************************** + + + + CBackupRestartDialog + + + +************************************************/ + +/** + Auxiliary function for TestCaseID tbackup-CmdRestartL + + This method initialises and launches the backup restart dialog. + + */ +TBool CBackupRestartDialog::RunDlgLD(CDesCArray& aFiles,CBackupDialogBase::TOperationGranularity& aGranularity, + TDes& aFileName) + { // static + CBackupRestartDialog* dlg=new(ELeave) CBackupRestartDialog(aFiles,aGranularity,aFileName); + return dlg->ExecuteLD(R_TBACKUP_FILE_OPTIONS); + } + +CBackupRestartDialog::CBackupRestartDialog(CDesCArray& aFiles,CBackupDialogBase::TOperationGranularity& aGranularity, + TDes& aFileName) + : CBackupDialogBase(aFiles,aGranularity,aFileName) +/** + Constructor + */ + {} + +/** + Auxiliary function for TestCaseID tbackup-CmdRestartL + + This method is an override from CEikDialog.It performs pre-layout dialog + initialisation. + + */ +void CBackupRestartDialog::PreLayoutDynInitL() + { + SetTitleL(R_TBACKUP_RESTART_DLG_TITLE); + TBuf<20> text; + iCoeEnv->ReadResource(text,R_TBACKUP_RESTART_OPTION_TITLE); + CEikLabel* caption=Line(EDlgBackupCloseOpButList)->iCaption; + caption->SetTextL(text); + DeleteLine(EDlgBackupFlagOpButList); + CBackupDialogBase::PreLayoutDynInitL(); + } + + + +/********************************************** + + + + CBackupFileObserver + + + +************************************************/ +CBackupFileObserver::TBackupFile::TBackupFile(const TDesC& aFileName,TFileLock aLockState) + : iFileName(aFileName), iLockState(aLockState) +/** + Constructor + */ + {} + +/** + Auxiliary function for all test cases + + This method is part of two-phase construction of CBackupFileObserver.The + method is called by CTBackupAppUi::CreateFileObserversL() to construct new + client to backup server. + + */ +CBackupFileObserver* CBackupFileObserver::NewLC() + { // static + CBackupFileObserver* self=new(ELeave) CBackupFileObserver(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CBackupFileObserver::~CBackupFileObserver() +/** + Destructor + */ + { + const TInt count=iBackupArray.Count(); + for (TInt ii=count-1;ii>=0;ii--) + { + const TBackupFile& backup=iBackupArray[ii]; + RemoveFile(backup.iFileName); + } + iBackupArray.Close(); + delete iBackupSession; + } + +struct SFileAddCleanup + { + CBackupFileObserver* iFileObserver; + TFileName iFileName; + }; + +/** + Auxiliary function for all Test Cases + + This method is cleanup operation invoked by the pop and destroy action + resulting from a subsequent call to CleanupStack::PopAndDestroy() to + perform clean up of SFileAddCleanup object. + + */ +LOCAL_C void CleanupAddFile(TAny* aPtr) + { + SFileAddCleanup* cleanup=REINTERPRET_CAST(SFileAddCleanup*,aPtr); + cleanup->iFileObserver->RemoveFile(cleanup->iFileName); + } + +/** + Auxiliary function for all Test Cases + + This method registers a file with the backup server. + + */ +void CBackupFileObserver::AddFileL(const TDesC& aFileName) + { + TBackupFile backup(aFileName,ELocked); + User::LeaveIfError(iBackupArray.Append(backup)); + SFileAddCleanup cleanup; + cleanup.iFileObserver=this; + cleanup.iFileName=aFileName; + CleanupStack::PushL(TCleanupItem(CleanupAddFile,&cleanup)); + iBackupSession->RegisterFileL(aFileName,*this); + CleanupStack::Pop(); // CleanupAddFile + } + +/** + Auxiliary function for all Test Cases + + This method is invoked by cleanup method CleanupAddFile() to remove the + registration of a file with the backup server. + + */ +void CBackupFileObserver::RemoveFile(const TDesC& aFileName) + { + const TInt index=Find(aFileName); + if (index!=KErrNotFound) + { + iBackupSession->DeregisterFile(aFileName); + iBackupArray.Remove(index); + iBackupArray.Compress(); + } + } + +/** + Auxiliary function for all Test Cases + + This method returns the array iBackupArray which holds the list of files + registered with the observer. + + */ +const RArray& CBackupFileObserver::BackupArray() const + { + return iBackupArray; + } + +CBackupFileObserver::CBackupFileObserver() +/** + Constructor + */ + {} + +/** + Auxiliary function for all test cases + + This method is part of Two-phase construction of CBackupFileObserver.The + method constructs a new client to the backup server . + + */ +void CBackupFileObserver::ConstructL() + { + iBackupSession=CBaBackupSessionWrapper::NewL(); + } + +/** + Auxiliary function for all Test Cases + + This method attempts to find the file specifed within the iBackupArray + and returns its index within the array if found. Otherwise KErrNotFound is + returned. + + */ +TInt CBackupFileObserver::Find(const TDesC& aFileName) const + { + TInt index=KErrNotFound; + const TInt count=iBackupArray.Count(); + for (TInt ii=0;iiConstructL(aNumberOfObservers); + CleanupStack::Pop(self); + return self; + } + +CBackupOpeartionObserversWrapper::~CBackupOpeartionObserversWrapper() +/** + Destructor + */ + { + ResetAndDestroy(); + iBackupOpeartionObserver.Close(); + delete iBackupSession; + } + +CBackupOpeartionObserversWrapper::CBackupOpeartionObserversWrapper() +/** + Constructor + */ + { + } + +/** + Auxiliary function for all Test Cases + + This method creates 'aNumberOfObservers' of backup operation observers for + the wrapper. + + */ +void CBackupOpeartionObserversWrapper::ConstructL(TInt aNumberOfObservers) + { + iBackupSession=CBaBackupSessionWrapper::NewL(); + for (TInt counter=0; counterRegisterBackupOperationObserverL(aBackupOpeartionObserver); + aBackupOpeartionObserver.SetRegistered(ETrue); + } + +/** + Auxiliary function for all Test Cases + + The method de-registers the specified backup/restore observer and resets the + iRegister flag of observer by calling + CBackupOpeartionObserver::SetRegistered(). The method is invoked by + CBackupOpeartionObserversWrapper::ResetAndDestroy() during destruction. + + */ +void CBackupOpeartionObserversWrapper::DeRegisterBackupOperationObserver(CBackupOpeartionObserver& aBackupOpeartionObserver) + { + iBackupSession->DeRegisterBackupOperationObserver(aBackupOpeartionObserver); + aBackupOpeartionObserver.SetRegistered(EFalse); + } + +/** + Auxiliary function for all Test Cases + + This method is invoked by destructor to deregister all backup observers + present in the wrapper. + + */ +void CBackupOpeartionObserversWrapper::ResetAndDestroy() + { + const TInt count = iBackupOpeartionObserver.Count(); + for (TInt index=0; indexDeRegisterBackupOperationObserver(*iBackupOpeartionObserver[index]); + } + iBackupOpeartionObserver.ResetAndDestroy(); + iBackupOpeartionObserver.Close(); + } + +/********************************************** + + + + CBackupRegistrationDialog + + + +************************************************/ + +CBackupRegistrationDialog::CBackupRegistrationDialog(RPointerArray& aBackupOperationObserversWrapper) + : iBackupOperationObserversWrapper(aBackupOperationObserversWrapper) +/** + Constructor + */ + { + } + +/** + Auxiliary Function tbackup-UpdateBackupObserverRegistrationL + + This method is an override from CEikDialog.It performs pre-layout dialog + initialisation. The method finds whether all observers for each observer + wrapper are registered and the state of each is displayed as a checkbox + on the dialog. + + */ +void CBackupRegistrationDialog::PreLayoutDynInitL() + { + const TInt count = iBackupOperationObserversWrapper.Count(); + CBackupOpeartionObserversWrapper* observerWrapper = NULL; + TInt previousCount = 0; + for (TInt index1=0; index1CountObservers(); + for (TInt index2=0; index2Observer(index2); + const TInt realIndex = previousCount+index2; + CEikCheckBox* checkBox = (CEikCheckBox*)Control(EObserversId+realIndex); + checkBox->SetState(observer->IsRegistered() ? CEikButtonBase::ESet : CEikButtonBase::EClear); + } + previousCount += count2; + } + } + +/** + Auxiliary function for TestCaseID tbackup-UpdateBackupObserverRegistrationL + + This method is an override from CEikDialog. On click of OK button this + method checks whether the check boxes that represent observers in each + wrapper is set or reset and registers or deregisters the backup observer. + + */ +TBool CBackupRegistrationDialog::OkToExitL(TInt aButtonId) + { + if (aButtonId==EEikBidOk) + { + const TInt count = iBackupOperationObserversWrapper.Count(); + CBackupOpeartionObserversWrapper* observerWrapper = NULL; + TInt previousCount = 0; + for (TInt index1=0; index1CountObservers(); + for (TInt index2=0; index2Observer(index2); + const TInt realIndex = previousCount+index2; + CEikCheckBox* checkBox = (CEikCheckBox*)Control(EObserversId+realIndex); + + const TBool stateSet = (checkBox->State()==CEikButtonBase::ESet); + const TBool previousState = observer->IsRegistered(); + const TBool stateChanged = (!stateSet)!=(!previousState); + if (stateChanged) + { + if (stateSet) + { + observerWrapper->RegisterBackupOperationObserverL(*observer); + } + else + { + observerWrapper->DeRegisterBackupOperationObserver(*observer); + } + } + } + previousCount += count2; + } + } + return ETrue; + } + + +/********************************************** + + + + CBackupOperationDialog + + + +************************************************/ +CBackupOperationDialog::CBackupOperationDialog(CBaBackupSessionWrapper& aBackupSession) + :iBackupSession(aBackupSession) +/** + Constructor + */ + {} + +/** + Auxiliary function for TestCaseID tbackup-UpdateBackupOperationStateL + + This method is an override from CEikDialog.It performs pre-layout dialog + initialisation. The method invokes + CBaBackupSessionWrapper::IsBackupOperationRunning() to find whether backup + operation is in running and accordingly sets 'Start' & 'End' option buttons. + + */ +void CBackupOperationDialog::PreLayoutDynInitL() + { + CEikHorOptionButtonList* optionButtonList = (CEikHorOptionButtonList*)Control(EDlgBackupOperationSel); + const TBool isRunning = iBackupSession.IsBackupOperationRunning(); + optionButtonList->SetButtonById(isRunning ? EDlgBackupOperationSel1 : EDlgBackupOperationSel2); + } + +/** + Auxiliary function for TestCaseID tbackup-UpdateBackupOperationStateL + + This method is an override from CEikDialog. On click of OK button this + method checks the state of option buttons labeled 'Start' & 'End' + and accordingly starts / ends the backup operation by calling + CBaBackupSessionWrapper::NotifyBackupOperationL(). + + */ +TBool CBackupOperationDialog::OkToExitL(TInt aButtonId) + { + if (aButtonId==EEikBidOk) + { + CEikHorOptionButtonList* optionButtonList = (CEikHorOptionButtonList*)Control(EDlgBackupOperationSel); + const TInt labeledButtonId = optionButtonList->LabeledButtonId(); + TBackupOperationAttributes backupOperationAttributes; + switch (labeledButtonId) + { + case EDlgBackupOperationSel1: + { + backupOperationAttributes.iFileFlag = MBackupObserver::EReleaseLockReadOnly; + backupOperationAttributes.iOperation = MBackupOperationObserver::EStart; + break; + } + case EDlgBackupOperationSel2: + { + backupOperationAttributes.iFileFlag = MBackupObserver::ETakeLock; + backupOperationAttributes.iOperation = MBackupOperationObserver::EEnd; + break; + } + default: + return EFalse; + } + iBackupSession.NotifyBackupOperationL(backupOperationAttributes); + } + return ETrue; + } + + +/********************************************** + + + + CBackdrop + + + +************************************************/ + + +/** + Auxiliary function for all Test Cases + + This method is part of Two - phase construction. It creates the background + control. + + */ +CBackdrop* CBackdrop::NewL() + { // static + CBackdrop* self=new(ELeave) CBackdrop(); + CleanupStack::PushL(self); + self->CreateWindowL(); + CleanupStack::Pop(); // self + return self; + } +/** + Auxiliary function for all Test Cases + + This method is an override from CCoeControl. It draws the background + control. + + */ +void CBackdrop::Draw(const TRect& aRect) const + { + CWindowGc& gc=SystemGc(); + gc.SetPenStyle(CGraphicsContext::ESolidPen); + gc.SetBrushStyle(CGraphicsContext::ESolidBrush); + gc.SetPenColor(KRgbGreen); + gc.SetBrushColor(KRgbGreen); + gc.DrawRect(aRect); + } + + +/********************************************** + + + + COpenAppList + + + +************************************************/ + +/** + Auxiliary function for TestCaseID tbackup-CmdListAppsL + + This method creates a client session with the windows server and retrieves + the window group list currently available. The caption or the thread id for + each of window groups from the list is obtained and added to the list box. + + */ +void COpenAppList::UpdateL() + { + RWsSession& wsSession=iEikonEnv->WsSession(); + TInt count=wsSession.NumWindowGroups(0); + if (!count) + return; + CDesCArray* tasks=new(ELeave) CDesCArrayFlat(count); + CleanupStack::PushL(tasks); + CArrayFixFlat* wgIds=new(ELeave) CArrayFixFlat(count); + CleanupStack::PushL(wgIds); + CApaWindowGroupName* wgName=CApaWindowGroupName::NewLC(wsSession); + wsSession.WindowGroupList(0,wgIds); + TBuf<2*KMaxFileName+1> name; + const TInt wgCount=wgIds->Count(); + for (TInt ii=0;iiConstructFromWgIdL(wgId); + TPtrC caption=wgName->Caption(); + if(wgName->Hidden()) + { + continue; + } + else if (caption.Length()==0) // not set yet - use thread name instead + { + TThreadId threadId; + TInt err=wsSession.GetWindowGroupClientThreadId(wgId,threadId); + if (err==KErrNone) + { + RThread thread; + err=thread.Open(threadId); + if (err==KErrNone) + { + name.Copy(thread.Name()); + thread.Close(); + } + } + if (err!=KErrNone) + name.Copy(_L("???")); + } + else + { + name=caption; + name.Append(' '); + TFileName docName=wgName->DocName(); + name.Append(docName); + } + tasks->AppendL(name); + } + CleanupStack::PopAndDestroy(2); // wgIds, wgName + Model()->SetItemTextArray(tasks); + CleanupStack::Pop(); // tasks + HandleItemAdditionL(); + } + +/********************************************** + + + COpenFileList + + + +************************************************/ + +COpenFileList::COpenFileList(CArrayPtr& aFileObservers) + : iFileObservers(aFileObservers) +/** + Constructor + */ + {} + +COpenFileList::~COpenFileList() +/** + Destructor + */ + { + delete iList; + } + +/** + Auxiliary function for all Test Cases + + The method creates a Column List Box and sets the width for all the + columns in the list box. + + */ +void COpenFileList::ConstructL() + { + CreateWindowL(); + iList=new(ELeave) CEikColumnListBox(); + iList->ConstructL(this); + CColumnListBoxData* columnData=iList->ItemDrawer()->ColumnData(); + // following assumes a know width for this control + // bad practise but not worth writing a scalable control in this test app + columnData->SetColumnWidthPixelL(0,20); + columnData->SetColumnWidthPixelL(1,180); + columnData->SetColumnWidthPixelL(2,100); + } + +/** + Auxiliary function for TestCaseID tbackup_CmdListOpenFilesL + + This method lists filename and lock state of all files associated with the + file observers. + + */ +void COpenFileList::UpdateL() + { + CDesCArray* textArray=new(ELeave) CDesCArrayFlat(2); + CleanupStack::PushL(textArray); + TChar separator(KColumnListSeparator); + const TInt obsCount=iFileObservers.Count(); + for (TInt ii=0;ii num; + num.Num(ii); + const RArray& backupArray=iFileObservers[ii]->BackupArray(); + const TInt fileCount=backupArray.Count(); + for (TInt jj=0;jj buf; + buf.Append(num); + const CBackupFileObserver::TBackupFile& backupFile=backupArray[jj]; + buf.Append(separator); + buf.Append(backupFile.iFileName); + buf.Append(separator); + TBuf<20> lockState; + if (backupFile.iLockState==CBackupFileObserver::ELocked) + { + iCoeEnv->ReadResource(lockState,R_TBACKUP_LOCKSTATE_LOCKED); + } + else if (backupFile.iLockState==CBackupFileObserver::EReadOnly) + { + iCoeEnv->ReadResource(lockState,R_TBACKUP_LOCKSTATE_READONLY); + } + else if(backupFile.iLockState==CBackupFileObserver::ENoAccess) + { + iCoeEnv->ReadResource(lockState,R_TBACKUP_LOCKSTATE_NOACCESS); + } + else + { + lockState=_L("???"); + } + buf.Append(lockState); + textArray->AppendL(buf); + } + } + iList->Model()->SetItemTextArray(textArray); + CleanupStack::Pop(); // textArray + iList->HandleItemAdditionL(); + } + +/** + Auxiliary function for all Test Cases + + The method is an override from CCoeControl. It returns minimum required + size of column list box. + + */ +TSize COpenFileList::MinimumSize() + { + return iList->MinimumSize(); + } + +/** + Auxiliary function for all Test Cases + + The method is an override from CCoeControl. It is invoked to set the size + and position of the content of list box control. + + */ +void COpenFileList::SizeChanged() + { + const TRect rect(Rect()); + iList->SetRect(rect); + } + +/** + Auxiliary function for all Test Cases + + The method is an override from CCoeControl. It returns the number of + controls contained in the compound control COpenFileList. + + */ +TInt COpenFileList::CountComponentControls() const + { + return 1; + } + +/** + Auxiliary function for all Test Cases + + The method is an override from CCoeControl. It returns the handle to list + box present on compound control COpenFileList. + + */ +CCoeControl* COpenFileList::ComponentControl(TInt aIndex) const + { + if (aIndex==0) + { + return iList; + } + return NULL; + } + + +/********************************************** + + + + CTBackupAppUi + + + +************************************************/ + +CTBackupAppUi::CTBackupAppUi(CTmsTestStep* aStep) : + CTestAppUi(aStep, KTBackupResourceFilePath)//, R_TBACKUP_HOTKEYS, R_TBACKUP_MENUBAR, R_TBACKUP_TOOLBAR) +/** + Constructor + */ + { + } +/** + Auxiliary function for all Test Cases + + This method creates a client interface to the backup server and performs the + following: + (a) Creates a background control. + (b) Creates backup observers and adds files to the observer. + (c) Creates an Application List from window groups. + (d) Creates a list for files attached to the observers. + + */ +void CTBackupAppUi::ConstructL() + { + CTestAppUi::ConstructL(); + iEikonEnv->SetSystem(ETrue); + iBackupSession=CBaBackupSessionWrapper::NewL(); + + CreateBackgroundL(); + CreateFileObserversL(); + CreateAppListL(); + CreateFileListL(); + CreateObserversListL(); + iBusyMsg = new (ELeave) CEikBusyMsgWin(*iEikonEnv); + iBusyMsg->ConstructL(iEikonEnv->RootWin()); + CTestAppUi::AutoTestManager().StartAutoTest(); + } + +CTBackupAppUi::~CTBackupAppUi() +/** + Destructor + */ + { + delete iBackdrop; + delete iAppList; + delete iFileList; + if (iFileObservers) + { + iFileObservers->ResetAndDestroy(); + delete iFileObservers; + } + iBackupOperationObserversWrapper.ResetAndDestroy(); + iBackupOperationObserversWrapper.Close(); + iBusyMsg->CancelDisplay(); + delete iBusyMsg; + delete iBackupSession; + } + +/** + Auxiliary function for all Test Cases + + The method is an override from CTestAppUi. The method initiates back up + tests. + + */ +void CTBackupAppUi::RunTestStepL(TInt aNextStep) + { + + switch(aNextStep) + { + case 1: + INFO_PRINTF1(_L("Test: List Apps.")); + SetTestStepID(_L("UIF-tbackup-CmdListAppsL")); + HandleCommandL(EBackupCmdListApps); + RecordTestResultL(); + INFO_PRINTF1(_L("List Apps Completed")); + break; + case 2: + INFO_PRINTF1(_L("Test: List Open Files.")); + SetTestStepID(_L("UIF-tbackup-CmdListOpenFilesL")); + HandleCommandL(EBackupCmdListOpenFiles); + RecordTestResultL(); + INFO_PRINTF1(_L("List Open Files Completed")); + break; + case 3: + INFO_PRINTF1(_L("Test: Close Files.")); + SetTestStepID(_L("UIF-tbackup-AutoCmdCloseL")); + HandleCommandL(EBackupCmdClose); + RecordTestResultL(); + INFO_PRINTF1(_L("Close Files Completed")); + break; + case 4: + INFO_PRINTF1(_L("Test: Restart.")); + SetTestStepID(_L("UIF-tbackup-AutoCmdRestartL")); + HandleCommandL(EBackupCmdRestart); + RecordTestResultL(); + INFO_PRINTF1(_L("Restart Completed")); + break; + case 5: + INFO_PRINTF1(_L("Test: CloseAllAndRestartAll.")); + SetTestStepID(_L("UIF-tbackup-AutoCmdCloseAllAndRestartAllL")); + HandleCommandL(EBackupCmdCloseAllAndRestartAll); + RecordTestResultL(); + INFO_PRINTF1(_L("CloseAllAndRestartAll Completed")); + break; + case 6: + INFO_PRINTF1(_L("Test: Register Objects.")); + SetTestStepID(_L("UIF-tbackup-AutoUpdateBackupObserverRegistrationL")); + HandleCommandL(EBackupCmdRegisterObs); + RecordTestResultL(); + INFO_PRINTF1(_L("Register Objects Completed.")); + + INFO_PRINTF1(_L("Test: Backup Operation.")); + SetTestStepID(_L("UIF-tbackup-AutoUpdateBackupOperationStateL")); + HandleCommandL(EBackupCmdBackupOperation); + RecordTestResultL(); + CloseTMSGraphicsStep(); + INFO_PRINTF1(_L("Completed: Backup Operation running...")); + User::After(TTimeIntervalMicroSeconds32(2000000)); + break; + case 7: + INFO_PRINTF1(_L("Test: Backup operation stop.")); + HandleCommandL(EBackupCmdDestroyBackupOperationClient); + INFO_PRINTF1(_L("Backup operation stop completed")); + break; + case 8: + INFO_PRINTF1(_L("Tests completed - End of Test.")); + CTestAppUi::AutoTestManager().FinishAllTestCases(CAutoTestManager::EPass); + break; + default: + break; + } + } + +/** + Auxiliary function for all Test Cases + + This method is called by CTBackupAppUi::RunTestStepL() to initiate the + tests. + + */ +void CTBackupAppUi::HandleCommandL(TInt aCommand) + { + switch (aCommand) + { + case EEikCmdExit: + Exit(); + break; + case EBackupCmdListApps: + CmdListAppsL(); + break; + case EBackupCmdListOpenFiles: + CmdListOpenFilesL(); + break; + case EBackupCmdClose: + AutoCmdCloseL(); + break; + case EBackupCmdRestart: + AutoCmdRestartL(); + break; + case EBackupCmdCloseAllAndRestartAll: + AutoCmdCloseAllAndRestartAllL(); + break; + case EBackupCmdRegisterObs: + AutoUpdateBackupObserverRegistrationL(); + break; + case EBackupCmdBackupOperation: + AutoUpdateBackupOperationStateL(); + break; + case EBackupCmdDestroyBackupOperationClient: + { + const TBool backupOperationRunning = iBackupSession->IsBackupOperationRunning(); + + if (backupOperationRunning) + { + iBusyMsg->CancelDisplay(); + } + + delete iBackupSession; + iBackupSession = NULL; + } + break; + default: + User::Leave(KErrNotSupported); + break; + } + } + +/** + Auxiliary function for all Test Cases + + This method creates the background control. + + */ +void CTBackupAppUi::CreateBackgroundL() + { + iBackdrop=CBackdrop::NewL(); + const TRect clientRect=ClientRect(); + iBackdrop->SetRect(clientRect); + iBackdrop->ActivateL(); + } + +/** + Auxiliary function for all Test Cases + + This method creates a List Box and adds the list of applications currently + running. + + */ +void CTBackupAppUi::CreateAppListL() + { + iAppList=new(ELeave) COpenAppList(); + iAppList->ConstructL(NULL,0); + TRect rect=ClientRect(); + rect.Shrink(TSize(20,20)); + iAppList->SetExtent(rect.iTl,rect.Size()); + iAppList->UpdateL(); + iAppList->ActivateL(); + } + +/** + Auxiliary function for all Test Cases + + This method prepares a list of files associated with each of the observers + and adds them to a List Box. + + */ +void CTBackupAppUi::CreateFileListL() + { + iFileList=new(ELeave) COpenFileList(*iFileObservers); + iFileList->ConstructL(); + TRect rect=ClientRect(); + rect.Shrink(TSize(20,20)); + iFileList->SetExtent(rect.iTl,rect.Size()); + iFileList->UpdateL(); + iFileList->ActivateL(); + iFileList->MakeVisible(EFalse); + } + +/** + Auxiliary function for all Test Cases + + This method creates 3 file observers to the backup server and associates + them with their respective files. + + */ +void CTBackupAppUi::CreateFileObserversL() + { + iFileObservers=new(ELeave) CArrayPtrFlat(3); + for (TInt ii=0;ii<3;ii++) + { + iFileObservers->AppendL(CBackupFileObserver::NewLC()); + CleanupStack::Pop(); // CBackupFileObserver + } + CBackupFileObserver* backup=(*iFileObservers)[0]; + backup->AddFileL(KBackupFile1); + backup->AddFileL(KBackupFile2); + backup->AddFileL(KBackupFile3); + backup=(*iFileObservers)[1]; + backup->AddFileL(KBackupFile1); + backup->AddFileL(KBackupFile3); + backup=(*iFileObservers)[2]; + backup->AddFileL(KBackupFile3); + } + +/** + Auxiliary function for all Test Cases + + This method creates observers for the backup operation. + + */ +void CTBackupAppUi::CreateObserversListL() + { + for (TInt ii=0; iiUpdateL(); + if (!iAppList->IsVisible()) + { + iFileList->MakeVisible(EFalse); + iAppList->MakeVisible(ETrue); + } + iAppList->DrawNow(); + } + +/** + @SYMTestCaseID UIF-tbackup-CmdListOpenFilesL + + @SYMPREQ + + @SYMTestCaseDesc Test retrieving the list of files associated with the file + observers. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions The method calls COpenAppList::UpdateL() to update the list of + files associated with each file observer and makes the file list visible + on the background control. The access rights to these files are also displayed. + + @SYMTestExpectedResults All files associated with file observers should be listed. + + */ +void CTBackupAppUi::CmdListOpenFilesL() + { + iFileList->UpdateL(); + if (!iFileList->IsVisible()) + { + iAppList->MakeVisible(EFalse); + iFileList->MakeVisible(ETrue); + } + iFileList->DrawNow(); + } + +/** + @SYMTestCaseID UIF-tbackup-CmdCloseL + + @SYMPREQ + + @SYMTestCaseDesc Test CloseFileL() & CloseAll() API's. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions The method opens the close dialog.The user selection of 'All' + or 'Single File' is recognised and CBaBackupSessionWrapper::CloseAll() or + CBaBackupSessionWrapper::CloseFileL() is invoked to stop writing to a + specified file or all files respectively. + + @SYMTestExpectedResults The test checks whether the status of the asynchronous + request is KErrInUse. + + */ +void CTBackupAppUi::CmdCloseL() + { + CDesCArray* files=new(ELeave) CDesCArrayFlat(3); + CleanupStack::PushL(files); + files->AppendL(KBackupFile1); + files->AppendL(KBackupFile2); + files->AppendL(KBackupFile3); + CBackupDialogBase::TOperationGranularity granularity; + TFileName fileName; + MBackupObserver::TFileLockFlags fileFlag; + + if (CBackupCloseDialog::RunDlgLD(*files,granularity,fileName,fileFlag)) + { + if (granularity==CBackupDialogBase::EAll) + { + TRequestStatus status=KRequestPending; + iBackupSession->CloseAll(fileFlag,status); + User::WaitForRequest(status); + } + else + { + iBackupSession->CloseFileL(fileName,fileFlag); + } + } + CleanupStack::PopAndDestroy(); // files + } + +/** + @SYMTestCaseID UIF-tbackup-AutoCmdCloseL + + @SYMPREQ + + @SYMTestCaseDesc Test CloseFileL() & CloseAll() API's. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions The method tests informing observers to stop writing to a specified + file by calling CBaBackupSessionWrapper::CloseFileL(). It also tests whether + CBaBackupSessionWrapper::CloseAll() closes all non-system applications and + calls all observers to stop writing to the registered files. + + @SYMTestExpectedResults The test checks whether the status of the asynchronous + request is KErrInUse. + + */ +void CTBackupAppUi::AutoCmdCloseL() + { + TFileName fileName; + MBackupObserver::TFileLockFlags fileFlag; + + fileFlag=MBackupObserver::EReleaseLockReadOnly; + fileName = KBackupFile1; + iBackupSession->CloseFileL(fileName,fileFlag); + + TRequestStatus status=KRequestPending; + + fileFlag=MBackupObserver::EReleaseLockReadOnly; + iBackupSession->CloseAll(fileFlag,status); + User::WaitForRequest(status); + + iBackupSession->RestartAll(); + fileFlag=MBackupObserver::EReleaseLockNoAccess; + iBackupSession->CloseAll(fileFlag,status); + User::WaitForRequest(status); + } + +/** + @SYMTestCaseID UIF-tbackup-CmdRestartL + + @SYMPREQ + + @SYMTestCaseDesc Test RestartFileL() & RestartAll() APIs. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions The method opens the backup restart dialog.The user selection + of 'All' or 'Single File' is recognised and + CBaBackupSessionWrapper::RestartAll() or + CBaBackupSessionWrapper::RestartFileL() is invoked to take back all file + locks on a specified file or on all files respectively. + + @SYMTestExpectedResults The checks whether the API CBaBackupSessionWrapper::RestartAll() + reverses a CBaBackupSessionWrapper::CloseAll() call. + + */ +void CTBackupAppUi::CmdRestartL() + { + CDesCArray* files=new(ELeave) CDesCArrayFlat(3); + CleanupStack::PushL(files); + files->AppendL(KBackupFile1); + files->AppendL(KBackupFile2); + files->AppendL(KBackupFile3); + CBackupDialogBase::TOperationGranularity granularity; + TFileName fileName; + + if (CBackupRestartDialog::RunDlgLD(*files,granularity,fileName)) + { + if (granularity==CBackupDialogBase::EAll) + { + iBackupSession->RestartAll(); + } + else + { + iBackupSession->RestartFile(fileName); + } + } + CleanupStack::PopAndDestroy(); // files + } + +/** + @SYMTestCaseID UIF-tbackup-AutoCmdRestartL + + @SYMPREQ + + @SYMTestCaseDesc Test RestartFileL() & RestartAll() APIs. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions The method tests informing all observers to take back the file + lock for the specified file by calling CBaBackupSessionWrapper::RestartFile(). + Similarly it also tests informing all observers to take back file locks for + the registered files by calling CBaBackupSessionWrapper::RestartAll() + + @SYMTestExpectedResults The method checks whether the API + CBaBackupSessionWrapper::RestartAll() reverses a + CBaBackupSessionWrapper::CloseAll() call. + + */ +void CTBackupAppUi::AutoCmdRestartL() + { + CDesCArray* files=new(ELeave) CDesCArrayFlat(3); + CleanupStack::PushL(files); + files->AppendL(KBackupFile1); + files->AppendL(KBackupFile2); + files->AppendL(KBackupFile3); + TFileName fileName; + + fileName = KBackupFile1; + iBackupSession->RestartFile(fileName); + + iBackupSession->RestartAll(); + + CleanupStack::PopAndDestroy(); // files + } + +/** + @SYMTestCaseID UIF-tbackup-AutoCmdCloseAllAndRestartAllL + + @SYMDEF DEF64721 + + @SYMTestCaseDesc Test CloseAll() & RestartAll() APIs. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions The method tests whether CBaBackupSessionWrapper::CloseAll() closes all + non-system applications and calls all observers to stop writing to the registered files. + Similarly it also tests informing all observers to take back file locks for + the registered files by calling CBaBackupSessionWrapper::RestartAll() + + @SYMTestExpectedResults The method checks whether the API + CBaBackupSessionWrapper::RestartAll() reverses a + CBaBackupSessionWrapper::CloseAll() call. + + */ +void CTBackupAppUi::AutoCmdCloseAllAndRestartAllL() + { + RApaLsSession apaLsSession; + apaLsSession.Connect(); + + CApaCommandLine* cmdLn=CApaCommandLine::NewLC(); + + _LIT(KLitExePath,"agenda.exe"); + cmdLn->SetExecutableNameL(KLitExePath); + + TThreadId tId; + TRequestStatus appStatus= KRequestPending; + + //Starting the application + TInt ret = apaLsSession.StartApp(*cmdLn,tId,&appStatus); // explicit + INFO_PRINTF2(_L("StartApp return code is %d"), ret); + TEST(ret==KErrNone); + User::WaitForRequest(appStatus); + + CleanupStack::PopAndDestroy(cmdLn); + + //Check whether the application is Started + TFullName repName; + _LIT(KAppName,"agenda*"); + {//(Scoped in order to reuse appThread) + TFindThread appThread(KAppName); + //TFindThread::Next gets the next thread that matches the pattern above + TEST(appThread.Next(repName) == KErrNone); + } + + RThread thread; + thread.Open(tId); + + MBackupObserver::TFileLockFlags fileFlag; + fileFlag=MBackupObserver::EReleaseLockReadOnly; + TRequestStatus closeallStatus = KRequestPending; + + //Closing all the non system applications + iBackupSession->CloseAll(fileFlag,closeallStatus); + //Wait till all the applications are closed + User::WaitForRequest(closeallStatus); + + //Check whether the agenda application is closed in CloseAll + TEST(thread.ExitType() != EExitPending); + + //Restarting All the nonsystem applications which are closed by previous CloseAll Call + iBackupSession->RestartAll(); + + //Check whether the application is Restarted + TFindThread appThread(KAppName); + TEST(appThread.Next(repName) == KErrNone); + + apaLsSession.Close(); + } + +/** + @SYMTestCaseID UIF-tbackup-UpdateBackupObserverRegistrationL + + @SYMPREQ + + @SYMTestCaseDesc Tests registering observers for back up operation. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions The method creates a backup registration dialog and adds check + boxes to represent all observers that are associated to each of the + wrappers. On click of OK button of the dialog all selected observers should + be registered with the backup server. + + @SYMTestExpectedResults The method should register all observers for backup + operation. + + */ +void CTBackupAppUi::UpdateBackupObserverRegistrationL() + { + CBackupRegistrationDialog* dialog = new(ELeave) CBackupRegistrationDialog(iBackupOperationObserversWrapper); + dialog->ConstructAutoDialogLC(EEikDialogFlagWait, R_EIK_BUTTONS_CANCEL_OK); + dialog->SetTitleL(KRegistrationDlgTitle); + const TInt count = iBackupOperationObserversWrapper.Count(); + TBuf<20> buf; + CBackupOpeartionObserversWrapper* observerWrapper = NULL; + TInt previousCount = 0; + for (TInt index1=0; index1CountObservers(); + for (TInt index2=0; index2CreateLineByTypeL(buf, EObserversId+realIndex, EEikCtCheckBox, NULL); + checkBox->SetSize(checkBox->MinimumSize()); + } + previousCount += count2; + } + dialog->RunLD(); + } + +/** + @SYMTestCaseID UIF-tbackup-AutoUpdateBackupObserverRegistrationL + + @SYMPREQ + + @SYMTestCaseDesc Tests registering observers for back up operation. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions The method finds the number of the observers that each interface + object CBackupOpeartionObserversWrapper has and registers each of its observers + to receive notification for backup operation by calling + CBackupOpeartionObserversWrapper::RegisterBackupOperationObserverL(). + + @SYMTestExpectedResults The method should register all observers for backup + operation. + + */ +void CTBackupAppUi::AutoUpdateBackupObserverRegistrationL() + { + //Following is copied from dialog->RunLD().... + const TInt count1 = iBackupOperationObserversWrapper.Count(); + CBackupOpeartionObserversWrapper* observerWrapper = NULL; + TInt previousCount = 0; + for (TInt index3=0; index3CountObservers(); + for (TInt index4=0; index4Observer(index4); + observerWrapper->RegisterBackupOperationObserverL(*observer); + } + previousCount += count2; + } + } + +/** + @SYMTestCaseID UIF-tbackup-UpdateBackupOperationStateL + + @SYMPREQ + + @SYMTestCaseDesc Manual Test to start / end back up operation. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions The method displays the backup operation dialog with option + buttons labelled 'Start' or 'End'. On click of OK button the state of + option buttons is verified and backup operation is started or ended. + + @SYMTestExpectedResults The method CBaBackupSessionWrapper::IsBackupOperationRunning() + is invoked to verify the start of backup operation. + + */ +void CTBackupAppUi::UpdateBackupOperationStateL() + { + CEikDialog* dialog = new(ELeave) CBackupOperationDialog(*iBackupSession); + dialog->ExecuteLD(R_TBACKUP_BACKUP_OPERATION); + const TBool backupOperationRunning = iBackupSession->IsBackupOperationRunning(); + if (backupOperationRunning) + { + iBusyMsg->StartDisplay(KBackupOpMsg, TGulAlignment(EHLeftVTop)); + } + else + { + iBusyMsg->CancelDisplay(); + } + } + +/** + @SYMTestCaseID UIF-tbackup-AutoUpdateBackupOperationStateL + + @SYMPREQ + + @SYMTestCaseDesc Test starting of back up operation. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions The method prepares the attributes to start the backup operation + and notifies the server to start a backup operation by calling + CBaBackupSessionWrapper::NotifyBackupOperationL(). The method then checks + whether the backup operation has started by calling + CBaBackupSessionWrapper::IsBackupOperationRunning(). Note that on start of + backup operation CBackupOpeartionObserver::HandleBackupOperationEventL() is + invoked by the server to notify client of backup start oiperation. + + @SYMTestExpectedResults The method CBaBackupSessionWrapper::IsBackupOperationRunning() + should return ETrue to indicate the start of backup operation. + + */ +void CTBackupAppUi::AutoUpdateBackupOperationStateL() + { + + //From dialog OKToExit + + const TInt labeledButtonId = EDlgBackupOperationSel1; + + //Another test case is required. + //labeledButtonId = EDlgBackupOperationSel2; + + TBackupOperationAttributes backupOperationAttributes; + switch (labeledButtonId) + { + case EDlgBackupOperationSel1: + { + backupOperationAttributes.iFileFlag = MBackupObserver::EReleaseLockReadOnly; + backupOperationAttributes.iOperation = MBackupOperationObserver::EStart; + break; + } + case EDlgBackupOperationSel2: + { + backupOperationAttributes.iFileFlag = MBackupObserver::ETakeLock; + backupOperationAttributes.iOperation = MBackupOperationObserver::EEnd; + break; + } + default: + //return EFalse; + break; + } + + iBackupSession->NotifyBackupOperationL(backupOperationAttributes); + + // Run backup operation. This continues to run until the cancel backup command is + // chosen. + const TBool backupOperationRunning = iBackupSession->IsBackupOperationRunning(); + + if (backupOperationRunning) + { + iBusyMsg->StartDisplay(KBackupOpMsg, TGulAlignment(EHLeftVTop)); + } + else + { + iBusyMsg->CancelDisplay(); + } + } + +/********************************************** + + + + CTestBackupStep + + + +************************************************/ +CTestBackupStep::CTestBackupStep() +/** + Constructor + */ + { + SetTestStepName(KTestBackupStep); + } + +CTestBackupStep::~CTestBackupStep() +/** + Destructor + */ + { + } + +/** + Auxiliary function for all Test Cases + + The method creates & sets the application's user interface object. + + */ +void CTestBackupStep::ConstructAppL(CEikonEnv* aCoe) + { // runs inside a TRAP harness + aCoe->ConstructL(); + + CTestAppUi* appUi= new (ELeave) CTBackupAppUi(this); + aCoe->SetAppUi(appUi); + appUi->ConstructL(); + } + +/** + Auxiliary function for all Test Cases + + The method creates & sets the test step's user interface object and + launches the test step. + + */ +TVerdict CTestBackupStep::doTestStepL() // main function called by E32 + { + PreallocateHALBuffer(); + __UHEAP_MARK; + + CEikonEnv* coe=new CEikonEnv; + TRAPD(err,ConstructAppL(coe)); + + if (!err) + coe->ExecuteD(); + + REComSession::FinalClose(); + __UHEAP_MARKEND; + + return TestStepResult(); + } + +