appfw/apparchitecture/tef/T_ProStep.cpp
changeset 0 2e3d3ce01487
child 29 6a787171e1de
--- /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();
+	}