kerneltest/e32test/pccd/t_meddrv.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:26:05 +0100
branchRCL_3
changeset 29 743008598095
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) 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);
	}