// 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();
	}
