--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/appfw/apparchitecture/tef/T_ProStep.cpp Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,1546 @@
+// Copyright (c) 2007-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 Application Apparc base classes and utility functions to get application's data.\n
+//
+// t_prostep.cpp
+//
+
+/**
+ @file t_prostep.cpp
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <f32file.h>
+#include <fbs.h>
+#include <s32std.h>
+#include <s32stor.h>
+#include <s32file.h>
+#include <ecom/ecom.h>
+
+#include <apaid.h>
+#include "../apparc/apadll.h"
+#include "../apgrfx/APGSTD.H"
+#include <apgaplst.h>
+#include <apgicnfl.h>
+#include <apgdoor.h>
+#include <apfrec.h>
+#include <apfctlf.h>
+#include <apgctl.h>
+#include <apgaplst.h>
+#include <apaflrec.h>
+#include "testableapalssession.h"
+#include <apacmdln.h>
+
+#include "T_ProStep.h"
+#include "tstapp.h"
+#include "appfwk_test_utils.h"
+
+#if !defined(__E32TEST_H__)
+#include <e32test.h>
+#endif
+
+TInt PanicTestThread(TAny* aOption);
+
+enum TPanicOption
+ {
+ EFirst,
+ ENegativePanicTest,
+ EUnknownPanicOption,
+ ELast
+ };
+
+
+_LIT(KCTLDIR,"C:\\private\\10003a3f\\import\\apps\\");
+_LIT(KSOURCEPATH,"z:\\private\\10003a3f\\import\\apps\\m_ctrl_reg.rsc");
+_LIT(KNEWCTLPATH,"C:\\private\\10003a3f\\import\\apps\\m_ctrl_reg.rsc");
+_LIT(KNEWPATH,"C:\\cm.txt");
+_LIT(KEMPTYFILEPATH,"z:\\system\\data\\Testpath\\FilterTests\\testfile1.txt");
+
+_LIT(KRSCDIR,"C:\\Resource\\apps\\");
+_LIT(KLOCPATH,"z:\\Resource\\apps\\M_ctrl_loc.rsc");
+_LIT(KNEWLOCPATH,"C:\\Resource\\apps\\M_ctrl_loc.rsc");
+_LIT(KCTRLNAME,"C:\\sys\\bin\\m_ctrl.exe");
+TFileName ctlPath=_L("z:\\sys\\bin\\m_ctrl.exe");
+
+
+LOCAL_D TInt SimulateKeyL(TAny*)
+ {
+ User::After(3000000);
+ RWsSession session;
+ User::LeaveIfError(session.Connect());
+
+ //control down
+ TRawEvent rawEvent;
+ rawEvent.Set(TRawEvent::EKeyDown,EStdKeyLeftCtrl);
+ session.SimulateRawEvent(rawEvent);
+
+ // e down
+ rawEvent.Set(TRawEvent::EKeyDown,'E');
+ session.SimulateRawEvent(rawEvent);
+
+ // e up
+ rawEvent.Set(TRawEvent::EKeyUp,'E');
+ session.SimulateRawEvent(rawEvent);
+
+ //control up
+ rawEvent.Set(TRawEvent::EKeyUp,EStdKeyLeftCtrl);
+ session.SimulateRawEvent(rawEvent);
+
+ session.Flush();
+ session.Close();
+
+ return KErrNone;
+ }
+
+void CT_ProStep::setup()
+ {
+#if defined(__EPOC32__)
+ TFullName filePath=_L("c:\\docs\\tstapp.doc");
+ TFullName tempPath=_L("c:\\system\\temp\\");
+ // if we're on the rack create the directories we need
+ TParse parser;
+ parser.Set(filePath,NULL,NULL);
+ iFs.MkDirAll(parser.DriveAndPath());
+ parser.Set(tempPath,NULL,NULL);
+ iFs.MkDirAll(parser.DriveAndPath());
+#endif
+ }
+
+
+/**
+ @SYMTestCaseID T-ProStep-testAppIdentifierL
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc Tests TApaAppIdentifier API.
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Create a temporary store. Construct an application identifier
+ for the specified application DLL, and Uid. Call WriteAppIdentifierL() to
+ store application identifier details. Read the stored application identifier
+ details.\n
+ API Calls:\n
+ TApaAppIdentifier::TApaAppIdentifier(TUid aAppUidType,const TFileName& aDllName)\n
+ CApaProcess::WriteAppIdentifierL(CStreamStore& aStore,CStreamDictionary& aStreamDic,const TApaAppIdentifier& aAppId)\n
+ CApsProcess::ReadAppIdentifierL(const CStreamStore& aStore,const CStreamDictionary& aStreamDic)\n
+
+ @SYMTestExpectedResults Test checks whether stored and read application
+ identifier details match.
+
+ */
+void CT_ProStep::testAppIdentifierL()
+ {
+ const TFullName tempPath=_L("c:\\system\\temp\\");
+ const TUid testUid={1};
+
+ INFO_PRINTF1(_L("Testing TApaAppIdentifier"));
+
+ // create a process
+ TRAPD(ret,iProcess = CApaProcess::NewL(iFs));
+ TEST(ret==KErrNone);
+
+ // create a temporary store and stream dictionary
+ TParse newFilePath;
+ HBufC* related = HBufC::NewL(20);
+ (*related)=_L("temp.idf");
+ newFilePath.Set(tempPath,related,NULL);
+ delete related;
+ iFs.MkDirAll(newFilePath.DriveAndPath());
+ CDirectFileStore* store = CDirectFileStore::ReplaceLC(iFs,newFilePath.FullName(),EFileWrite);
+ store->SetTypeL(TUidType(KDirectFileStoreLayoutUid,testUid,testUid));
+ CStreamDictionary* streamDic=CStreamDictionary::NewL();
+ CleanupStack::PushL(streamDic);
+
+ // set up an id
+ TApaAppIdentifier* origId=new(ELeave) TApaAppIdentifier (testUid,_L("FileName"));
+ CleanupStack::PushL(origId);
+
+ // write it out and read it in again
+ iProcess->WriteAppIdentifierL(*store,*streamDic,*origId);
+ TApaAppIdentifier* copyId=new(ELeave) TApaAppIdentifier();
+ *copyId=iProcess->ReadAppIdentifierL(*store,*streamDic);
+
+ CleanupStack::PushL(copyId);
+ TEST((origId->iAppUid==copyId->iAppUid));
+ TEST((origId->iFullName==copyId->iFullName));
+
+ // tidy up
+ CleanupStack::PopAndDestroy(4); // store,streamDic,origId,copyId
+ delete iProcess;
+ iFs.Delete(newFilePath.FullName());
+ }
+
+
+/**
+ @SYMTestCaseID T-ProStep-doTestGenerateFileName
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc Tests CApaApplication::GenerateFileName().
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Call GenerateFileName() under following scenarios:\n
+ (1) when root name doesn't exist\n
+ (2) when root name exists\n
+ (3) when illegal paths are mentioned.\n
+ (4) when no memory is available to perfom the operation.\n
+ API Calls:\n
+ CApaApplication::GenerateFileName(RFs& aFs,TFileName& aRootName)\n
+
+ @SYMTestExpectedResults Test should return the desired filename or error
+ code for each scenario
+
+ */
+void CT_ProStep::doTestGenerateFileName()
+ {
+ TFileName rootName;
+
+ // delete the test files just in case...
+ iFs.Delete(_L("c:\\path\\name"));
+ iFs.Delete(_L("c:\\path\\name.ext"));
+
+ // try it with a root that doesn't exist
+ rootName = _L("c:\\path\\name");
+ TInt ret=CApaApplication::GenerateFileName(iFs,rootName);
+ TEST(ret==KErrNone);
+ TEST(rootName.CompareF(_L("c:\\path\\name"))==0);
+
+ // try it with a root (inc ext) that doesn't exist
+ rootName = _L("c:\\path\\name.ext");
+ ret=CApaApplication::GenerateFileName(iFs,rootName);
+ TEST(ret==KErrNone);
+ TEST(rootName.CompareF(_L("c:\\path\\name.ext"))==0);
+
+ // create a couple of files
+ RFile file;
+ file.Create(iFs,_L("c:\\path\\name"),EFileWrite);
+ file.Close();
+ file.Create(iFs,_L("c:\\path\\name.ext"),EFileWrite);
+ // file.Close(); // purposely don't close this one
+
+ // try it with a root that exists
+ rootName = _L("c:\\path\\name");
+ ret=CApaApplication::GenerateFileName(iFs,rootName);
+ TEST(ret==KErrNone);
+ TEST(rootName.CompareF(_L("c:\\path\\name(01)"))==0);
+
+ // try it with a root (inc ext) that exists
+ rootName = _L("c:\\path\\name.ext");
+ ret=CApaApplication::GenerateFileName(iFs,rootName);
+ TEST(ret==KErrNone);
+ TEST(rootName.CompareF(_L("c:\\path\\name(01).ext"))==0);
+
+ // try with illegal paths
+ rootName = _L("c:name");
+ ret=CApaApplication::GenerateFileName(iFs,rootName);
+ TEST((ret==KErrArgument));
+ rootName = _L("\\dir\\name");
+ ret=CApaApplication::GenerateFileName(iFs,rootName);
+ TEST((ret==KErrArgument));
+ rootName = _L("c:\\dir\\");
+ ret=CApaApplication::GenerateFileName(iFs,rootName);
+ TEST((ret==KErrBadName));
+
+ // try when no memory is available to perform the operation.
+ // (we haven't used a conventional OOM loop, but this is not a leaving function)
+ __UHEAP_MARK;
+ __UHEAP_SETFAIL(RHeap::EDeterministic,1);
+ rootName = _L("c:\\path\\nomemory.ext");
+ ret=CApaApplication::GenerateFileName(iFs,rootName);
+ TEST(ret==KErrNoMemory);
+ __UHEAP_MARKEND;
+ __UHEAP_RESET;
+ // tidy up
+ file.Close();
+ iFs.Delete(_L("c:\\path\\name"));
+ iFs.Delete(_L("c:\\path\\name.ext"));
+
+ }
+
+/**
+ @SYMTestCaseID APPFWK-APPARC-0055
+
+ @SYMDEF DEF092509
+
+ @SYMTestCaseDesc Tests CApaProcess::ReadRootStreamLC ().
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Call ReadRootStreamLC() under following scenarios:\n
+ (1) when File name Doesnt Exists\n
+ (2) When an empty file is present \n
+
+
+
+ @SYMTestExpectedResults Test should return KErrNotFound for scenario (1). And error
+ KErrEof orKErrCorrupt for scenario (2).
+
+ */
+
+ void CT_ProStep::testReadStreamL()
+
+ {
+ CFileStore* docStore=NULL;
+ TUint appFileMode=EFileRead|EFileWrite;
+ CStreamDictionary* streamDic=NULL;
+ TRAPD(err,streamDic=CApaProcess::ReadRootStreamLC(iFs,docStore,KNEWPATH,appFileMode));
+ TEST(err==KErrNotFound);
+
+ delete docStore;
+ delete streamDic;
+ docStore=NULL;
+ streamDic=NULL;
+ appFileMode=EFileRead;
+ TRAP(err,streamDic=CApaProcess::ReadRootStreamLC(iFs,docStore,KEMPTYFILEPATH,appFileMode));
+ TEST(err==KErrCorrupt || err==KErrEof);
+ }
+/**
+ @SYMTestCaseID T-ProStep-testDocCreation1L
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc Tests CApaProcess::AddNewDocumentL().
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Create a process, call AddNewDocumentL() to create a new
+ document for an app DLL by\n
+ (1) passing full path of app.\n
+ (2) passing full path of app and the Uid.\n
+ In both cases call DestroyDocument() to destroy the document thus created.\n
+ API Calls:\n
+ CApaProcess::NewL(const RFs& aFs,CApaAppFinder& aAppFinder)\n
+ CApaProcess::AddNewDocumentL(const TDesC& aDllFileName,TUid aDllUid=KNullUid)\n
+ CApaProcess::DestroyDocument(CApaDocument* aDoc)\n
+ CApaProcess::ResetL()\n
+
+ @SYMTestExpectedResults Test checks results against expected values.
+
+ */
+void CT_ProStep::testDocCreation1L()
+ {
+ const TFullName filePath=_L("c:\\docs\\tstapp.doc");
+
+ INFO_PRINTF1(_L("Testing CApaProcess"));
+
+ iFs.MkDirAll(filePath);
+ // delete the file to be created by the testcode
+ iFs.Delete(filePath);
+
+ // create a process
+ TRAPD(ret,iProcess = CApaProcess::NewL(iFs));
+ TEST(ret==KErrNone);
+
+ // create a new doc passing the full path of the app dll
+ CApaDocument* doc=NULL;
+ TApaApplicationFactory appFact(KUidTestApp);
+ TRAP(ret,doc=iProcess->AddNewDocumentL(appFact));
+ TEST(ret==KErrNone);
+ iProcess->DestroyDocument(doc);
+ doc = NULL;
+ TRAP(ret,iProcess->ResetL());
+ TEST(ret==KErrNone);
+ }
+
+
+/**
+ @SYMTestCaseID T-ProStep-testDocCreation2L
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc Tests CApaProcess::AddNewDocumentL().
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Call AddNewDocumentL() to create a new document for an app DLL.
+ Set it as the main document. Associate it with a temporary store. Initialize
+ the document to default settings. Store the document.\n
+ API Calls:\n
+ CApaProcess::AddNewDocumentL(const TDesC& aDllFileName,TUid aDllUid=KNullUid)\n
+ CApaDocument::NewDocumentL()\n
+ CApaDocument::SaveL()\n
+
+ @SYMTestExpectedResults Test checks results against expected values.
+
+ */
+void CT_ProStep::testDocCreation2L()
+ {
+ const TFullName filePath=_L("c:\\docs\\tstapp.doc");
+ CApaDocument* doc=NULL;
+
+ TApaApplicationFactory appFact(KUidTestApp);
+ TRAPD(ret,doc=iProcess->AddNewDocumentL(appFact));
+ TEST(ret==KErrNone);
+ iProcess->SetMainDocument(doc);
+ CFileStore* store=NULL;
+
+ // create the store and initialise it
+ TRAP(ret, {
+ store=doc->CreateFileStoreLC(iProcess->FsSession(),filePath);
+ CleanupStack::Pop(); // store
+ });
+ TEST(ret==KErrNone);
+ ((CTestAppDoc*)iProcess->MainDocument())->iStore = store;
+ iProcess->SetMainDocFileName(filePath);
+
+ // initialise the document with factory settings
+ TRAP(ret, doc->NewDocumentL() );
+ TEST(ret==KErrNone);
+
+ // close it
+ TRAP(ret,doc->SaveL());
+ TEST(ret==KErrNone);
+ TRAP(ret, iProcess->ResetL() );
+ TEST(ret==KErrNone);
+ store = NULL;
+ doc = NULL;
+ }
+
+/**
+ @SYMTestCaseID T-ProStep-testDocCreation3L
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc Tests CApaProcess::OpenNewDocumentL() and CApaAppFileReader APIs.
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Create a document from a specified file. Set it as main
+ document file. Create a CApaAppInfoFileReader object by calling
+ OpenAppInfoFileL(). Use CaptionL() and CreateMaskedBitmapL() to read
+ application information like caption and bitmap.\n
+ API Calls:\n
+ CApaProcess::OpenNewDocumentL(CFileStore*& aStore,CStreamDictionary*& aStreamDic,const TDesC& aDocFullFileName,TUint aFileMode);\n
+ CApaApplication::OpenAppInfoFileL() const\n
+ CApaAppInfoFileReader::CaptionL(TLanguage aLanguage)\n
+ CApaAppInfoFileReader::CreateMaskedBitmapL(TInt aIconSideInPixels)\n
+
+ @SYMTestExpectedResults Test checks results against expected values.
+
+ */
+CApaDocument* CT_ProStep::testDocCreation3L()
+ {
+ // try re-opening it
+ const TFullName filePath=_L("c:\\docs\\tstapp.doc");
+ CStreamDictionary* streamDic=NULL;
+ CApaDocument* doc=NULL;
+ CFileStore* store=NULL;
+ TRAPD(ret,doc=iProcess->OpenNewDocumentL(store,streamDic,filePath,EFileShareExclusive|EFileWrite));
+ TEST(ret==KErrNone);
+ delete streamDic;
+ streamDic = NULL;
+ iProcess->SetMainDocument(doc);
+ iProcess->SetMainDocFileName(filePath);
+ ((CTestAppDoc*)iProcess->MainDocument())->iStore = store;
+
+ // remove the main document
+ iProcess->DestroyDocument(iProcess->MainDocument());
+ TEST(iProcess->MainDocument()==NULL);
+
+ // try re-opening the doc without the app in memory
+ TRAP(ret,iProcess->ResetL());
+ TEST(ret==KErrNone);
+ delete iProcess;
+ return doc;
+ }
+
+
+/**
+ @SYMTestCaseID T-ProStep-testDocCreation4L
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc Tests CApaProcess::OpenNewDocumentL().
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Create a Process. Create a document for an app DLL from a
+ specified file by calling OpenNewDocumentL(). Call DestroyDocument() to
+ delete the document.\n
+ API Calls:\n
+ CApaProcess::OpenNewDocumentL(CFileStore*& aStore,CStreamDictionary*& aStreamDic,const TDesC& aDocFullFileName,TUint aFileMode);\n
+ CApaProcess::DestroyDocument(CApaDocument* aDoc)\n
+
+ @SYMTestExpectedResults Test checks results against expected values.
+
+ */
+void CT_ProStep::testDocCreation4L(CApaDocument* aDoc)
+ {
+ const TFullName filePath=_L("c:\\docs\\tstapp.doc");
+ CStreamDictionary* streamDic=NULL;
+ CFileStore* store=NULL;
+ TRAPD(ret,iProcess = CApaProcess::NewL(iFs));
+ TEST(ret==KErrNone);
+ TRAP(ret,aDoc=iProcess->OpenNewDocumentL(store,streamDic,filePath,EFileShareExclusive|EFileWrite));
+ TEST(ret==KErrNone);
+ iProcess->DestroyDocument(aDoc);
+ delete store;
+ delete streamDic;
+
+ // tidy up
+ TRAP(ret,iProcess->ResetL());
+ TEST(ret==KErrNone);
+ delete iProcess;
+
+ // delete the file created by the testcode
+ iFs.Delete(filePath);
+ }
+
+
+/**
+ Auxiliary Fn for Test Case ID T-ProStep-testDocCreation1L, T-ProStep-testDocCreation2L,
+ T-ProStep-testDocCreation3L, T-ProStep-testDocCreation4L.
+
+ The method initiates tests on operation such as creation, storing
+ and deletion of a document.
+
+*/
+void CT_ProStep::testDocCreationL()
+ {
+ //Create a session with F & B server
+ TInt ret = RFbsSession::Connect();
+ TEST(ret == KErrNone);
+
+ testDocCreation1L();
+ testDocCreation2L();
+ testDocCreation4L(testDocCreation3L());
+
+ //Close the session F & B server.
+ RFbsSession::Disconnect();
+ }
+
+/**
+ @SYMTestCaseID T-ProStep-testEmbeddingL
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc Tests embedding of a document and accessing the embedded document.
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The test connects to the Font and Bitmap Server and creates a
+ process by calling CApaProcess::NewL().
+ The method first tests the embedding of document. To do so a document of
+ type tstapp is added to the process and set as the main document. The main
+ document is opened for editing by calling CApaDocument::EditL() and another
+ document of type tstapp is created to embed it within the main document.
+ Tests for the number of embedded documents and editing of the embedded
+ document is done. The main document is closed and then reloaded to verify
+ that the embedded document is saved.\n
+ A test to access the embedded document is then done. For this purpose the
+ main document is detached from its store by calling CApaDocument::DetachFromStoreL()
+ and an attempt to access the embedded document is done by calling CApaDocument::DocumentL().
+ The same test to access the embedded document is again done by reloading
+ the main document without detaching it from its store.\n
+ Finally embedded document is tested to change the format of the door to
+ glass by calling CApaDoor::SetFormatToGlassL(). The test ensures that the
+ embedded document does not support being represented by a glass door by
+ checking for leave KErrNotSupported.\n Then the same embedded document is supported when being
+ called by CApaDoor::SetFormatToIconL() and returns KErrNone.
+ API Calls:\n
+ CApaProcess::NewL(const RFs& aFs,CApaAppFinder& aAppFinder)\n
+ CApaProcess::AddNewDocumentL(const TDesC& aDllFileName,TUid aDllUid=KNullUid)\n
+ CApaDocument::EditL(MApaEmbeddedDocObserver* aContainer,TBool aReadOnly=EFalse) = 0\n
+ CApaDocument::DetachFromStoreL(CPicture::TDetach aDegree = CPicture::EDetachFull)\n
+ CApaDoor::DocumentL(TBool aCheckPassword=EFalse)\n
+ CApaDoor::SetFormatToGlassL()\n
+ CApaDoor::SetFormatToIconL()\n
+
+ @SYMTestExpectedResults All tests completes successfully by checking the
+ results obtained against expected results.
+
+ */
+void CT_ProStep::testEmbeddingL()
+ {
+ const TFullName filePath=_L("c:\\docs\\tstapp.doc");
+
+ //Create a session with F & B server
+ TInt ret=RFbsSession::Connect();
+ TEST(ret == KErrNone);
+
+ // delete the file to be created by the testcode
+ iFs.Delete(filePath);
+ // create a process
+ TRAP(ret,iProcess = CApaProcess::NewL(iFs));
+ TEST(ret==KErrNone);
+
+ // create a new main doc of type tstapp
+ CApaDocument* doc=NULL;
+ TApaApplicationFactory appFact(KUidTestApp);
+ TRAP(ret,doc=iProcess->AddNewDocumentL(appFact));
+ TEST(ret==KErrNone);
+ iProcess->SetMainDocument(doc);
+ CFileStore* store=NULL;
+
+ // create the store and initialise it
+ TRAP(ret, {
+ store=doc->CreateFileStoreLC(iProcess->FsSession(),filePath);
+ CleanupStack::Pop(); // store
+ });
+ TEST(ret==KErrNone);
+ ((CTestAppDoc*)iProcess->MainDocument())->iStore = store;
+ iProcess->SetMainDocFileName(filePath);
+
+ // initialise the document with factory settings
+ TRAP(ret, doc->NewDocumentL() );
+ TEST(ret==KErrNone);
+
+ // edit it
+ TRAP(ret,iProcess->MainDocument()->EditL(NULL));
+ TEST(ret==KErrNone);
+
+ // embed another tstapp doc inside it
+ INFO_PRINTF1(_L("...Embed a doc"));
+ TRAP(ret,((CTestAppDoc*)iProcess->MainDocument())->EmbedNewDocL(appFact));
+ TEST(ret==KErrNone);
+ TEST(((CTestAppDoc*)iProcess->MainDocument())->iEmbedList->Count()==1);
+
+ // edit that doc
+ TRAP(ret,((CTestAppDoc*)iProcess->MainDocument())->EditEmbeddedDocL(0));
+ TEST(ret==KErrNone);
+
+ // close the main doc and reload it
+ TRAP(ret,iProcess->MainDocument()->SaveL());
+ TEST(ret==KErrNone);
+ TRAP(ret, iProcess->ResetL() );
+ TEST(ret==KErrNone);
+ CStreamDictionary* streamDic=NULL;
+ TRAP(ret,doc=iProcess->OpenNewDocumentL(store,streamDic,filePath,EFileShareExclusive|EFileWrite));
+ TEST(ret==KErrNone);
+ delete streamDic;
+ streamDic = NULL;
+ iProcess->SetMainDocument(doc);
+ iProcess->SetMainDocFileName(filePath);
+ ((CTestAppDoc*)iProcess->MainDocument())->iStore = store;
+ TEST(((CTestAppDoc*)iProcess->MainDocument())->iEmbedList->Count()==1);
+
+ // close the main doc and reload it again...
+ TRAP(ret,iProcess->MainDocument()->SaveL());
+ TEST(ret==KErrNone);
+ iProcess->ResetL();
+ TRAP(ret,doc=iProcess->OpenNewDocumentL(store,streamDic,filePath,EFileShareExclusive|EFileWrite));
+ TEST(ret==KErrNone);
+ delete streamDic;
+ streamDic = NULL;
+ iProcess->SetMainDocument(doc);
+ iProcess->SetMainDocFileName(filePath);
+ ((CTestAppDoc*)iProcess->MainDocument())->iStore = store;
+ TEST(((CTestAppDoc*)iProcess->MainDocument())->iEmbedList->Count()==1);
+
+ // detach the main doc from it's store & access the embedded doc
+ TRAP(ret, iProcess->MainDocument()->DetachFromStoreL(CPicture::EDetachFull) );
+ TEST(ret==KErrNone);
+ TRAP(ret, ((CTestAppDoc*)iProcess->MainDocument())->EmbeddedDoor(0)->DocumentL() );
+ TEST(ret==KErrNone);
+
+ // save it, then save it again immediately
+ TRAP(ret,iProcess->MainDocument()->SaveL());
+ TEST(ret==KErrNone);
+ TRAP(ret,iProcess->MainDocument()->SaveL());
+ TEST(ret==KErrNone);
+
+ // load the doc and get a handle to the embedded doc
+ iProcess->ResetL();
+ TRAP(ret,doc=iProcess->OpenNewDocumentL(store,streamDic,filePath,EFileShareExclusive|EFileWrite));
+ TEST(ret==KErrNone);
+ delete streamDic;
+ streamDic = NULL;
+ iProcess->SetMainDocument(doc);
+ iProcess->SetMainDocFileName(filePath);
+ ((CTestAppDoc*)iProcess->MainDocument())->iStore = store;
+ TEST(((CTestAppDoc*)iProcess->MainDocument())->iEmbedList->Count()==1);
+ TRAP(ret, ((CTestAppDoc*)iProcess->MainDocument())->EmbeddedDoor(0)->DocumentL() );
+ TEST(ret==KErrNone);
+
+ // try to set the embedded doc's format to glass
+ TRAP(ret, ((CTestAppDoc*)iProcess->MainDocument())->EmbeddedDoor(0)->SetFormatToGlassL() );
+ TEST((ret==KErrNotSupported));
+
+ // try to set the embedded docs to temporary Icon
+ TRAP(ret, ((CTestAppDoc*)iProcess->MainDocument())->EmbeddedDoor(0)->SetFormatToTemporaryIconL(ETrue) );
+ TEST((ret==KErrNone));
+
+ // try to set embedded doc's format to Icon
+ TRAP(ret, ((CTestAppDoc*)iProcess->MainDocument())->EmbeddedDoor(0)->SetFormatToIconL() );
+ TEST((ret==KErrNone));
+
+ // tidy up and delete the file created by the testcode
+ delete iProcess;
+ iFs.Delete(filePath);
+
+ //Close the session F & B server.
+ RFbsSession::Disconnect();
+ }
+
+_LIT(KMaxLengthDocFileName, "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"); // length must be equal to KMaxFileName
+
+void CT_ProStep::MainDocFileNameTestsL()
+ {
+ testMainDocFileName1L();
+ testMainDocFileName2L();
+ testMainDocFileName3L();
+ }
+ /**
+ @SYMTestCaseID CT-ProStep-testMainDocFileName1L
+
+ @SYMPREQ PHAR-5NTCWY
+
+ @SYMTestCaseDesc
+ Checks that the CApaProcess's MainDocFileName is large enough by default.
+ Clients of CApaProcess::SetMainDocFileName API expect to be able to
+ pass it a descriptor with a length between zero and KMaxFileName inclusive.
+ Check that passing a descriptor of length KMaxFileName doesn't give an
+ APPARC 7 panic (EPanicFileNameTooLong)
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions
+ Construct a CApaProcess object, and call SetMainDocFileName on it, passing
+ a file name KMaxFileName characters long
+
+ @SYMTestExpectedResults
+ The call to CApaProcess::SetMainDocFileName should not cause a panic
+
+ */
+void CT_ProStep::testMainDocFileName1L()
+ {
+ CApaProcess* process = CApaProcess::NewL(iFs);
+ process->SetMainDocFileName(KMaxLengthDocFileName); // should not panic
+ delete process;
+ }
+
+ /**
+ @SYMTestCaseID CT-ProStep-testMainDocFileName2L
+
+ @SYMPREQ PHAR-5NTCWY
+
+ @SYMTestCaseDesc
+ Checks that the maximum length of CApaProcess's MainDocFileName is still large
+ enough to store a file name KMaxFileName characters long after setting a file name using
+ CApaProcess::SetMainDocFileNameL which is less than KMaxFileName characters long
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions
+ 1. Construct a CApaProcess object, and call SetMainDocFileNameL on it, passing
+ a file name which is less than KMaxFileName characters long
+ 2. Call SetMainDocFileName passing a file name which is KMaxFileName characters long
+
+ @SYMTestExpectedResults
+ The call to CApaProcess::SetMainDocFileName should not cause a panic
+
+ */
+void CT_ProStep::testMainDocFileName2L()
+ {
+ _LIT(KShortDocFileName, "ShortDocumentFileName"); // must be < KMaxFileName in length
+ CApaProcess* process = CApaProcess::NewL(iFs);
+ CleanupStack::PushL(process);
+ process->SetMainDocFileNameL(KShortDocFileName);
+ process->SetMainDocFileName(KMaxLengthDocFileName); // should not panic
+ CleanupStack::PopAndDestroy(process);
+ }
+
+ /**
+ @SYMTestCaseID CT-ProStep-testMainDocFileName3L
+
+ @SYMPREQ PHAR-5NTCWY
+
+ @SYMTestCaseDesc
+ Checks that CApaProcess's MainDocFileName can store a filename longer than KMaxFileName
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions
+ 1. Construct a CApaProcess object, and call SetMainDocFileNameL on it, passing
+ a file name which is greater than KMaxFileName characters long
+ 2. Check the length of the file name returned by MainDocFileName
+
+ @SYMTestExpectedResults
+ The file name returned by MainDocFileName should be the same length as the file name
+ passed to SetMainDocFileNameL
+
+ */
+void CT_ProStep::testMainDocFileName3L()
+ {
+ _LIT(KLongDocFileName, "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefLong"); // must be > KMaxFileName in length
+ TPtrC longDocFileName(KLongDocFileName);
+ CApaProcess* process = CApaProcess::NewL(iFs);
+ CleanupStack::PushL(process);
+ process->SetMainDocFileNameL(longDocFileName);
+ TEST(process->MainDocFileName().Length() == longDocFileName.Length());
+ CleanupStack::PopAndDestroy(process);
+ }
+
+/**
+ @SYMTestCaseID T-ProStep-testIniFilesL
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc Tests creation of ini file and reading or writing of data to an ini file.
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Create a Process. Add a new document for an app DLL by calling
+ AddNewDocumentL().Create a store and initialize the document. Create
+ an .ini file by calling OpenIniFileLC().Write data to ini file using
+ RDictionaryWriteStream. Save changes by calling CDictionaryStore::CommitL()
+ and close the ini file. Re-open the ini file and read data from it using
+ RDictionaryReadStream.\n
+ API Calls:\n
+ CApaApplication::OpenIniFileLC(RFs& aFs) \n
+ RDictionaryWriteStream::AssignL(CDictionaryStore& aDictStore,TUid aUid)\n
+ RDictionaryWriteStream::WriteInt8L(TInt aValue)\n
+ RDictionaryWriteStream::CommitL()\n
+ CDictionaryStore::CommitL()\n
+ RDictionaryReadStream::OpenL(const CDictionaryStore& aDictStore,TUid aUid)\n
+ RDictionaryReadStream::ReadInt8L()\n
+
+ @SYMTestExpectedResults Test checks whether stored and read values from the
+ ini file match.
+ */
+void CT_ProStep::testIniFilesL()
+ {
+ TFullName filePath=_L("c:\\docs\\tstapp.doc");
+ const TFullName iniPath=_L("c:\\system\\data\\tstapp.ini"); // defined in tstapp
+ const TUid testUid={1};
+
+ // delete the files to be created by the testcode
+ iFs.Delete(filePath);
+ iFs.Delete(iniPath);
+ // create a process
+ TRAPD(ret,iProcess = CApaProcess::NewL(iFs));
+ TEST(ret==KErrNone);
+
+ // create a new main doc of type tstapp
+ CApaDocument* doc=NULL;
+ TApaApplicationFactory appFact(KUidTestApp);
+ TRAP(ret,doc=iProcess->AddNewDocumentL(appFact));
+ TEST(ret==KErrNone);
+ iProcess->SetMainDocument(doc);
+ CFileStore* store=NULL;
+
+ // create the store and initialise it
+ TRAP(ret, {
+ store=doc->CreateFileStoreLC(iProcess->FsSession(),filePath);
+ CleanupStack::Pop(); // store
+ });
+ TEST(ret==KErrNone);
+ ((CTestAppDoc*)iProcess->MainDocument())->iStore = store;
+ iProcess->SetMainDocFileName(filePath);
+
+ // initialise the document with factory settings
+ TRAP(ret, doc->NewDocumentL() );
+ TEST(ret==KErrNone);
+
+ // create a new ini file for the app
+ CDictionaryStore* iniFile=NULL;
+ TRAP(ret, {
+ iniFile=iProcess->MainDocument()->Application()->OpenIniFileLC(iFs);
+ CleanupStack::Pop();
+ });
+ TEST(ret==KErrNone);
+
+ // add some data to it
+ RDictionaryWriteStream writeStream;
+ TRAP(ret, writeStream.AssignL(*iniFile,testUid) );
+ TEST(ret==KErrNone);
+ TInt data=17;
+ TRAP(ret, writeStream.WriteInt8L(data) );
+ TEST(ret==KErrNone);
+ TRAP(ret, writeStream.CommitL() );
+ TEST(ret==KErrNone);
+ writeStream.Close();
+
+ // close it
+ TRAP(ret, iniFile->CommitL() );
+ TEST(ret==KErrNone);
+ delete iniFile;
+ iniFile = NULL;
+
+ // re-open it
+ TRAP(ret, {
+ iniFile=iProcess->MainDocument()->Application()->OpenIniFileLC(iFs);
+ CleanupStack::Pop();
+ });
+ TEST(ret==KErrNone);
+
+ // check the contents
+ RDictionaryReadStream readStream;
+ TRAP(ret, readStream.OpenL(*iniFile,testUid) );
+ TEST(ret==KErrNone);
+ TInt check=0;
+ TRAP(ret, check=readStream.ReadInt8L() );
+ TEST(ret==KErrNone);
+ TEST(check==data);
+ readStream.Close();
+
+ // close it
+ delete iniFile;
+
+ // tidy up
+ delete iProcess;
+ iFs.Delete(filePath);
+ iFs.Delete(iniPath);
+ }
+
+/**
+ Auxiliary Fn for Test Case ID T-ProStep-testControls1L,
+ T-ProStep-testControls2L, T-ProStep-testControls3L
+
+ The method finds the index of control m_ctrl.exe in the control list.
+ Depending on the Boolean value of argument aIsNewPath the search is
+ done on ROM / RAM.\n
+
+*/
+
+TInt CT_ProStep::ControlIndexInList(CApaSystemControlList* aList, TBool aIsNewPath)
+ {
+ TFileName newCtlPath=_L("c:\\sys\\bin\\m_ctrl.exe");
+
+ const TInt count = aList->Count();
+ TInt retVal = KErrNotFound;
+ for(TInt ii = 0; ii < count; ++ii)
+ {
+ if(((aList->Control(ii)->FileName().CompareF(ctlPath)==0) && (!aIsNewPath)) ||
+ ((aList->Control(ii)->FileName().CompareF(newCtlPath)==0) && (aIsNewPath)))
+ {
+ retVal = ii;
+ break;
+ }
+ }
+ return retVal;
+ }
+
+
+/**
+ @SYMTestCaseID T-ProStep-testControls1L
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc Tests CApaSystemControlList::UpdateL().
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Check the control list to find the number of controls in the
+ list and the number of updates to the list. Call UpdateL(). Check the list
+ again for no change in the count of controls and updates to the list.\n
+ API Calls:\n
+ CApaSystemControlList::UpdateL()\n
+
+ @SYMTestExpectedResults Test confirms that there is no change in the control
+ list after updating.
+ */
+void CT_ProStep::testControls1L()
+ {
+ iControlCount1 = iControlList->Count();
+ TEST((iControlCount1>=1));
+ TEST((iControlList->UpdateCount()>=1));
+
+ // do an update - there should be no changes
+ TInt ret;
+ TRAP(ret, iControlList->UpdateL());
+ TEST(ret==KErrNone);
+ iControlCount2 = iControlList->Count();
+ TEST(iControlCount2 == iControlCount1); // no change in the count (finds a m_ctrl.exe file on z, not c)
+ TEST((iControlList->UpdateCount()>=1));
+ TInt index = ControlIndexInList(iControlList,EFalse);
+ TEST((index >= 0) && (index < iControlCount2));
+ }
+
+
+/**
+ @SYMTestCaseID T-ProStep-testControls2L
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc Tests CApaSystemControlList::UpdateL() and UpdateCount().
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Copy control from Z: drive to C: drive. Call UpdateL() to
+ update the control list. Check if UpdateL() has incremented iUpdateCount
+ by calling UpdateCount(). Check the filename of control to ensure that the
+ control copied to C: drive has been updated in the list. Delete the newly
+ copied control.\n
+ API Calls:\n
+ CApaSystemControlList::UpdateL()\n
+ CApaSystemControlList::UpdateCount()const\n
+
+ @SYMTestExpectedResults The test shows updating of the copied control in control list.
+ */
+void CT_ProStep::testControls2L()
+ {
+ RSmlTestUtils testSession;
+ User::LeaveIfError(testSession.Connect());
+
+ testSession.CreateDirectoryL(KCTLDIR);
+ testSession.CreateDirectoryL(KRSCDIR);
+
+ TInt ret=testSession.CopyFileL(KSOURCEPATH,KNEWCTLPATH);
+ TEST(ret==KErrNone);
+ ret=testSession.CopyFileL(KLOCPATH,KNEWLOCPATH);
+ TEST(ret==KErrNone);
+
+ TInt controlCount=iControlList->UpdateCount();
+ while(iControlList->UpdateCount()<=controlCount)
+ {
+ TRAP(ret, iControlList->UpdateL());
+ if(ret!=KErrNone)
+ {
+ break;
+ }
+ User::After(100000);
+ }
+ TEST(ret==KErrNone);
+
+ iControlCount3 = iControlList->Count();
+ TEST(iControlCount3 == iControlCount1); // still no changes in the count (finds a m_ctrl.exe file on c, not z)
+ TEST((iControlList->UpdateCount()==controlCount+1));
+
+ TInt index = ControlIndexInList(iControlList,ETrue);
+ TEST((index>=0)&&(index<iControlCount3));
+ if(index>=0)
+ {
+ TFileName name=iControlList->Control(index)->FileName();
+ TEST(name.CompareF(KCTRLNAME)==0);
+ }
+
+ // hide the control and do an update - there should be changes
+ testSession.SetReadOnly(KNEWCTLPATH,0); // remove the read only attribute
+ ret=testSession.DeleteFileL(KNEWCTLPATH);
+ TEST(ret==KErrNone);
+ testSession.SetReadOnly(KNEWLOCPATH,0); // remove the read only attribute
+ ret=testSession.DeleteFileL(KNEWLOCPATH);
+ TEST(ret==KErrNone);
+ controlCount=iControlList->UpdateCount();
+ while(iControlList->UpdateCount()<=controlCount)
+ {
+ TRAPD(ret, iControlList->UpdateL());
+ if(ret!=KErrNone)
+ {
+ break;
+ }
+ User::After(100000);
+ }
+
+ testSession.Close();
+ }
+
+
+/**
+ @SYMTestCaseID T-ProStep-testControls3L
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc Tests CApaSystemControlList::Control() and CApaSystemControl APIs Type() and Caption().
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Update the control list to ensure that the deleted control is
+ removed from the list and the control on the Z: Drive is added to the list.
+ Retrieve this control from the list using CApaSystemControlList::Control().
+ Check the type and caption of the control calling Type() and Caption() methods.\n
+ API Calls:\n
+ CApaSystemControlList::Control(TInt aIndex)const\n
+ CApaSystemControl::Type()const\n
+ CApaSystemControl::Caption()const\n
+
+ @SYMTestExpectedResults The test shows the addition of the control present on
+ Z: drive in control list. Test confirms the retrieved info on the control
+ obtained from the control list.
+
+ */
+void CT_ProStep::testControls3L()
+ {
+ TUid KUidMinimalControl={0x13008AEE};
+ TFileName ctlCaption=_L("m_ctrl");
+ // This method is called to close the panic dialog generated by previous test
+ ClosePanicWindowL();
+
+ TRAPD(ret, iControlList->UpdateL());
+ TEST(ret==KErrNone);
+ const TInt controlCount4 = iControlList->Count();
+ TEST(controlCount4 == iControlCount1); // still no changes in the count (finds a .ctl file on z, not c)
+ TEST((iControlList->UpdateCount()==3));
+ TInt index = ControlIndexInList(iControlList,EFalse);
+ TEST((index >= 0) && (index < controlCount4));
+ if(index>=0)
+ {
+ TEST(iControlList->Control(index)->FileName().CompareF(ctlPath)==0);
+
+ INFO_PRINTF1(_L("Testing CApaSystemControl"));
+
+ //get the control from the list and check it's type and caption
+ iControl=iControlList->Control(index);
+ TEST(iControl!=NULL);
+ TEST((iControl->Type()==KUidMinimalControl));
+ TFileName caption=iControl->Caption();
+ TEST(caption.CompareF(ctlCaption)==0);
+ TEST(iControl->Icon()!=NULL);
+ RThread thread;
+ TFullName name=_L("Control Panel Test");
+ TInt r=thread.Create(name,SimulateKeyL,KDefaultStackSize,KDefaultStackSize,KDefaultStackSize,NULL);
+ TEST(r==KErrNone);
+ thread.Resume();
+
+ // run the control
+ TRAP(ret, iControl->CreateL()); // this control is synchronous
+ TEST(ret==KErrNone);
+ thread.Close();
+ }
+ }
+
+/**
+ Auxiliary Fn for T-ProStep-testControls1L, T-ProStep-testControls2L, T-ProStep-testControls3L
+
+ This method creates a control list by calling CApaSystemControlList::NewL() and
+ initiates subsequent tests on CApaSystemControlList and CApaSystemControl APIs.
+
+ */
+void CT_ProStep::testControlsL()
+ {
+ INFO_PRINTF1(_L("Testing CApaSystemControlList"));
+
+ //Create a session with F & B server
+ TInt ret = RFbsSession::Connect();
+ TEST(ret == KErrNone);
+
+ CFileMan* fileMan=CFileMan::NewL(iFs);
+ CleanupStack::PushL(fileMan);
+
+ TRAP(ret,iControlList=CApaSystemControlList::NewL(iFs));
+ TEST(ret==KErrNone);
+
+ testControls1L();
+ testControls2L();
+ testControls3L();
+
+ // tidy up
+ delete iControlList;
+ CleanupStack::PopAndDestroy(fileMan);
+
+ //Close the session F & B server.
+ RFbsSession::Disconnect();
+
+ }
+
+ TInt PanicTestThread(TAny* aOption)
+ {
+ CTrapCleanup::New();
+ const TInt option = TInt(aOption);
+ //Create a session with F & B server
+ TInt ret = RFbsSession::Connect();
+ switch(option)
+ {
+ case ENegativePanicTest:
+
+ if(ret==KErrNone)
+ {
+ RFs fs;
+ fs.Connect();
+ CApaSystemControlList *controlList=NULL;
+ TRAP(ret,controlList=CApaSystemControlList::NewL(fs));
+ if(ret==KErrNone)
+ {
+ TInt count=controlList->Count();
+ controlList->Control(count+10);
+ }
+ delete controlList;
+ fs.Close();
+ }
+ break;
+ default:
+ User::Panic(_L("TProStep Error"), EUnknownPanicOption);
+ }
+ RFbsSession::Disconnect();
+ return KErrNone;
+ }
+
+/**
+ @SYMTestCaseID APPFWK-APPARC-0056
+
+ @SYMDEF DEF092293
+
+ @SYMTestCaseDesc Tests CApaSystemControlList::Control() Throws the right Panic on Invalid Count.
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Create Seperate Thread to call the PanicTestThread Method where we create a new system ControlList
+ and get the actual count of the lists present inside . now call the CApaSystemControlList::Control(Index);where Index
+ is a number greater than the actual count list.
+ CApaSystemControlList::Control(TInt aIndex)const\n
+
+
+ @SYMTestExpectedResults Expect a APGRFX Panic EPanicIndexOutOfRange.
+
+ */
+
+void CT_ProStep::testPanicForControlListL()
+ {
+ RThread thrd;
+ TRequestStatus stat;
+ TInt ret=thrd.Create(_L("ptt"),PanicTestThread,KDefaultStackSize,0x2000,0x20000,(TAny*)ENegativePanicTest);
+ User::LeaveIfError(ret);
+ thrd.SetPriority(EPriorityMuchMore);
+ thrd.Logon(stat);
+ User::SetJustInTime(EFalse);
+ thrd.Resume();
+ User::WaitForRequest(stat);
+ TEST(thrd.ExitType()==EExitPanic);
+ TEST(thrd.ExitReason()==EPanicIndexOutOfRange);
+ INFO_PRINTF2(_L("TestPanicForControlList panic=%d"), thrd.ExitReason());
+ thrd.Close();
+ User::SetJustInTime(ETrue);
+ ClosePanicWindowL();
+
+ }
+
+// This method is called to close the panic generated by the testPanicForControlListL() test.
+void CT_ProStep::ClosePanicWindowL()
+ {
+ RWsSession ws;
+ User::LeaveIfError(ws.Connect());
+
+ TInt wgFocus = ws.GetFocusWindowGroup();
+
+ const TUint32 ENullWsHandle = 0xFFFFFFFF; // Events delivered to this handle are thrown away
+ RWindowGroup wg = RWindowGroup(ws);
+
+ wg.Construct(ENullWsHandle);
+ TInt wgId = wg.Identifier();
+
+ TWsEvent event;
+ event.SetType(EEventKey);
+ TKeyEvent *keyEvent = event.Key();
+ keyEvent->iCode = EKeyEscape;
+ keyEvent->iScanCode = EStdKeyEscape;
+ keyEvent->iModifiers = 0;
+
+ TInt limit = 0;
+ for(limit = 0; wgFocus != wgId && (limit < 50); limit++)
+ {
+ ws.SendEventToAllWindowGroups(event);
+ wgFocus = ws.GetFocusWindowGroup();
+ RDebug::Print(_L("CloseAllPanicWindowsL() - EKeyEscape sent to Windows Group"));
+ }
+
+ // close everything
+ wg.Close();
+ ws.Close();
+
+ }
+/**
+ @SYMTestCaseID T_ProStep_DoAppListInvalidTestL
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc Tests GetNextApp() never returns RApaLsSession::EAppListInvalid.
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Copy tstapp files from z: drive to c: drive. Create a session
+ with the Application Architecture server. Populate the list of applications
+ to cache by calling RApaLsSession::GetAllApps().Remove the copied files
+ from C: drive. Traverse through the list by calling
+ RApaLsSession::GetNextApp(). Check return value to ensure that
+ RApaLsSession::EAppListInvalid is never returned.\n
+ API Calls:\n
+ RApaLsSession::GetNextApp(TApaAppInfo& aInfo) const
+
+ @SYMTestExpectedResults Test confirms that RApaLsSession::EAppListInvalid is never returned.
+
+ */
+void CT_ProStep::DoAppListInvalidTestL(RApaLsSession& aLs)
+ {
+ _LIT(KTempAppDir, "C:\\private\\10003a3f\\import\\apps\\");
+ _LIT(KTempRegPath, "C:\\private\\10003a3f\\import\\apps\\tstapp_reg.rsc");
+ TFullName regPath=_L("z:\\private\\10003a3f\\import\\apps\\tstapp_reg.rsc");
+
+ CFileMan* fileMan = CFileMan::NewL (iFs);
+ CleanupStack::PushL(fileMan);
+
+ INFO_PRINTF1(_L("Copy tstapp files to C: drive......."));
+ TInt ret = iFs.MkDirAll(KTempAppDir);
+ TEST(ret==KErrNone || ret==KErrAlreadyExists);
+ TEST(fileMan->Copy(regPath, KTempRegPath)==KErrNone); //Just to start the idle update.
+
+ User::After(8000000);
+
+ INFO_PRINTF1(_L("Get app list......."));
+ ret = aLs.GetAllApps();
+ TEST(ret==KErrNone);
+
+ INFO_PRINTF1(_L("Remove temp files from C: drive......."));
+ TRequestStatus status;
+ TTime tempTime(0); // added tempTime to avoid asynch CFileMan::Attribs request completing with KErrArgument
+ TInt err=fileMan->Attribs(KTempAppDir,0,KEntryAttReadOnly, tempTime, CFileMan::ERecurse, status);
+ TEST(err==KErrNone);
+ User::WaitForRequest(status);
+ TEST(status.Int() == KErrNone);
+ TEST(fileMan->Delete(KTempRegPath)==KErrNone); //Just to start the idle update.
+ TEST(fileMan->RmDir(KTempAppDir)==KErrNone);
+
+ User::After(8000000);
+
+ INFO_PRINTF1(_L("Testing GetNextApp() never returns RApaLsSession::EAppListInvalid."));
+ TApaAppInfo info;
+ while(ret==KErrNone)
+ {
+ ret=aLs.GetNextApp(info);
+ }
+ TEST(ret!=RApaLsSession::EAppListInvalid);
+ TEST(ret==RApaLsSession::ENoMoreAppsInList);
+
+ CleanupStack::PopAndDestroy(fileMan);
+ }
+
+
+/**
+ Auxiliary Fn for all Test Cases.
+
+ This method creates and installs an active scheduler and puts the
+ test code on the scheduler as a CIdle object. The method initiates
+ all tests by calling the static method CT_ProStepCallBack::CallBackL().
+
+*/
+void CT_ProStep::DoStepTestsInCallbackL()
+ {
+ // create an active scheduler
+ CActiveScheduler* scheduler = new(ELeave) CActiveScheduler;
+ CActiveScheduler::Install(scheduler);
+ CleanupStack::PushL(scheduler);
+
+ // put the test code onto the scheduler as an idle object
+ CIdle* idle=CIdle::NewL(-20);
+ CleanupStack::PushL(idle);
+
+ CT_ProStepCallBack* callBack = new(ELeave) CT_ProStepCallBack(this);
+ CleanupStack::PushL(callBack);
+
+ idle->Start(TCallBack(CT_ProStepCallBack::CallBackL,callBack));
+ // start the test code
+ CActiveScheduler::Start();
+
+ // all outstanding requests complete - kill the scheduler
+ CleanupStack::PopAndDestroy(3); //scheduler, callBack, idle
+ }
+
+/**
+ This static method is the callback function of CIdle object. The method
+ calls the non-static method DoStepTestsL() which initiates all the tests.
+*/
+TInt CT_ProStepCallBack::CallBackL(TAny* callBack /*aThis*/)
+{
+ //Call Test Step func
+ ((CT_ProStepCallBack *)callBack)->iTestStep->DoStepTestsL();
+
+ CActiveScheduler::Stop();
+ return EFalse; // don't call back again
+ }
+
+
+/**
+ Constructor
+ */
+CT_ProStepCallBack::CT_ProStepCallBack(CT_ProStep* aTestStep)
+ {
+ iTestStep = aTestStep;
+ }
+
+/**
+ Destructor
+ */
+CT_ProStepCallBack::~CT_ProStepCallBack()
+ {
+ }
+
+/**
+ Auxiliary Fn for all Test Cases.
+ The method initiates all tests to be performed.
+*/
+void CT_ProStep::DoStepTestsL()
+ {
+ INFO_PRINTF1(_L("Test AppListInvalidTest......"));
+ RTestableApaLsSession ls;
+ TEST(KErrNone == ls.Connect());
+ CleanupClosePushL(ls);
+ //DONT_CHECK due to changes to file system
+ HEAP_TEST_LS_SESSION(ls, 0, DONT_CHECK, DoAppListInvalidTestL(ls), REComSession::FinalClose() );
+ CleanupStack::PopAndDestroy(&ls);
+
+ __UHEAP_MARK;
+ INFO_PRINTF1(_L("Test AppIdentifier......"));
+ TRAPD(r,testAppIdentifierL());
+ TEST(r==KErrNone);
+ INFO_PRINTF2(_L("Test AppIdentifier completed with code %d\n"), r);
+ REComSession::FinalClose();
+ __UHEAP_MARKEND;
+
+ __UHEAP_MARK;
+ INFO_PRINTF1(_L("Test TestGenerateFileName......"));
+ TRAP(r,doTestGenerateFileName());
+ TEST(r==KErrNone);
+ INFO_PRINTF2(_L("Test TestGenerateFileName completed with code %d\n"), r);
+ REComSession::FinalClose();
+ __UHEAP_MARKEND;
+
+ __UHEAP_MARK;
+ INFO_PRINTF1(_L("Test TestReadStreamL......"));
+ TRAP(r,testReadStreamL());
+ TEST(r==KErrNone);
+ INFO_PRINTF2(_L("Test TestReadStream completed with code %d\n"), r);
+ REComSession::FinalClose();
+ __UHEAP_MARKEND;
+
+ __UHEAP_MARK;
+ INFO_PRINTF1(_L("Test DocCreation......"));
+ TRAP(r,testDocCreationL());
+ TEST(r==KErrNone);
+ INFO_PRINTF2(_L("Test DocCreation completed with code %d\n"), r);
+ REComSession::FinalClose();
+ __UHEAP_MARKEND;
+
+ __UHEAP_MARK;
+ INFO_PRINTF1(_L("Test Embedding......"));
+ TRAP(r,testEmbeddingL());
+ TEST(r==KErrNone);
+ INFO_PRINTF2(_L("Test Embedding completed with code %d\n"), r);
+ REComSession::FinalClose();
+ __UHEAP_MARKEND;
+
+ __UHEAP_MARK;
+ INFO_PRINTF1(_L("Test MainDocFileName......"));
+ TRAP(r,MainDocFileNameTestsL());
+ TEST(r==KErrNone);
+ INFO_PRINTF2(_L("Test MainDocFileName completed with code %d\n"), r);
+ REComSession::FinalClose();
+ __UHEAP_MARKEND;
+
+ __UHEAP_MARK;
+ INFO_PRINTF1(_L("Test IniFiles......"));
+ TRAP(r,testIniFilesL());
+ TEST(r==KErrNone);
+ INFO_PRINTF2(_L("Test IniFiles completed with code %d\n"), r);
+ REComSession::FinalClose();
+ __UHEAP_MARKEND;
+
+ __UHEAP_MARK;
+ INFO_PRINTF1(_L("Test Controls......"));
+ TRAP(r,testControlsL());
+ TEST(r==KErrNone);
+ INFO_PRINTF2(_L("Test Controls completed with code %d\n"), r);
+ REComSession::FinalClose();
+ __UHEAP_MARKEND;
+
+ __UHEAP_MARK;
+ INFO_PRINTF1(_L("Test Panic Controls......"));
+ TRAP(r,testPanicForControlListL());
+ TEST(r==KErrNone);
+ INFO_PRINTF2(_L("Test Panic Controls completed with code %d\n"), r);
+ REComSession::FinalClose();
+ __UHEAP_MARKEND;
+ }
+
+/**
+ Destructor
+ */
+CT_ProStep::~CT_ProStep()
+ {
+ }
+
+/**
+ Constructor
+ */
+CT_ProStep::CT_ProStep()
+ {
+ SetTestStepName(KT_ProStep);
+ }
+
+/**
+ @return - TVerdict code
+ Override of base class virtual
+ */
+TVerdict CT_ProStep::doTestStepPreambleL()
+ {
+ SetTestStepResult(EPass);
+ return TestStepResult();
+ }
+
+/**
+ @return - TVerdict code
+ Override of base class virtual
+ */
+TVerdict CT_ProStep::doTestStepPostambleL()
+ {
+ return TestStepResult();
+ }
+
+/**
+ @return - TVerdict code
+ Override of base class virtual
+*/
+TVerdict CT_ProStep::doTestStepL()
+ {
+ INFO_PRINTF1(_L("Testing Apparch...T_Pro"));
+
+ FbsStartup();
+
+ iFs.Connect();
+ setup();
+
+ TRAPD(ret,DoStepTestsInCallbackL())
+ TEST(ret==KErrNone);
+
+ iFs.Close();
+
+ INFO_PRINTF1(_L("T_Pro Completed."));
+ return TestStepResult();
+ }