kerneltest/e32test/pccd/t_meddrv.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/pccd/t_meddrv.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,246 @@
+// 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:
+// e32test\pccd\t_meddrv.cpp
+// General media driver tests
+// 
+//
+
+#include <e32base.h>
+#include <e32base_private.h>
+#include <e32test.h>
+#include <e32svr.h>
+#include <e32hal.h>
+#include <e32uid.h>
+const TInt KHeapSize=0x4000;
+const TInt KTestDriverMediaSize=0x1000;	// 4K
+const TInt KShortBufferSize=0x100;
+
+#define MEDDRV_ATA_NAME _L("MEDATA")
+#define MEDDRV_SINGLE_REQ_NAME _L("MEDT1")
+#define MEDDRV_SIMULTANEOUS_REQ_NAME _L("MEDT2")
+
+LOCAL_D RTest test(_L("T_MEDDRV"));
+LOCAL_D TInt TheDriveNumber=3;	
+
+
+LOCAL_C TInt formatThread(TAny*)
+	{
+
+	TBusLocalDrive anotherDrive;
+	RTest ftest(_L("Formatting thread"));
+	ftest.Title();
+
+	ftest.Start(_L("Connect to local drive"));
+	TBool changeFlag=EFalse;
+	ftest(anotherDrive.Connect(TheDriveNumber,changeFlag)==KErrNone);
+
+	ftest.Next(_L("Format disk"));
+	ftest(anotherDrive.Format(0,KTestDriverMediaSize)==KErrNone);
+	anotherDrive.Disconnect();
+
+    ftest.End();
+	return(KErrNone);
+	}
+
+GLDEF_C TInt E32Main()
+    {
+	TBuf<64> b;
+	TInt r;
+	TInt i;
+
+	test.Title();
+	test.Start(_L("Check loader running"));
+
+#if !defined (__WINS__)
+    test.Next(_L("Read drive information"));
+	TDriveInfoV1Buf dinfo;
+	r=UserHal::DriveInfo(dinfo);
+	test(r==KErrNone);
+	if (dinfo().iTotalSockets==2)
+        TheDriveNumber=3;
+    else if (dinfo().iTotalSockets==1)
+        TheDriveNumber=2;
+    else
+		{
+		test.Printf(_L("Test not supported on this platform"));
+		test.End();
+		return(0);
+		}
+#else
+    TheDriveNumber=3;
+#endif
+
+	test.Next(_L("Load 1st Media Driver"));
+	r=User::LoadPhysicalDevice(MEDDRV_ATA_NAME);
+	test(r==KErrNone||r==KErrAlreadyExists);
+	r=User::LoadPhysicalDevice(MEDDRV_SINGLE_REQ_NAME);
+	test(r==KErrNone||r==KErrAlreadyExists);
+	test.Printf(_L("Media drivers installed:\n\r"));
+	TFindPhysicalDevice findMediaDrv(_L("Media.*"));
+	TFullName findResult;
+	r=findMediaDrv.Next(findResult);
+	while (r==KErrNone)
+		{
+		test.Printf(_L("   %S\n\r"),&findResult);
+		r=findMediaDrv.Next(findResult);
+		}
+
+	b.Format(_L("Connect to local drive %d"),TheDriveNumber);
+	test.Next(b);
+	TBusLocalDrive theDrive;
+	TBool changeFlag=EFalse;
+	test(theDrive.Connect(TheDriveNumber,changeFlag)==KErrNone);
+
+	test.Next(_L("Local drive: Capabilities"));
+	// Generate a media change to open the profiler media driver rather than the standard one
+//	UserSvr::ForceRemountMedia(ERemovableMedia0);
+	User::After(300000); // Wait 0.3Sec
+	TLocalDriveCapsV2Buf info;
+	test(theDrive.Caps(info)==KErrNone);
+	test(I64LOW(info().iSize)==(TUint)KTestDriverMediaSize);
+	test(info().iType==EMediaRam);
+
+	test.Next(_L("Local drive: Write/Read"));
+	TInt len;
+	TBuf8<KShortBufferSize> rdBuf,wrBuf;
+	wrBuf.SetLength(KShortBufferSize);
+	for (i=0;i<KShortBufferSize;i++)
+		wrBuf[i]=(TUint8)i;
+	for (i=0;i<KTestDriverMediaSize;i+=len)
+		{
+		len=Min(KShortBufferSize,(KTestDriverMediaSize-i));
+		wrBuf.SetLength(len);
+		test(theDrive.Write(i,wrBuf)==KErrNone);
+		}
+	for (i=0;i<KTestDriverMediaSize;i+=len)
+		{
+		len=Min(KShortBufferSize,(KTestDriverMediaSize-i));
+		rdBuf.Fill(0,len);
+ 		test(theDrive.Read(i,len,rdBuf)==KErrNone);
+		wrBuf.SetLength(len);
+  	    test(rdBuf.Compare(wrBuf)==0);
+		}
+
+	test.Next(_L("Start 2nd thread to format drive"));
+	RThread thread;
+	TRequestStatus stat;
+	test(thread.Create(_L("Thread"),formatThread,KDefaultStackSize,KHeapSize,KHeapSize,NULL)==KErrNone);
+	thread.Logon(stat);
+	thread.Resume();
+  
+	test.Next(_L("Drive read/write during format"));
+	User::After(2000000); // Wait 2Secs for format to get going
+    rdBuf.SetLength(KShortBufferSize);
+ 	test(theDrive.Read(0,KShortBufferSize,rdBuf)==KErrInUse);
+	wrBuf.SetLength(KShortBufferSize);
+	test(theDrive.Write(0,wrBuf)==KErrInUse);
+    
+    // Verify format unaffected
+    User::WaitForRequest(stat);
+	test(stat==KErrNone);
+	CLOSE_AND_WAIT(thread);
+	wrBuf.Fill(0xFF,KShortBufferSize);
+	for (i=0;i<KTestDriverMediaSize;i+=len)
+		{
+		len=Min(KShortBufferSize,(KTestDriverMediaSize-i));
+		rdBuf.Fill(0,len);
+ 		test(theDrive.Read(i,len,rdBuf)==KErrNone);
+		wrBuf.SetLength(len);
+  	    test(rdBuf.Compare(wrBuf)==0);
+		}
+
+	test.Next(_L("Load 2nd Media Driver"));
+	r=User::FreePhysicalDevice(_L("Media.Tst1"));
+	test(r==KErrNone);
+	r=User::LoadPhysicalDevice(MEDDRV_SIMULTANEOUS_REQ_NAME);
+	test(r==KErrNone||r==KErrAlreadyExists);
+	test.Printf(_L("Media drivers installed:\n\r"));
+	findMediaDrv.Find(_L("Media.*"));
+	r=findMediaDrv.Next(findResult);
+	while (r==KErrNone)
+		{
+		test.Printf(_L("   %S\n\r"),&findResult);
+		r=findMediaDrv.Next(findResult);
+		}
+
+	test.Next(_L("Local drive: Capabilities"));
+	// Generate a media change to open the profiler media driver rather than the standard one
+//	UserSvr::ForceRemountMedia(ERemovableMedia0);
+	User::After(300000); // Wait 0.3Sec
+	test(theDrive.Caps(info)==KErrNone);
+	test(I64LOW(info().iSize)==(TUint)KTestDriverMediaSize);
+	test(info().iType==EMediaFlash);
+
+	test.Next(_L("Local drive: Write/Read"));
+	wrBuf.SetLength(KShortBufferSize);
+	for (i=0;i<KShortBufferSize;i++)
+		wrBuf[i]=(TUint8)i;
+	for (i=0;i<KTestDriverMediaSize;i+=len)
+		{
+		len=Min(KShortBufferSize,(KTestDriverMediaSize-i));
+		wrBuf.SetLength(len);
+		test(theDrive.Write(i,wrBuf)==KErrNone);
+		}
+	for (i=0;i<KTestDriverMediaSize;i+=len)
+		{
+		len=Min(KShortBufferSize,(KTestDriverMediaSize-i));
+		rdBuf.Fill(0,len);
+ 		test(theDrive.Read(i,len,rdBuf)==KErrNone);
+		wrBuf.SetLength(len);
+  	    test(rdBuf.Compare(wrBuf)==0);
+		}
+
+	test.Next(_L("Start 2nd thread again to format drive"));
+	test(thread.Create(_L("Thread"),formatThread,KDefaultStackSize,KHeapSize,KHeapSize,NULL)==KErrNone);
+	thread.Logon(stat);
+	thread.Resume();
+  
+	test.Next(_L("Drive read/write during format"));
+	User::After(2000000); // Wait 2Secs for format to get going
+    rdBuf.SetLength(KShortBufferSize);
+ 	test(theDrive.Read(0,KShortBufferSize,rdBuf)==KErrNone);
+	wrBuf.Fill(0xFF,KShortBufferSize);
+  	test(rdBuf.Compare(wrBuf)==0);
+	
+    for (i=0;i<KShortBufferSize;i++)
+		wrBuf[i]=(TUint8)i;
+	test(theDrive.Write(0,wrBuf)==KErrNone);
+ 	test(theDrive.Read(0,KShortBufferSize,rdBuf)==KErrNone);
+  	test(rdBuf.Compare(wrBuf)==0);
+    
+    // Verify remaining part of format
+    User::WaitForRequest(stat);
+	test(stat==KErrNone);
+	CLOSE_AND_WAIT(thread);
+	wrBuf.Fill(0xFF,KShortBufferSize);
+	for (i=KShortBufferSize;i<KTestDriverMediaSize;i+=len)
+		{
+		len=Min(KShortBufferSize,(KTestDriverMediaSize-i));
+		rdBuf.Fill(0,len);
+ 		test(theDrive.Read(i,len,rdBuf)==KErrNone);
+		wrBuf.SetLength(len);
+  	    test(rdBuf.Compare(wrBuf)==0);
+		}
+
+	test.Next(_L("Unload 2nd Media Driver"));
+	User::FreePhysicalDevice(_L("Media.Tst2"));
+	// Generate a media change to restore the standard one next mount
+//	UserSvr::ForceRemountMedia(ERemovableMedia0);
+	User::After(300000); // Wait 0.3Sec
+
+	theDrive.Disconnect();
+	test.End();
+	return(0);
+	}
+