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