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