kerneltest/f32test/fsstress/t_remses.cpp
changeset 0 a41df078684a
child 33 0173bcd7697c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/fsstress/t_remses.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,706 @@
+// Copyright (c) 1998-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\fsstress\t_remses.cpp
+// 
+//
+
+#if !defined(__T_REMFSY_H__)
+#include "t_remfsy.h"
+#endif
+
+GLDEF_D TFileName tPath;
+
+LOCAL_C void printDriveAtt(TInt aDrive,TUint anAtt,RTest& aTest);
+LOCAL_C void printDriveInfo(TInt aDrive,TDriveInfo& anInfo, RTest& aTest);
+LOCAL_C void DriveInformation(TInt aDrive,TDriveInfo& anInfo,RTest& aTest);
+
+
+void TMultipleSessionTest::Initialise(RFs& aFs)
+//
+//	Initialise iFs
+//
+	{
+	iFs=aFs;
+	}
+
+
+void TMultipleSessionTest::SetSessionPath(TInt aDrive)
+//
+//	Set the session path for a RFs connection to aDrive
+//
+	{
+	iSessionPath=(_L("?:\\MULTIPLE_SESSION_TEST\\"));
+	TChar driveLetter;
+	TInt r=iFs.DriveToChar(aDrive,driveLetter);
+	test(r==KErrNone);
+		
+	iSessionPath[0]=(TText)driveLetter;
+	r=iFs.SetSessionPath(iSessionPath);
+	test(r==KErrNone);
+	r=iFs.MkDirAll(iSessionPath);
+	test(r==KErrNone || r==KErrAlreadyExists);
+	}
+
+
+void TMultipleSessionTest::RunTests(RTest& aTest)
+//
+//	Run tests on iFs file server session
+//
+
+	{
+	
+	testDriveList(aTest);
+	testDriveInfo(aTest);
+	testVolumeInfo(aTest);
+//	testPowerDown(aTest);
+	testSetVolume(aTest);
+	testInitialisation(aTest);
+//	testMediaChange(aTest);
+	testSubst(aTest);
+	MakeAndDeleteFiles(aTest);
+	}
+
+
+
+void TMultipleSessionTest::testDriveList(RTest& aTest)
+//
+//	Test the drive list.
+//
+	{
+
+	aTest.Next(_L("The drive list"));
+	TInt r=iFs.SetSessionPath(iSessionPath);
+	TDriveList list;
+	r=iFs.DriveList(list);
+	aTest(r==KErrNone);
+
+	for (TInt i=0;i<KMaxDrives;i++)
+		{
+		TInt att=list[i];
+		if (att)
+			printDriveAtt(i,att,aTest);
+		}
+	}
+
+void TMultipleSessionTest::testDriveInfo(RTest& aTest)
+//
+//	Test the drive info.
+//
+	{
+	
+	aTest.Next(_L("The drive info"));
+	TInt r=iFs.SetSessionPath(iSessionPath);
+	TDriveList list;
+	r=iFs.DriveList(list);
+	aTest(r==KErrNone);
+	for (TInt i=0;i<KMaxDrives;i++)
+		{
+		TInt att=list[i];
+		if (att)
+			{
+			TDriveInfo d;
+			r=iFs.Drive(d,i);
+			//aTest(r==KErrNone);
+			printDriveInfo(i,d,aTest);
+			aTest.Printf(_L("\n"));
+			if (r==KErrNone)
+				DriveInformation(i,d, aTest);
+			}
+		}
+	}
+/*
+void TMultipleSessionTest::testPowerDown(RTest& aTest)
+//
+//	Test the effect of multiple power downs
+//
+	{
+	aTest.Next(_L("Power Down"));
+	
+	RTimer timer;
+	test(timer.CreateLocal()==KErrNone);
+	TTime time;
+	TRequestStatus status;
+
+	for (TInt index=0; index<5; index++)
+		{
+		aTest.Printf(_L("********** %d **********\n"),(5-index));
+		time.HomeTime();
+		time+=TTimeIntervalSeconds(8);
+		timer.At(status,time);
+		UserHal::SwitchOff();			// Switch off
+		User::WaitForRequest(status);	// Switch back on
+		aTest(status==KErrNone);
+		}
+	}
+
+*/
+/*
+void TMultipleSessionTest::testMediaChange(RTest& aTest)
+//
+//	Test the effect of multiple media changes
+//
+	{
+	aTest.Next(_L("Media Change"));
+	TInt drive=CurrentDrive(aTest);
+	
+	if (drive>KMaxLocalDrives)
+		return;
+
+#if defined (__MARM__)
+	if (drive==EDriveC)
+		return;
+#endif
+	
+	TLocalDrive theDrive;
+	TLocalDriveCaps info;
+	TBool changedFlag;
+	for (TInt index=0; index<5; index++)
+		{
+		aTest.Printf(_L("********** %d **********\n"),(5-index));
+		changedFlag=EFalse;
+		TInt r=theDrive.Connect(drive,changedFlag);
+		aTest(r==KErrNone);
+		UserSvr::ForceRemountMedia(ERemovableMedia0); // Generate media change
+		aTest(changedFlag);
+
+		do
+			{
+			r=theDrive.Caps(info);
+			} while (r==KErrNotReady);
+//		Wait a second...
+//		User::After(1000000);
+		}
+	}
+*/
+
+void TMultipleSessionTest::testVolumeInfo(RTest& aTest)
+//
+//	Test volume info.
+//
+	{
+
+	aTest.Next(_L("The volume info"));
+	TInt r=iFs.SetSessionPath(iSessionPath);
+	TDriveList list;
+	r=iFs.DriveList(list);
+	aTest(r==KErrNone);
+	for (TInt i=0;i<KMaxDrives;i++)
+		{
+		TVolumeInfo v;
+		if ((r=iFs.Volume(v,i))==KErrNone)
+			{
+			printDriveInfo(i,v.iDrive,aTest);
+			aTest.Printf(_L("   VOL=\"%S\" ID=%08x\n"),&v.iName,v.iUniqueID);
+			aTest.Printf(_L("   SIZE=%ldK FREE=%ldK\n"),v.iSize/1024,v.iFree/1024);
+			}
+		else if (r==KErrNotReady)
+			aTest.Printf(_L("%c: Not Ready\n"),i+'A');
+		else if (r==KErrPathNotFound)
+			aTest.Printf(_L("%c: Not Found\n"),i+'A');
+		else
+			{
+			aTest.Printf(_L("%c: Error %d\n"),i+'A',r);
+			aTest.Getch();
+			}
+		aTest.Printf(_L("\n"));
+		}
+	}
+
+
+void TMultipleSessionTest::testInitialisation(RTest& aTest)
+//
+//	Modified from T_SESSION.  Still tests that calls to CheckedClose() are
+//	OK, ie, tests bug fix, but doesn't check returned error values since remote drive
+//	doesn't necessarily return them.
+//
+	{
+	RFile file;
+	RDir dir;
+		
+	aTest.Next(_L("Test calls to CheckedClose are OK"));
+	
+	TInt r=iFs.SetSessionPath(iSessionPath);
+	TInt count;
+	RFormat format;
+	r=format.Open(iFs,_L("Z:\\"),EFullFormat,count);
+
+	aTest((r==KErrAccessDenied)||(r==KErrInUse));
+	
+	r=dir.Open(iFs,_L("\\MULTIPLE_SESSION_TEST\\ERRORTEST\\"),KEntryAttMatchMask);
+//	aTest(r==KErrPathNotFound);		
+	if (r==KErrNone)
+		dir.Close();
+	
+	r=file.Open(iFs,_L("\\MULTIPLE_SESSION_TEST\\SessionTest1.txt"),EFileRead);
+//	aTest(r==KErrNotFound);
+	if (r==KErrNone)
+		file.Close();
+
+	r=dir.Open(iFs,_L("\\MULTIPLE_SESSION_TEST\\ERRORTEST2\\"),KEntryAttMatchMask);
+//	aTest(r==KErrPathNotFound);		
+	if (r==KErrNone)
+		dir.Close();
+
+	r=file.Open(iFs,_L("\\MULTIPLE_SESSION_TEST\\SessionTest2.txt"),EFileRead);
+//	aTest(r==KErrNotFound);
+	if (r==KErrNone)
+		file.Close();
+
+	r=dir.Open(iFs,_L("\\MULTIPLE_SESSION_TEST\\ERRORTEST3\\"),KEntryAttMatchMask);
+//	aTest(r==KErrPathNotFound);		
+	if (r==KErrNone)
+		dir.Close();
+
+	r=file.Open(iFs,_L("\\MULTIPLE_SESSION_TEST\\SessionTest3.txt"),EFileRead);
+//	aTest(r==KErrNotFound);
+	if (r==KErrNone)
+		file.Close();
+
+	r=file.Open(iFs,_L("\\MULTIPLE_SESSION_TEST\\SessionTest4.txt"),EFileRead);
+//	aTest(r==KErrNotFound);
+	if (r==KErrNone)
+		file.Close();
+	}
+
+
+void TMultipleSessionTest::testSubst(RTest& aTest)
+//
+//	Test the substitute functions
+//
+	{
+
+	aTest.Next(_L("Test subst"));
+	TInt r=iFs.SetSessionPath(iSessionPath);
+	TVolumeInfo v;
+	r=iFs.Volume(v);
+	aTest(r==KErrNone);
+	
+	TDriveInfo driveInfo;
+	r=iFs.Drive(driveInfo,EDriveO);
+	aTest(r==KErrNone);
+
+	testSetVolume(aTest);
+	
+	if (driveInfo.iDriveAtt==KDriveAttLocal)
+		return;	//	Subst local drives fails
+
+	TFileName n;
+	r=iFs.Subst(n,EDriveO);
+	aTest(r==KErrNone);
+	aTest(n.Length()==0);
+	r=iFs.SetSubst(iSessionPath,EDriveO);
+	aTest(r==KErrNone);
+	r=iFs.Subst(n,EDriveO);
+	aTest(r==KErrNone);
+	aTest(n==iSessionPath);
+	TVolumeInfo w;
+	r=iFs.Volume(w,EDriveO);
+	aTest(r==KErrNone);
+	aTest(w.iDrive.iType==v.iDrive.iType);
+	aTest(w.iDrive.iBattery==v.iDrive.iBattery);
+	aTest(w.iDrive.iDriveAtt==v.iDrive.iDriveAtt);
+	aTest(w.iDrive.iMediaAtt==v.iDrive.iMediaAtt);
+	aTest(w.iUniqueID==v.iUniqueID);
+	aTest(w.iSize==v.iSize);
+	aTest(w.iFree==v.iFree);
+	aTest(w.iName==v.iName);
+	TDriveInfo d;
+	r=iFs.Drive(d,EDriveO);
+	aTest(r==KErrNone);
+	aTest(d.iDriveAtt==KDriveAttSubsted);
+
+	aTest.Next(_L("Test real name"));
+	r=iFs.RealName(_L("O:\\FILE.XXX"),n);
+	aTest(r==KErrNone);
+	TFileName substedPath=iSessionPath;
+	substedPath.Append(_L("FILE.XXX"));
+	aTest(n==substedPath);
+
+	aTest.Next(_L("Test MkDir, Rename and RmDir on Substed drive"));
+	r=iFs.MkDir(_L("C:\\MULTIPLE_SESSION_TEST\\TFSRV\\turgid\\"));
+	aTest(r==KErrNone);
+	r=iFs.Rename(_L("O:\\turgid"), _L("O:\\facile"));
+	aTest(r==KErrNone);
+	r=iFs.MkDir(_L("O:\\insipid\\"));
+	aTest(r==KErrNone);
+	r=iFs.Rename(_L("O:\\insipid"), _L("O:\\glib"));
+	aTest(r==KErrNone);
+	r=iFs.RmDir(_L("O:\\facile\\"));
+	aTest(r==KErrNone);
+	r=iFs.RmDir(_L("C:\\MULTIPLE_SESSION_TEST\\TFSRV\\glib\\"));
+	aTest(r==KErrNone);
+
+	r=iFs.SetSubst(_L(""),EDriveO);
+	aTest(r==KErrNone);
+	r=iFs.Subst(n,EDriveO);
+	aTest(r==KErrNone);
+	aTest(n==_L(""));
+	r=iFs.Drive(d,EDriveO);
+	aTest(r==KErrNone);
+	aTest(d.iDriveAtt==0);
+
+	}
+
+
+LOCAL_C TInt CreateFileX(const TDesC& aBaseName,TInt aX, RFs iFs, RTest& aTest)
+//
+// Create a large file. Return KErrEof or KErrNone
+//
+	{
+
+	TBuf<128> fileName=aBaseName;
+	fileName.AppendNum(aX);
+
+	RFile file;
+	TInt r=file.Replace(iFs,fileName,EFileWrite);
+	if (r==KErrDiskFull)
+		return(r);
+	if (r!=KErrNone)
+		{
+		aTest.Printf(_L("ERROR:: Replace returned %d\n"),r);
+		aTest.Getch();
+		return(KErrDiskFull);
+		}
+	r=file.SetSize(65536);
+	if (r==KErrDiskFull)
+		{
+		file.Close();
+		return(r);
+		}
+	if (r!=KErrNone)
+		{
+		aTest.Printf(_L("ERROR:: SetSize returned %d\n"),r);
+		aTest.Getch();
+		file.Close();
+		return(KErrDiskFull);
+		}
+	file.Close();
+	aTest.Printf(_L("Created file %d size 64k\n"),aX);
+	return(KErrNone);
+	}
+
+LOCAL_C TInt DeleteFileX(TBuf<128>& aBaseName,TInt aX, RFs iFs, TInt aDrive,RTest& aTest)
+//
+// Delete a file.
+//
+	{
+
+	TBuf<128> fileName=aBaseName;
+	fileName.AppendNum(aX);
+
+	TInt r=iFs.Delete(fileName);
+	if (aDrive!=EDriveQ)	//	T_REMFSY may return incorrect value on WINS
+		aTest(r==KErrNone);
+	aTest.Printf(_L("Deleted File %d\n"),aX);
+	return(KErrNone);
+	}
+
+void TMultipleSessionTest::MakeAndDeleteFiles(RTest& aTest)
+//
+// Create and delete large files in a randomish order
+//
+	{
+
+	aTest.Next(_L("Create and delete large files"));
+	TInt r=iFs.SetSessionPath(iSessionPath);
+	r=iFs.MkDirAll(_L("\\MULTIPLE_SESSION_TEST\\SMALLDIRECTORY\\"));
+
+	if (CurrentDrive(aTest)!=EDriveQ)	//	T_REMFSY may return incorrect result on WINS
+		aTest(r==KErrNone || r==KErrAlreadyExists);
+	
+	TBuf<128> fileName=_L("\\MULTIPLE_SESSION_TEST\\SMALLDIRECTORY\\FILE");
+	r=CreateFileX(fileName,0,iFs,aTest);
+	aTest(r==KErrNone);
+	r=CreateFileX(fileName,1,iFs,aTest);
+	aTest(r==KErrNone);
+	r=DeleteFileX(fileName,0,iFs,CurrentDrive(aTest),aTest);	
+	aTest(r==KErrNone);
+	r=CreateFileX(fileName,2,iFs,aTest);
+	aTest(r==KErrNone);
+	r=CreateFileX(fileName,1,iFs,aTest);
+	aTest(r==KErrNone);
+	r=CreateFileX(fileName,3,iFs,aTest);
+	aTest(r==KErrNone);
+	r=DeleteFileX(fileName,1,iFs,CurrentDrive(aTest),aTest);	
+	aTest(r==KErrNone);
+	r=CreateFileX(fileName,4,iFs,aTest);
+	aTest(r==KErrNone);
+	r=DeleteFileX(fileName,2,iFs,CurrentDrive(aTest),aTest);	
+	aTest(r==KErrNone);
+	r=DeleteFileX(fileName,3,iFs,CurrentDrive(aTest),aTest);	
+	aTest(r==KErrNone);
+	r=DeleteFileX(fileName,4,iFs,CurrentDrive(aTest),aTest);	
+	aTest(r==KErrNone);
+	r=CreateFileX(fileName,1,iFs,aTest);
+	aTest(r==KErrNone);
+	r=DeleteFileX(fileName,1,iFs,CurrentDrive(aTest),aTest);	
+	aTest(r==KErrNone);
+
+	r=iFs.CheckDisk(fileName);
+	if (r!=KErrNone && r!=KErrNotSupported)
+		aTest.Printf(_L("ERROR:: CheckDisk returned %d\n"),r);
+	}
+
+void TMultipleSessionTest::FillUpDisk(RTest& aTest)
+//
+//	Test that a full disk is ok
+//
+	{
+
+	aTest.Next(_L("Fill disk to capacity"));
+	TInt r=iFs.SetSessionPath(iSessionPath);
+	r=iFs.MkDirAll(_L("\\MULTIPLE_SESSION_TEST\\BIGDIRECTORY\\"));
+	if	(CurrentDrive(aTest)!=EDriveQ)	//	T_REMFSY may return incorrect result on WINS
+		aTest(r==KErrNone || r==KErrAlreadyExists);
+	TInt count=0;
+	TFileName sessionPath;
+	r=iFs.SessionPath(sessionPath);
+	test(sessionPath==iSessionPath);
+	aTest(r==KErrNone);
+	TBuf<128> fileName=_L("\\MULTIPLE_SESSION_TEST\\BIGDIRECTORY\\FILE");
+	FOREVER
+		{
+		TInt r=CreateFileX(fileName,count,iFs, aTest);
+		if (r==KErrDiskFull)
+			break;
+		aTest(r==KErrNone);
+		count++;
+ #if defined(__WINS__)
+		if (count==32 && sessionPath[0]=='C') // Don't fill up disk on NT
+			break;
+ #endif
+		}
+
+	r=iFs.CheckDisk(fileName);
+	if (r!=KErrNone && r!=KErrNotSupported)
+		{
+		aTest.Printf(_L("ERROR:: CheckDisk returned %d\n"),r);
+		aTest.Getch();
+		}
+
+	while(count--)
+		DeleteFileX(fileName,count,iFs,CurrentDrive(aTest),aTest);
+
+	r=iFs.CheckDisk(fileName);
+	if (r!=KErrNone && r!=KErrNotSupported)
+		{
+		aTest.Printf(_L("ERROR:: CheckDisk returned %d\n"),r);
+		aTest.Getch();
+		}
+	}
+
+
+void TMultipleSessionTest::testSetVolume(RTest& aTest)
+//
+//	Test setting the volume info.
+//
+	{
+
+	aTest.Next(_L("Test setting the volume label"));
+	TInt r=iFs.SetSessionPath(iSessionPath);
+	aTest(r==KErrNone);
+#if defined(_UNICODE)
+	aTest.Printf(_L("Unicode volume label set not implemented ****\n"));
+	return;
+#else
+	TInt driveNum=CurrentDrive(aTest);
+	TVolumeInfo v;
+	r=iFs.Volume(v,driveNum);
+	aTest(r==KErrNone);
+	TFileName n=v.iName;
+	aTest.Printf(_L("VOL=\"%S\"\n"),&n);
+
+	aTest.Next(_L("Set volume label to nothing"));
+	r=iFs.SetVolumeLabel(_L(""),driveNum);
+	if (r==KErrGeneral)
+		return;
+	aTest(r==KErrNone);
+	r=iFs.Volume(v,driveNum);
+	aTest(r==KErrNone);
+	aTest(v.iName==_L(""));
+	aTest.Printf(_L("VOL=\"%S\"\n"),&v.iName);
+
+	aTest.Next(_L("Set volume label to ABCDEFGHIJK"));
+	r=iFs.SetVolumeLabel(_L("ABCDEFGHIJK"),driveNum);
+	aTest(r==KErrNone);
+	r=iFs.Volume(v,driveNum);
+	aTest(r==KErrNone);
+	aTest(v.iName==_L("ABCDEFGHIJK"));
+	aTest.Printf(_L("VOL=\"%S\"\n"),&v.iName);
+
+	aTest.Next(_L("Set volume label back to nothing"));
+	r=iFs.SetVolumeLabel(_L(""),driveNum);
+	aTest(r==KErrNone);
+	r=iFs.Volume(v,driveNum);
+	aTest(r==KErrNone);
+	aTest(v.iName==_L(""));
+	aTest.Printf(_L("VOL=\"%S\"\n"),&v.iName);
+
+	aTest.Next(_L("Set volume label to original"));
+	r=iFs.SetVolumeLabel(n,driveNum);
+	aTest(r==KErrNone);
+	r=iFs.Volume(v,driveNum);
+	aTest(r==KErrNone);
+	aTest(v.iName==n);
+	aTest.Printf(_L("VOL=\"%S\"\n"),&v.iName);
+
+#endif
+	}
+
+
+LOCAL_C void printDriveAtt(TInt aDrive,TUint anAtt,RTest& aTest)
+//
+// Print a drive attribute.
+//
+	{
+
+	aTest.Printf(_L("%c: "),aDrive+'A');
+	if (anAtt&KDriveAttRemote)
+		aTest.Printf(_L("REMOTE "));
+	else if (anAtt&KDriveAttLocal)
+		aTest.Printf(_L("LOCAL "));
+	if (anAtt&KDriveAttRom)
+		aTest.Printf(_L("ROM "));
+	if (anAtt&KDriveAttRedirected)
+		aTest.Printf(_L("REDIRECTED "));
+	if (anAtt&KDriveAttSubsted)
+		aTest.Printf(_L("SUBST "));
+	if (anAtt&KDriveAttInternal)
+		aTest.Printf(_L("INTERNAL "));
+	if (anAtt&KDriveAttRemovable)
+		aTest.Printf(_L("REMOVABLE "));
+	aTest.Printf(_L("\n"));
+	}
+
+LOCAL_C void printDriveInfo(TInt aDrive,TDriveInfo& anInfo,RTest& aTest)
+//
+// Print a drive info.
+//
+	{
+
+	printDriveAtt(aDrive,anInfo.iDriveAtt,aTest);
+	aTest.Printf(_L("   MEDIA-ATT="));
+	if (anInfo.iMediaAtt==0)
+		aTest.Printf(_L("<none>"));
+	if (anInfo.iMediaAtt&KMediaAttVariableSize)
+		aTest.Printf(_L("VariableSize "));
+	if (anInfo.iMediaAtt&KMediaAttDualDensity)
+		aTest.Printf(_L("DualDensity "));
+	if (anInfo.iMediaAtt&KMediaAttFormattable)
+		aTest.Printf(_L("Formattable "));
+	if (anInfo.iMediaAtt&KMediaAttWriteProtected)
+		aTest.Printf(_L("WProtected "));
+	aTest.Printf(_L("\n   BATTERY="));
+	switch(anInfo.iBattery)
+		{
+	case EBatNotSupported: aTest.Printf(_L("Not supported\n")); break;
+	case EBatGood: aTest.Printf(_L("Good\n")); break;
+	case EBatLow: aTest.Printf(_L("Low\n")); break;
+	default:
+		aTest.Printf(_L("Unknown value\n"));
+		}
+	aTest.Printf(_L("   MEDIA="));
+	switch(anInfo.iType)
+		{
+	case EMediaNotPresent: aTest.Printf(_L("Not present\n")); break;
+	case EMediaUnknown: aTest.Printf(_L("Unknown\n")); break;
+	case EMediaFloppy: aTest.Printf(_L("Floppy\n")); break;
+	case EMediaHardDisk: aTest.Printf(_L("Hard disk\n")); break;
+	case EMediaCdRom: aTest.Printf(_L("CD Rom\n")); break;
+	case EMediaRam: aTest.Printf(_L("Ram\n")); break;
+	case EMediaFlash: aTest.Printf(_L("Flash\n")); break;
+	case EMediaRom: aTest.Printf(_L("Rom\n")); break;
+	case EMediaRemote: aTest.Printf(_L("Remote\n")); break;
+	default:
+		aTest.Printf(_L("Unknown value\n"));
+		}
+	}
+
+LOCAL_C void DriveInformation(TInt aDrive,TDriveInfo& anInfo,RTest& aTest)
+//
+//	Test the drive info is reasonable
+//
+	{
+
+	aTest(anInfo.iBattery==EBatLow || anInfo.iBattery==EBatGood || anInfo.iBattery==EBatNotSupported);
+	
+	if (aDrive==EDriveZ)
+		{
+		if (anInfo.iType==EMediaNotPresent)
+			return;
+		
+		aTest(anInfo.iMediaAtt==KMediaAttWriteProtected);
+		aTest(anInfo.iDriveAtt==(KDriveAttRom|KDriveAttInternal));
+		aTest(anInfo.iType==EMediaRom);
+		}
+	
+	else if (aDrive==EDriveC || aDrive==EDriveY)
+		{
+		if (anInfo.iType==EMediaNotPresent)
+			return;
+
+		aTest(anInfo.iDriveAtt==(KDriveAttLocal|KDriveAttInternal));
+		aTest(anInfo.iType==EMediaHardDisk);
+		aTest(anInfo.iMediaAtt==(KMediaAttVariableSize|KMediaAttFormattable));
+		}
+	else if (aDrive==EDriveD || aDrive==EDriveX)
+		{
+		if (anInfo.iType==EMediaNotPresent)
+			return;
+
+		aTest(anInfo.iDriveAtt==(KDriveAttLocal|KDriveAttRemovable));
+		aTest(anInfo.iType==EMediaHardDisk);
+		aTest(anInfo.iMediaAtt==KMediaAttFormattable);
+		}
+	}
+
+
+
+GLDEF_C void ReportCheckDiskFailure(TInt aRet,RTest& aTest)
+//
+// Report the failure of checkdisk
+//
+	{
+
+	aTest.Printf(_L("CHECKDISK FAILED: "));
+	switch(aRet)
+		{
+	case 1:	aTest.Printf(_L("File cluster chain contains a bad value (<2 or >maxCluster)\n")); break;
+	case 2:	aTest.Printf(_L("Two files are linked to the same cluster\n")); break;
+	case 3:	aTest.Printf(_L("Unallocated cluster contains a value != 0\n"));	break;
+	case 4:	aTest.Printf(_L("Size of file != number of clusters in chain\n")); break;
+	default: aTest.Printf(_L("Undefined Error value %d\n"),aRet);
+		}
+	aTest.Printf(_L("Press any key to continue\n"));
+	aTest.Getch();
+	}
+
+
+
+TInt TMultipleSessionTest::CurrentDrive(RTest& aTest)
+//
+// Return the current drive number
+//
+	{
+	TInt r=iFs.SetSessionPath(iSessionPath);
+	aTest(r==KErrNone);
+	TInt driveNum;
+	r=iFs.CharToDrive(iSessionPath[0],driveNum);
+	aTest(r==KErrNone);
+	return(driveNum);
+	}
+
+
+	
+