kerneltest/f32test/bench/t_fsrdel.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "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:
// f32test\bench\t_fsrdel.cpp
// 
//


#include <f32file.h>
#include <e32test.h>
#include "t_benchmain.h"

GLDEF_D RTest test(_L("File Server Benchmarks, deletion of a massive amount of files"));

//----------------------------------------------------------------------------------------------
//! @SYMTestCaseID      PBASE-T_FSRDEL-0272
//! @SYMTestType        CIT
//! @SYMPREQ            PREQ000
//! @SYMTestCaseDesc    This test case is measuring performance of the FAT implementation.  
//! @SYMTestActions     0.  Expects the files to exist in order to successful execution
//!						1.	Time the deletion of a file from each directory with RFs::Delete
//!						2.	Time the deletion of a file from each directory with CFileMan::Delete
//!						3.	Time the deletion of all the files from each directory 
//!							with RFs::Delete
//!						4.	Time the deletion of all the files from each directory with 
//!							CFileMan::Delete (wildcard F*.*)
//!						5.	Time the deletion of a file from each directory with RFs::Delete 
//!							with two clients accessing the directory
//!						6.	Time the deletion of a file from each directory with CFileMan::Delete 
//!							with two clients accessing the directory
//!						7.	Time the deletion of all the files from each directory with RFs::Delete 
//!							with two clients accessing the directory
//!						8.	Time the deletion of all the files from each directory with 
//!							CFileMan::Delete with two clients accessing the directory (wildcard F*.*)
//!						9.	Time the deletion of a file from each directory with RFs::Delete 
//!							with two clients accessing different directories 
//!						10.	Time the deletion of a file from each directory with CFileMan::Delete 
//!							with two clients accessing different directories 
//!						11.	Time the deletion of all the files from each directory with RFs::Delete 
//!							with two clients accessing different directories
//!						12.	Time the deletion of all the files from each directory with 
//!							CFileMan::Delete with two clients accessing different directories (wildcard F*.*)
//! @SYMTestExpectedResults Finishes if the system behaves as expected, panics otherwise
//! @SYMTestPriority        High
//! @SYMTestStatus          Implemented
//----------------------------------------------------------------------------------------------

LOCAL_D RSemaphore client,write_screen;
LOCAL_D const TInt KHeapSize=0x4000;
LOCAL_D TBuf8<4096> buf;
LOCAL_D TDriveList gDriveList;

// Concurrent thread varibles
RThread gSpeedy;
RThread gSpeedyII;
TInt gT1;
TInt gT2;
LOCAL_D TFileName gDelEntryDir;
LOCAL_D TFileName gDelEntryDir2;
LOCAL_D TInt ThreadCount=0;
TBool gWriting = EFalse;

TBool gKillMe=EFalse; 

_LIT(KDeleteMe,"delete%d.me");
_LIT(KDeleteMe2,"blabla%d.rhd");


/** Send content through the RDebug for trgtest 
	not to hung, when the test is not writing

*/
LOCAL_C TInt noise(TAny* )
{
	FOREVER
	{	
		User::After(2147483647); // max value, 35 minutes, 47 seconds
		if(!gWriting)
			RDebug::Print(_L("."));
	}
}

/** Create background noise by deleting/creating file in gDelEntryDir2 directory

*/
LOCAL_C TInt DeleteEntryAccess2(TAny* )
	{
	RFs fs;
	TInt r = 0;
	TBuf<100> dirfile;
	TBuf<50> filename;
	RFile file;
	RTest test(_L("test 2")); 

	// Not checking error state until main thread has been signalled, to avoid deadlock
	fs.Connect();
	r = fs.SetSessionPath(gSessionPath);
	
	filename.Format(KDeleteMe2,gT2);
	
	dirfile = gDelEntryDir2;
	dirfile.Append(filename);
	
	client.Signal();
	FailIfError(r);
	
	FOREVER
		{
			if(!gKillMe)
				{
				r = file.Create(fs, dirfile, EFileShareAny|EFileWrite);
				if(r == KErrAlreadyExists) 
					r = file.Open(fs, dirfile, EFileShareAny|EFileWrite);
				file.Close();
				FailIfError(r);
				
				r = fs.Delete(dirfile);
				if((r != KErrNone) && (r != KErrInUse)) 
					FailIfError(r);
				}
		}
	}

/** Create background noise by deleting/creating file in gDelEntryDir directory

*/
LOCAL_C TInt DeleteEntryAccess(TAny*)
	{
	RFs fs2;
	TInt r = 0;
	TBuf<100> dirfile;
	TBuf<50> filename;
	RFile file2;
	RTest test(_L("test 2")); 

	// Not checking error state until main thread has been signalled, to avoid deadlock
	fs2.Connect();
	r = fs2.SetSessionPath(gSessionPath);
	
	filename.Format(KDeleteMe,gT1);
	
	dirfile = gDelEntryDir;
	dirfile.Append(filename);
	
	client.Signal();
	FailIfError(r);
	
	FOREVER
		{
			if(!gKillMe)
				{
				r = file2.Create(fs2, dirfile, EFileShareAny|EFileWrite);
				if(r == KErrAlreadyExists) 
					r = file2.Open(fs2, dirfile, EFileShareAny|EFileWrite);
				file2.Close();
				FailIfError(r);
				r = fs2.Delete(dirfile);
				if((r != KErrNone) && (r != KErrInUse)) 
					FailIfError(r);
				}
		}
	}

/**  Starts a concurrent client session in different directories

*/
LOCAL_C void DoTest(TThreadFunction aFunction)
	{
	gKillMe = EFalse;

	TBuf<20> buffer = _L("Speedy");
	buffer.AppendNum(ThreadCount++);
	gT1 = ThreadCount;
	TInt r = gSpeedy.Create(buffer, aFunction, KDefaultStackSize, KHeapSize, KHeapSize, NULL);
	FailIfError(r);

	buffer = _L("Speedy");
	buffer.AppendNum(ThreadCount++);
	gT2=ThreadCount;
	r = gSpeedyII.Create(buffer, DeleteEntryAccess2, KDefaultStackSize, KHeapSize, KHeapSize, NULL);
	FailIfError(r);

 	gSpeedy.SetPriority(EPriorityLess);
    gSpeedyII.SetPriority(EPriorityLess);
	
	gSpeedy.Resume();
	gSpeedyII.Resume();
	
	client.Wait();
	client.Wait();
	}
		
/**   Kills the concurrent sessions

*/
LOCAL_C void DoTestKill()
	{
	gKillMe = ETrue;
	User::After(10000000);
	
	gSpeedy.Kill(KErrNone);
	gSpeedy.Close();	
	
	gSpeedyII.Kill(KErrNone);
	gSpeedyII.Close();	
	}

/**  Creates again the last.txt file in each directory that is being used

*/
LOCAL_C void ReCreateLast() 
	{
	TInt i = 1, r = 0;
	RFile file;
	TBuf16<50> dirtemp;
	
	TBuf16<50> path;
	TBuf8<1024> dummy(1024);
	
	
	while(i <= gTypes) 
		{
		path = gSessionPath;
		dirtemp.Format(KDirMultipleName, i, 100);
		path.Append(dirtemp);
		path.Append(KCommonFile);
		r = file.Create(TheFs, path, EFileShareAny|EFileWrite);
		if(r == KErrAlreadyExists) 
			{
			r = file.Open(TheFs, path, EFileShareAny|EFileWrite);
			FailIfError(r);
			}
		r = file.Write(dummy);
		FailIfError(r);
		file.Close();
		i++;
		}

	if(gFilesLimit >= 1000) 
		{
		i = 1;
		while(i <= gTypes) 
			{
			path = gSessionPath;
			dirtemp.Format(KDirMultipleName, i, 1000);
			path.Append(dirtemp);
			path.Append(KCommonFile);
			r = file.Create(TheFs, path, EFileShareAny|EFileWrite);
			if(r == KErrAlreadyExists) 
				{
				r = file.Open(TheFs, path, EFileShareAny|EFileWrite);
				FailIfError(r);
				}
			r = file.Write(dummy);
			FailIfError(r);
			file.Close();
			i++;
			}
		}
	
	if(gFilesLimit >= 5000) 
		{
		i = 1;
		while(i <= gTypes) 
			{
			path = gSessionPath;
			dirtemp.Format(KDirMultipleName, i, 5000);
			path.Append(dirtemp);
			path.Append(KCommonFile);
			r = file.Create(TheFs, path, EFileShareAny|EFileWrite);
			if(r == KErrAlreadyExists) 
				{
				r = file.Open(TheFs, path, EFileShareAny|EFileWrite);
				FailIfError(r);
				}
			r = file.Write(dummy);
			FailIfError(r);
			file.Close();
			i++;
			}
		}
	if(gFilesLimit >= 10000) 
		{
		i = 1;
		while(i <= gTypes) 
			{
			path = gSessionPath;
			dirtemp.Format(KDirMultipleName, i, 10000);
			path.Append(dirtemp);
			path.Append(KCommonFile);
			r = file.Create(TheFs, path, EFileShareAny|EFileWrite);
			if(r ==KErrAlreadyExists) 
				{
				r = file.Open(TheFs, path, EFileShareAny|EFileWrite);
				FailIfError(r);
				}
			r = file.Write(dummy);
			FailIfError(r);
			file.Close();
			i++;
			}
		}
	}

/**  Deletes all files in a given directory one by one

	@param aN 		Number of files in the directory
	@param aStep 	Test step
*/
LOCAL_C TInt DelAllFiles1(TInt aN, TInt aStep)
	{
	TInt i = 0, r = 0;
	TBuf16<50> directory;
	TBuf16<50> dirtemp;
	
	TBuf16<50> path;
	TBuf16<50> buffer(50); 	

	_LIT(KMsg, "This file caused a problem: %S\n");

	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;
	
	if(aN <= gFilesLimit) 
		{
		if(gTypes >= 1) 
			{
			// all 8.3 
			directory = gSessionPath;
			dirtemp.Format(KDirMultipleName, 1, aN);
			directory.Append(dirtemp);
		
			i = 0;
			startTime.HomeTime();
			while(i < aN) 
				{
				FileNamesGeneration(buffer, 8, i, i%3+1) ;
				path = directory;
				path.Append(buffer);
				r = TheFs.Delete(path);
				if(r != KErrNone) 
					{
					TBuf16<250> msg;
					msg.Format(KMsg, &path);
					test.Printf(msg);
					FailIfError(r);
					}
				i++;
				}
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}	
		
		if(gTypes >= 2) 
			{
			// all 20.3 chars
			dirtemp.Format(KDirMultipleName, 2, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);
			
			i = 0;
			startTime.HomeTime();
			while(i < aN) 
				{ 
				FileNamesGeneration(buffer, 20, i, i%3+1) ;
				path = directory;
				path.Append(buffer);
				r = TheFs.Delete(path);
				if(r != KErrNone) 
					{
					TBuf16<250> msg;
					msg.Format(KMsg, &path);
					test.Printf(msg);
					FailIfError(r);
					}
				i++;
				}	
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		
		if(gTypes >= 3) 
			{
			// 50/50 
			dirtemp.Format(KDirMultipleName, 3, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);
			i = 0;
			startTime.HomeTime();
			while(i < aN) 
				{
				if(1 == (i % 2)) 	FileNamesGeneration(buffer, 8, i, i%3+1) ;
				else  				FileNamesGeneration(buffer, 20, i, i%3+1) ;
					
				path = directory;
				path.Append(buffer);
				r = TheFs.Delete(path);
				if(r != KErrNone) 
					{
					TBuf16<250> msg;
					msg.Format(KMsg, &path);
					test.Printf(msg);
					FailIfError(r);
					}
				i++;
				}
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit);
			}	
		}

	gWriting = ETrue; User::After(1000000);
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
	gWriting = EFalse;
				
	return(KErrNone);
	}

/**  Deletes all files in a given directory using wildcards

	@param aN 		Number of files in the directory
	@param aStep 	Test step
*/
LOCAL_C TInt DelAllFiles2(TInt aN, TInt aStep)
	{
	TInt r = 0;
	
	TBuf16<50> directory;
	TBuf16<50> dirtemp;
	
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;  
	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	CFileMan* fMan=CFileMan::NewL(TheFs);
	

	if(aN <= gFilesLimit) 
		{
		if(gTypes >= 1) 
			{
			// all 8.3 
			dirtemp.Format(KDirMultipleName, 1, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);

			startTime.HomeTime();
			directory.Append(_L("F*.*"));
			
			r = fMan->Delete(directory);
			FailIfError(r);

			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime); 
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		if(gTypes >= 2) 
			{		
			// all 20.3 chars
			dirtemp.Format(KDirMultipleName, 2, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);

			startTime.HomeTime();
			directory.Append(_L("F*.*"));
			r = fMan->Delete(directory);
			FailIfError(r);
			
			endTime.HomeTime();

			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		
		if(gTypes >= 3) 
			{
			// 50/50 
			dirtemp.Format(KDirMultipleName,3, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);

			startTime.HomeTime();
			directory.Append(_L("F*.*"));
			r = fMan->Delete(directory);
			FailIfError(r);
			
			endTime.HomeTime();
			
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		}
	delete fMan;
	
	gWriting = ETrue; User::After(1000000);
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
	gWriting = EFalse;

	return(KErrNone);
	}

/** Delete last.txt with two threads accessing the current directory and 
	creating/deleting a file with RFs::Delete

	@param aN Number of files in the directory
	@param aStep 	Test step
*/
LOCAL_C void DelFileM1(TInt aN, TInt aStep) 
	{
	TBuf16<100> dir1;
	TBuf16<100> dir2;
	TBuf16<100> dir3;
    TBuf16<100> dir4;
	
	TInt r = 0;
	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1; 

	dir1 = gSessionPath;
	dir2 = gSessionPath;
	dir3 = gSessionPath;
	
	dir4.Format(KDirMultipleName, 1, aN);
	dir1.Append(dir4);
	dir4.Format(KDirMultipleName, 2, aN);
	dir2.Append(dir4);	
	dir4.Format(KDirMultipleName, 3, aN);
	dir3.Append(dir4);
	
	if(aN <= gFilesLimit) 
		{
		if(gTypes >= 1) 
			{	
			gDelEntryDir = dir1;
			gDelEntryDir2 = dir1;
			dir1.Append(KCommonFile);
			
			DoTest(DeleteEntryAccess);
			
			startTime.HomeTime();

			r = TheFs.Delete(dir1);
			FailIfError(r);
			
			endTime.HomeTime();
			
			DoTestKill();
			
			timeTaken=endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}

		if(gTypes >= 2) 
			{
			gDelEntryDir = dir2;
			gDelEntryDir2 = dir2;
			
			dir2.Append(KCommonFile);
			
			DoTest(DeleteEntryAccess);

			startTime.HomeTime();

			r = TheFs.Delete(dir2);
			FailIfError(r);
			
			endTime.HomeTime();
			timeTaken=endTime.MicroSecondsFrom(startTime);
				
			DoTestKill();
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}

		if(gTypes >= 3) 
			{
			gDelEntryDir = dir3;
			gDelEntryDir2 = dir3;
			
			dir3.Append(KCommonFile);

			
			DoTest(DeleteEntryAccess);

			startTime.HomeTime();

			r = TheFs.Delete(dir3);
			FailIfError(r);
			
			endTime.HomeTime();
			DoTestKill();
			
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		}
	
	gWriting = ETrue; User::After(1000000);
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
	gWriting = EFalse;
	}

/** Delete last.txt by opening it and with two threads accessing the current 
	directory and creating/deleting a file with CFileMan::Delete

	@param aN 		Number of files in the directory
	@param aStep 	Test step 
*/
LOCAL_C void DelFileM2(TInt aN, TInt aStep) 
 	{
	TBuf16<100> dir1;
	TBuf16<100> dir2;
	TBuf16<100> dir3;
    TBuf16<100> dir4;
	
	TInt r = 0;
	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1; 

	CFileMan* fMan = CFileMan::NewL(TheFs);

	dir1 = gSessionPath;
	dir2 = gSessionPath;
	dir3 = gSessionPath;
	
	dir4.Format(KDirMultipleName, 1, aN);
	dir1.Append(dir4);
	dir4.Format(KDirMultipleName, 2, aN);
	dir2.Append(dir4);	
	dir4.Format(KDirMultipleName, 3, aN);
	dir3.Append(dir4);

	if(aN <= gFilesLimit) 
		{
		if(gTypes >= 1) 
			{
			gDelEntryDir = dir1;
			gDelEntryDir2 = dir1;
			
			dir1.Append(KCommonFile);
			
			DoTest(DeleteEntryAccess);
			
			startTime.HomeTime();
			
			r = fMan->Delete(dir1);
			FailIfError(r);
			
			endTime.HomeTime();
			DoTestKill();
			
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}

		if(gTypes >= 2) 
			{
			gDelEntryDir = dir2;
			gDelEntryDir2 = dir2;
			
			dir2.Append(KCommonFile);
			
			DoTest(DeleteEntryAccess);

			startTime.HomeTime();

			r = fMan->Delete(dir2);
			FailIfError(r);
			
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			DoTestKill();
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		
		if(gTypes >= 3) 
			{
			gDelEntryDir = dir3;
			gDelEntryDir2 = dir3;
			dir3.Append(KCommonFile);

			
			DoTest(DeleteEntryAccess);

			startTime.HomeTime();

			r = fMan->Delete(dir3);
			FailIfError(r);
			
			endTime.HomeTime();
			DoTestKill();
			
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		}
	delete fMan;

	gWriting = ETrue; User::After(1000000);
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
	gWriting = EFalse;

	}

/** Delete all files with two threads accessing the current directory and creating/deleting a file
	with RFs::Delete

	@param aN Number of files in the directory
	@param aStep 	Test step
*/
LOCAL_C void DelAllM1(TInt aN, TInt aStep) 
	{
	TInt i = 0, r = 0;
	
	TBuf16<50> directory;
	TBuf16<50> dirtemp;
	
	TBuf16<50> path;
	TBuf16<50> buffer(50); 	

	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;  
	
	if(aN <= gFilesLimit) 
		{
		// Start the noise in the background
		gDelEntryDir = directory;
		gDelEntryDir2 = directory;
		DoTest(DeleteEntryAccess);
		
		if(gTypes >= 1) 
			{
			// all 8.3 
			dirtemp.Format(KDirMultipleName, 1, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);

			i = 0;
					
			startTime.HomeTime();
			while(i < aN) 
				{
				FileNamesGeneration(buffer, 8, i, i%3+1) ;
				path = directory;
				path.Append(buffer);
				r = TheFs.Delete(path);
				FailIfError(r);
				i++;
				}
			endTime.HomeTime();
			
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		
		if(gTypes >= 2) 
			{
			// all 20.3 chars
			dirtemp.Format(KDirMultipleName, 2, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);

			i = 0;
			startTime.HomeTime();
			while(i < aN) 
			 	{
				FileNamesGeneration(buffer, 20, i, i%3+1) ;
				path = directory;
				path.Append(buffer);
				r = TheFs.Delete(path);
				FailIfError(r);
				i++;
				}	
			endTime.HomeTime();

			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		
		if(gTypes >= 3) 
			{
			// 50/50 
			dirtemp.Format(KDirMultipleName,3, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);
			
			i = 0;
			startTime.HomeTime();
			while(i < aN) 
				{
				if(1 == (i % 2)) 	FileNamesGeneration(buffer, 8, i, i%3+1) ;
				else  		FileNamesGeneration(buffer, 20, i, i%3+1) ;
					
				path = directory;
				path.Append(buffer);
				r = TheFs.Delete(path);
				FailIfError(r);
				i++;
				}
			endTime.HomeTime();

			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		// Stop the noise in the background
		DoTestKill();
		}

	gWriting = ETrue; User::After(1000000);
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
	gWriting = EFalse;
	}

/** Delete all files with two threads accessing the same directory and creating/deleting a file
	with CFileMan::Delete

	@param aN Number of files in the directory	
	@param aStep 	Test step
*/
LOCAL_C void DelAllM2(TInt aN, TInt aStep) 
	{
	TInt r = 0;
	TBuf16<50> directory;
	TBuf16<50> dirtemp;
	
	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;  

	CFileMan* fMan = CFileMan::NewL(TheFs);
	
	if(aN <= gFilesLimit) 
		{	
		// Start the noise in the background
		gDelEntryDir = directory;
		gDelEntryDir2 = directory;
		DoTest(DeleteEntryAccess);
		
		if(gTypes >= 1) 
			{
			// all 8.3 
			dirtemp.Format(KDirMultipleName, 1, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);
			
			startTime.HomeTime();
			directory.Append(_L("F*.*"));
			r = fMan->Delete(directory);
			FailIfError(r);
			
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}

		if(gTypes >= 2) 
			{
			// all 20.3 chars
			dirtemp.Format(KDirMultipleName, 2, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);

			startTime.HomeTime();
			directory.Append(_L("F*.*"));
			r = fMan->Delete(directory);
			FailIfError(r);
			endTime.HomeTime();
			
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit );
			
			}
		if(gTypes >= 3) 
			{
			// 50/50 
			dirtemp.Format(KDirMultipleName, 3, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);

			startTime.HomeTime();
			directory.Append(_L("F*.*"));
			r = fMan->Delete(directory);
			FailIfError(r);
			endTime.HomeTime();
			
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		
		// Stop the noise in the background	
		DoTestKill();
		}
	
	delete fMan;
	
	gWriting = ETrue; User::After(1000000);
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
	gWriting = EFalse;
	}


/** Delete last.txt file with two threads accessing different directories and 
	creating/deleting a file in them 

	@param aN Number of files in the directory
	@param aStep 	Test step
*/
LOCAL_C void DelFileMD1(TInt aN, TInt aStep) 
	{
	TBuf16<100> dir1;
	TBuf16<100> dir2;
	TBuf16<100> dir3;
    TBuf16<100> dir4;
    TBuf16<100> temp;
		
	TInt r = 0;
	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;  


	dir1 = gSessionPath;
	dir2 = gSessionPath;
	dir3 = gSessionPath;
	
	dir4.Format(KDirMultipleName, 1, aN);
	dir1.Append(dir4);
	dir4.Format(KDirMultipleName, 2, aN);
	dir2.Append(dir4);	
	dir4.Format(KDirMultipleName, 3, aN);
	dir3.Append(dir4);


	temp = gSessionPath;
	dir4.Format(KDirMultipleName, 3 ,300);
	temp.Append(dir4);

	if(aN <= gFilesLimit) 
		{
		if(gTypes >= 1) 
			{
			gDelEntryDir = dir1;
			gDelEntryDir2=temp;
			dir1.Append(KCommonFile);
			
			DoTest(DeleteEntryAccess);
			
			startTime.HomeTime();
			
			r = TheFs.Delete(dir1);
			FailIfError(r);
			
			endTime.HomeTime();
			DoTestKill();
			
			timeTaken=endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}

		if(gTypes >= 2) 
			{	
			gDelEntryDir = dir2;
			
			dir2.Append(KCommonFile);
			
			DoTest(DeleteEntryAccess);

			startTime.HomeTime();

			r = TheFs.Delete(dir2);
			FailIfError(r);
			
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			DoTestKill();
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
	
		if(gTypes >= 3) 
			{
			gDelEntryDir = dir3;
			
			dir3.Append(KCommonFile);

			DoTest(DeleteEntryAccess);

			startTime.HomeTime();

			r = TheFs.Delete(dir3);
			FailIfError(r);
			
			endTime.HomeTime();
			DoTestKill();
			
			timeTaken=endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		}
	
	gWriting = ETrue; User::After(1000000);
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
	gWriting = EFalse;
	}

/** Delete last.txt file with two threads accessing different directories and 
	creating/deleting a file in them 

	@param aN Number of files in the directory
	@param aStep 	Test step
*/
LOCAL_C void DelFileMD2(TInt aN, TInt aStep) 
	{
	TBuf16<100> dir1;
	TBuf16<100> dir2;
	TBuf16<100> dir3;
    TBuf16<100> dir4;
    TBuf16<100> temp;
	
	TInt r = 0;
	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;  

	CFileMan* fMan=CFileMan::NewL(TheFs);
	
	dir1 = gSessionPath;
	dir2 = gSessionPath;
	dir3 = gSessionPath;
	
	dir4.Format(KDirMultipleName, 1, aN);
	dir1.Append(dir4);
	dir4.Format(KDirMultipleName, 2, aN);
	dir2.Append(dir4);	
	dir4.Format(KDirMultipleName, 3, aN);
	dir3.Append(dir4);
	
	
	temp=gSessionPath;
	dir4.Format(KDirMultipleName, 3, 300);
	temp.Append(dir4);
	
	if(aN <= gFilesLimit) 
		{
		if(gTypes >= 1) 
			{
			gDelEntryDir = dir1;
			gDelEntryDir2=temp;
			
			dir1.Append(KCommonFile);
			
			DoTest(DeleteEntryAccess);
			
			startTime.HomeTime();
			
			r = fMan->Delete(dir1);
			FailIfError(r);
			
			endTime.HomeTime();
			DoTestKill();
			
			timeTaken=endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}

		if(gTypes >= 2) 
			{	
			dir4=dir2;
			gDelEntryDir = dir4;

			dir2.Append(KCommonFile);
			
			DoTest(DeleteEntryAccess);

			startTime.HomeTime();

			r = fMan->Delete(dir2);
			FailIfError(r);
			
			endTime.HomeTime();
			timeTaken=endTime.MicroSecondsFrom(startTime);
			DoTestKill();
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		if(gTypes >= 3) 
			{
			dir4=dir3;
			gDelEntryDir = dir4;
		
			dir3.Append(KCommonFile);

			
			DoTest(DeleteEntryAccess);

			startTime.HomeTime();

			r = fMan->Delete(dir3);
			FailIfError(r);
			
			endTime.HomeTime();
			DoTestKill();
			
			timeTaken=endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		}
	
	delete fMan;

	gWriting = ETrue; User::After(1000000);
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
	gWriting = EFalse;
	}

/** Delete all files with two threads accessing different directories and 
	creating/deleting a file in them using RFs::Delete

	@param aN Number of files in the directory
	@param aStep 	Test step
*/
LOCAL_C void DelAllMD1(TInt aN, TInt aStep) 
	{
	TInt i = 0,r = 0;
	
	TBuf16<50> directory;
	TBuf16<50> dirtemp;
	TBuf16<50> temp;
	TBuf16<50> dir4;


	TBuf16<50> path;
	TBuf16<50> buffer(50); 	

	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;  

	
	temp=gSessionPath;
	dir4.Format(KDirMultipleName, 3, 300);
	temp.Append(dir4);

	if(aN <= gFilesLimit) 
		{
		if(gTypes >= 1) 
			{
			// all 8.3 
			dirtemp.Format(KDirMultipleName,1, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);

			gDelEntryDir = directory;
			gDelEntryDir2 = temp;

			i = 0;
			
			DoTest(DeleteEntryAccess);
			
			startTime.HomeTime();
			while(i < aN) 
				{
				FileNamesGeneration(buffer, 8, i, i%3+1) ;
				path = directory;
				path.Append(buffer);
				r = TheFs.Delete(path);
				FailIfError(r);
				i++;
				}
			endTime.HomeTime();
			DoTestKill();
			
			timeTaken=endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}

		if(gTypes >= 2) 
			{
			// all 20.3 chars
			dirtemp.Format(KDirMultipleName,2, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);
			gDelEntryDir = directory;
			DoTest(DeleteEntryAccess);

			i = 0;
			startTime.HomeTime();
			while(i<aN) 
				{
				FileNamesGeneration(buffer, 20, i, i%3+1) ;
				path = directory;
				path.Append(buffer);
				r = TheFs.Delete(path);
				FailIfError(r);
				i++;
				}	
			endTime.HomeTime();
			DoTestKill();

			timeTaken=endTime.MicroSecondsFrom(startTime);
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		
		if(gTypes >= 3) 
			{
			// 50/50 
			dirtemp.Format(KDirMultipleName,3, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);
			
			gDelEntryDir = directory;
			DoTest(DeleteEntryAccess);
			i = 0;
			startTime.HomeTime();
			while(i<aN) 
				{
				if(1==(i%2)) 	FileNamesGeneration(buffer, 8, i, i%3+1) ;
				else  		FileNamesGeneration(buffer, 20, i, i%3+1) ;
					
				path = directory;
				path.Append(buffer);
				r = TheFs.Delete(path);
				FailIfError(r);
				i++;
				}
			endTime.HomeTime();
			DoTestKill();

			timeTaken=endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		}
	
	gWriting = ETrue; User::After(1000000);
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
	gWriting = EFalse;
	}

/** Delete all files with two threads accessing different directories and 
	creating/deleting a file in them using CFileMan::Delete

	@param aN 		Number of files in the directory
	@param aStep 	Test step
*/
LOCAL_C void DelAllMD2(TInt aN, TInt aStep) 
	{
	TInt r = 0;
	TBuf16<50> directory;
	TBuf16<50> dirtemp;
	TBuf16<50> dir4;	
	TBuf16<50> temp;	
	

	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;  
	CFileMan* fMan=CFileMan::NewL(TheFs);

	
	// Creating directory for being accessed by other thread
	temp=gSessionPath;
	dir4.Format(KDirMultipleName, 3, 300);
	temp.Append(dir4);
	gDelEntryDir2=temp;

	if(aN <= gFilesLimit) 
		{
		if(gTypes >= 1) 
			{
			// all 8.3 
			dirtemp.Format(KDirMultipleName,1, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);

			gDelEntryDir = directory;

			DoTest(DeleteEntryAccess);
			
			startTime.HomeTime();
			directory.Append(_L("F*.*"));
			r = fMan->Delete(directory);
			FailIfError(r);	
			
			endTime.HomeTime();
			timeTaken=endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit );
			DoTestKill();
			}
		
		if(gTypes >= 2) 
			{
			// all 20.3 chars
			dirtemp.Format(KDirMultipleName,2, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);
			gDelEntryDir = directory;

			DoTest(DeleteEntryAccess);

			startTime.HomeTime();
			directory.Append(_L("F*.*"));
			r = fMan->Delete(directory);
			FailIfError(r);

			endTime.HomeTime();
			DoTestKill();
			
			timeTaken=endTime.MicroSecondsFrom(startTime);
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		if(gTypes >= 3) 
			{
			// 50/50 
			dirtemp.Format(KDirMultipleName,3, aN);
			directory = gSessionPath;
			directory.Append(dirtemp);
			gDelEntryDir = directory;

			DoTest(DeleteEntryAccess);

			startTime.HomeTime();
			directory.Append(_L("F*.*"));
			r = fMan->Delete(directory);
			FailIfError(r);
			
			endTime.HomeTime();
			DoTestKill();
			
			timeTaken=endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		}
	
	delete fMan;
	
	gWriting = ETrue; User::After(1000000);
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
	gWriting = EFalse;
	}


/** Delete last.txt with RFs::Delete

	@param aN 		Number of files in the directory
	@param aStep 	Test step
*/
LOCAL_C void DelFile1(TInt aN, TInt aStep) 
	{
	TBuf16<100> dir1;
	TBuf16<100> dir2;
	TBuf16<100> dir3;
    TBuf16<100> dir4;
	
	TInt r = 0;
	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;  
	
	dir1 = gSessionPath;
	dir2 = gSessionPath;
	dir3 = gSessionPath;
	
	dir4.Format(KDirMultipleName, 1, aN);
	dir1.Append(dir4);
	dir4.Format(KDirMultipleName, 2, aN);
	dir2.Append(dir4);	
	dir4.Format(KDirMultipleName, 3, aN);
	dir3.Append(dir4);

	dir1.Append(KCommonFile);
	dir2.Append(KCommonFile);
	dir3.Append(KCommonFile);

	if(aN <= gFilesLimit) 
		{
		if(gTypes >= 1) 
			{
			startTime.HomeTime();
			
			r = TheFs.Delete(dir1);
			FailIfError(r);
			
			endTime.HomeTime();

			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		if(gTypes >= 2) 
			{
			startTime.HomeTime();

			r = TheFs.Delete(dir2);
			FailIfError(r);
			
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		if(gTypes >= 3) 
			{
			startTime.HomeTime();

			r = TheFs.Delete(dir3);
			FailIfError(r);
			
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		}
	
	gWriting = ETrue; User::After(1000000);
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
	gWriting = EFalse;
	}

/** Delete last.txt with CFileMan::Delete

	@param aN Number of files in the directory
	@param aStep 	Test step
*/
LOCAL_C void DelFile2(TInt aN, TInt aStep) 
	{
	TBuf16<100> dir1;
	TBuf16<100> dir2;
	TBuf16<100> dir3;
	TBuf16<100> dir4;

	TInt r = 0;

	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;  
	
	if(aN <= gFilesLimit) 
		{
		CFileMan* fMan = CFileMan::NewL(TheFs);
		
		dir1 = gSessionPath;
		dir2 = gSessionPath;
		dir3 = gSessionPath;

		dir4.Format(KDirMultipleName, 1, aN);
		dir1.Append(dir4);
		dir4.Format(KDirMultipleName, 2, aN);
		dir2.Append(dir4);
		dir4.Format(KDirMultipleName, 3, aN);
		dir3.Append(dir4);
			
		dir1.Append(KCommonFile);
		dir2.Append(KCommonFile);
		dir3.Append(KCommonFile);

		if(gTypes >= 1) 
			{
			startTime.HomeTime();
			
			r = fMan->Delete(dir1);
			FailIfError(r);
			
			endTime.HomeTime();

			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}
		
		if(gTypes >= 2) 
			{
			startTime.HomeTime();

			r = fMan->Delete(dir2);
			FailIfError(r);
			
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit );
			}

		if(gTypes >= 3) 
			{
			startTime.HomeTime();

			r = fMan->Delete(dir3);
			FailIfError(r);
			
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit);
			} 
		
		delete fMan;
		}
	
	gWriting = ETrue; User::After(1000000);
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
	gWriting = EFalse;
	}

/** Tests the deletion of one file with both API: RFs::Delete and CFileMan::Delete

	@param aSelector Configuration in case of manual execution
*/
LOCAL_C TInt TestDelEntry(TAny* aSelector)
	{
	// Precondition: the drive already filled with the right files

	TInt i = 100;
	TInt testStep = 1;
	
	Validate(aSelector);

	test.Printf(_L("#~TS_Title_%d,%d: Delete last.txt, RFs::Delete\n"), gTestHarness, gTestCase);
	
	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)	
			DelFile1(i, testStep++);
		i += 100;
		}
	
	ReCreateLast();
	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Delete last.txt, CFileMan::Delete\n"), gTestHarness, gTestCase);
		
	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			DelFile2(i, testStep++);
		i += 100;
		}
	
	gTestCase++;
	
	return(KErrNone);
	}

/** Tests the deletion of all the files in a directory with both API: 
	RFs::Delete and CFileMan::Delete

	@param aSelector Configuration in case of manual execution
*/
LOCAL_C TInt TestDelAllFiles(TAny* aSelector)
	{
	// Precondition: drive already filled with the right files

	TInt i = 100;
	TInt testStep = 1;
	
	Validate(aSelector);

	test.Printf(_L("#~TS_Title_%d,%d: Delete all, RFs::Delete\n"), gTestHarness, gTestCase);
	
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			DelAllFiles1(i, testStep++);
		i += 100;
		}

	TestFileCreate(aSelector);
	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Delete all, CFileMan::Delete\n"), gTestHarness, gTestCase);	

	
	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			DelAllFiles2(i, testStep++);
		i += 100;
		}

	gTestCase++;
	return(KErrNone);
	}

/** Tests the deletion of last.txt in a directory with both API: 
	RFs::Delete and CFileMan::Delete while 2 other threads accessing the directory

	@param aSelector Configuration in case of manual execution
*/
LOCAL_C TInt TestDelMultSame(TAny* aSelector)
	{
	TInt i = 100;
	TInt testStep = 1;


	Validate(aSelector);

	TestFileCreate(aSelector);
	
	test.Printf(_L("#~TS_Title_%d,%d: Delete last.txt mult. clients del in same dir, RFs::Delete\n"), gTestHarness, gTestCase);
	
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			DelFileM1(i, testStep++);
		i += 100;
		}

	ReCreateLast();
	gTestCase++;	
	test.Printf(_L("#~TS_Title_%d,%d: Delete last.txt mult. clients del in same dir, CFileMan::Delete\n"), gTestHarness, gTestCase);
	
	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			DelFileM2(i, testStep);
			testStep++;
			}
		i += 100;	
		}

	ReCreateLast();
	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Delete all mult. clients del in same dir, RFs::Delete\n"), gTestHarness, gTestCase);
	
	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			DelAllM1(i, testStep++);
		i += 100;
		}

	TestFileCreate(aSelector);
	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Delete all mult. clients del in same dir, CFileMan::Delete\n"), gTestHarness, gTestCase);

	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			DelAllM2(i, testStep++);
		i += 100;
		}

	gTestCase++;
	
	return(KErrNone);
	}


/** Tests the deletion of last.txt in a directory with both API: 
	RFs::Delete and CFileMan::Delete while 2 threads accessing different directories 
	(the current and one with 300 files)

	@param aSelector Configuration in case of manual execution
*/
LOCAL_C TInt TestDelMultDif(TAny* aSelector)
	{
	TInt i = 100;
	TInt testStep = 1;
	
	Validate(aSelector);
	
	TestFileCreate(aSelector);
	CreateDirWithNFiles(300, 3);
	
	test.Printf(_L("#~TS_Title_%d,%d: Delete last.txt mult. clients del in dif dirs, RFs::Delete\n"), gTestHarness, gTestCase);
	
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			DelFileMD1(i, testStep++);
		i += 100;
		}

	ReCreateLast();
	gTestCase++;	
	test.Printf(_L("#~TS_Title_%d,%d: Delete last.txt mult. clients del in dif dirs, CFileMan::Delete\n"), gTestHarness, gTestCase);
	
	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			DelFileMD2(i, testStep++);
		i += 100;
		}

	ReCreateLast();
	gTestCase++;		
	test.Printf(_L("#~TS_Title_%d,%d: Delete all mult. clients del in dif dirs, RFs::Delete\n"), gTestHarness, gTestCase);
	
	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			DelAllMD1(i, testStep++);
		i += 100;
		}

	TestFileCreate(aSelector);
	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Delete all mult. clients del in dif dirs, CFileMan::Delete\n"), gTestHarness, gTestCase);

	
	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			DelAllMD2(i, testStep++);
		i += 100;
		}

	gTestCase++;
	
	return(KErrNone);
	}

/** Goes automatically through all the options

	@param aSelector Configuration in case of manual execution
*/
LOCAL_C TInt TestAll(TAny* aSelector)
	{
	Validate(aSelector);
	
	gFormat=ETrue; 	// The card will be formatted after this test execution

	TestDelEntry(aSelector);
	TestDelAllFiles(aSelector);
	TestDelMultSame(aSelector);
	TestDelMultDif(aSelector);
	
	return KErrNone;
	}

/** Call all tests

*/
GLDEF_C void CallTestsL()
	{

	TInt r = client.CreateLocal(0);
	FailIfError(r);
	
	// Each test case of the suite has an identifyer for parsing purposes of the results
	gTestHarness = 1; 	
	gTestCase = 1;
	
	PrintHeaders(1, _L("t_fsrdel. Deletion")); 
		
	RThread noisy; 
	TBuf<20> buf = _L("Noisy");
	r = noisy.Create(buf, noise, KDefaultStackSize, KHeapSize, KHeapSize, NULL);
	FailIfError(r);
	
	noisy.Resume();

	CSelectionBox* TheSelector = CSelectionBox::NewL(test.Console());
	
	if(gMode == 0) 
		{ // Manual
		gSessionPath=_L("?:\\");
		TCallBack createFiles(TestFileCreate,TheSelector);
		TCallBack delFile(TestDelEntry,TheSelector);
		TCallBack delAllFiles(TestDelAllFiles,TheSelector);
		TCallBack delMultSame(TestDelMultSame,TheSelector);
		TCallBack delMultDif(TestDelMultDif,TheSelector);
		TCallBack delAll(TestAll,TheSelector);
		TheSelector->AddDriveSelectorL(TheFs);
		TheSelector->AddLineL(_L("Create all files"),createFiles);
		TheSelector->AddLineL(_L("Delete one file from each dir"),delFile);
		TheSelector->AddLineL(_L("Delete all files"),delAllFiles);
		TheSelector->AddLineL(_L("Delete mult clients same dir"),delMultSame);
		TheSelector->AddLineL(_L("Delete mult clients dif dir"),delMultDif);
		TheSelector->AddLineL(_L("Execute all options"),delAll);
		TheSelector->Run();
		}
	else 
		{ // Automatic
		TestAll(TheSelector);
		}
		
	client.Close();
	delete TheSelector;
	
	noisy.Kill(KErrNone);
	noisy.Close();	

	test.Printf(_L("#~TestEnd_%d\n"), gTestHarness);
	}