os/kernelhwsrv/kerneltest/e32test/pccd/t_meddrv.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200 (2012-06-15)
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// e32test\pccd\t_meddrv.cpp
sl@0
    15
// General media driver tests
sl@0
    16
// 
sl@0
    17
//
sl@0
    18
sl@0
    19
#include <e32base.h>
sl@0
    20
#include <e32base_private.h>
sl@0
    21
#include <e32test.h>
sl@0
    22
#include <e32svr.h>
sl@0
    23
#include <e32hal.h>
sl@0
    24
#include <e32uid.h>
sl@0
    25
const TInt KHeapSize=0x4000;
sl@0
    26
const TInt KTestDriverMediaSize=0x1000;	// 4K
sl@0
    27
const TInt KShortBufferSize=0x100;
sl@0
    28
sl@0
    29
#define MEDDRV_ATA_NAME _L("MEDATA")
sl@0
    30
#define MEDDRV_SINGLE_REQ_NAME _L("MEDT1")
sl@0
    31
#define MEDDRV_SIMULTANEOUS_REQ_NAME _L("MEDT2")
sl@0
    32
sl@0
    33
LOCAL_D RTest test(_L("T_MEDDRV"));
sl@0
    34
LOCAL_D TInt TheDriveNumber=3;	
sl@0
    35
sl@0
    36
sl@0
    37
LOCAL_C TInt formatThread(TAny*)
sl@0
    38
	{
sl@0
    39
sl@0
    40
	TBusLocalDrive anotherDrive;
sl@0
    41
	RTest ftest(_L("Formatting thread"));
sl@0
    42
	ftest.Title();
sl@0
    43
sl@0
    44
	ftest.Start(_L("Connect to local drive"));
sl@0
    45
	TBool changeFlag=EFalse;
sl@0
    46
	ftest(anotherDrive.Connect(TheDriveNumber,changeFlag)==KErrNone);
sl@0
    47
sl@0
    48
	ftest.Next(_L("Format disk"));
sl@0
    49
	ftest(anotherDrive.Format(0,KTestDriverMediaSize)==KErrNone);
sl@0
    50
	anotherDrive.Disconnect();
sl@0
    51
sl@0
    52
    ftest.End();
sl@0
    53
	return(KErrNone);
sl@0
    54
	}
sl@0
    55
sl@0
    56
GLDEF_C TInt E32Main()
sl@0
    57
    {
sl@0
    58
	TBuf<64> b;
sl@0
    59
	TInt r;
sl@0
    60
	TInt i;
sl@0
    61
sl@0
    62
	test.Title();
sl@0
    63
	test.Start(_L("Check loader running"));
sl@0
    64
sl@0
    65
#if !defined (__WINS__)
sl@0
    66
    test.Next(_L("Read drive information"));
sl@0
    67
	TDriveInfoV1Buf dinfo;
sl@0
    68
	r=UserHal::DriveInfo(dinfo);
sl@0
    69
	test(r==KErrNone);
sl@0
    70
	if (dinfo().iTotalSockets==2)
sl@0
    71
        TheDriveNumber=3;
sl@0
    72
    else if (dinfo().iTotalSockets==1)
sl@0
    73
        TheDriveNumber=2;
sl@0
    74
    else
sl@0
    75
		{
sl@0
    76
		test.Printf(_L("Test not supported on this platform"));
sl@0
    77
		test.End();
sl@0
    78
		return(0);
sl@0
    79
		}
sl@0
    80
#else
sl@0
    81
    TheDriveNumber=3;
sl@0
    82
#endif
sl@0
    83
sl@0
    84
	test.Next(_L("Load 1st Media Driver"));
sl@0
    85
	r=User::LoadPhysicalDevice(MEDDRV_ATA_NAME);
sl@0
    86
	test(r==KErrNone||r==KErrAlreadyExists);
sl@0
    87
	r=User::LoadPhysicalDevice(MEDDRV_SINGLE_REQ_NAME);
sl@0
    88
	test(r==KErrNone||r==KErrAlreadyExists);
sl@0
    89
	test.Printf(_L("Media drivers installed:\n\r"));
sl@0
    90
	TFindPhysicalDevice findMediaDrv(_L("Media.*"));
sl@0
    91
	TFullName findResult;
sl@0
    92
	r=findMediaDrv.Next(findResult);
sl@0
    93
	while (r==KErrNone)
sl@0
    94
		{
sl@0
    95
		test.Printf(_L("   %S\n\r"),&findResult);
sl@0
    96
		r=findMediaDrv.Next(findResult);
sl@0
    97
		}
sl@0
    98
sl@0
    99
	b.Format(_L("Connect to local drive %d"),TheDriveNumber);
sl@0
   100
	test.Next(b);
sl@0
   101
	TBusLocalDrive theDrive;
sl@0
   102
	TBool changeFlag=EFalse;
sl@0
   103
	test(theDrive.Connect(TheDriveNumber,changeFlag)==KErrNone);
sl@0
   104
sl@0
   105
	test.Next(_L("Local drive: Capabilities"));
sl@0
   106
	// Generate a media change to open the profiler media driver rather than the standard one
sl@0
   107
//	UserSvr::ForceRemountMedia(ERemovableMedia0);
sl@0
   108
	User::After(300000); // Wait 0.3Sec
sl@0
   109
	TLocalDriveCapsV2Buf info;
sl@0
   110
	test(theDrive.Caps(info)==KErrNone);
sl@0
   111
	test(I64LOW(info().iSize)==(TUint)KTestDriverMediaSize);
sl@0
   112
	test(info().iType==EMediaRam);
sl@0
   113
sl@0
   114
	test.Next(_L("Local drive: Write/Read"));
sl@0
   115
	TInt len;
sl@0
   116
	TBuf8<KShortBufferSize> rdBuf,wrBuf;
sl@0
   117
	wrBuf.SetLength(KShortBufferSize);
sl@0
   118
	for (i=0;i<KShortBufferSize;i++)
sl@0
   119
		wrBuf[i]=(TUint8)i;
sl@0
   120
	for (i=0;i<KTestDriverMediaSize;i+=len)
sl@0
   121
		{
sl@0
   122
		len=Min(KShortBufferSize,(KTestDriverMediaSize-i));
sl@0
   123
		wrBuf.SetLength(len);
sl@0
   124
		test(theDrive.Write(i,wrBuf)==KErrNone);
sl@0
   125
		}
sl@0
   126
	for (i=0;i<KTestDriverMediaSize;i+=len)
sl@0
   127
		{
sl@0
   128
		len=Min(KShortBufferSize,(KTestDriverMediaSize-i));
sl@0
   129
		rdBuf.Fill(0,len);
sl@0
   130
 		test(theDrive.Read(i,len,rdBuf)==KErrNone);
sl@0
   131
		wrBuf.SetLength(len);
sl@0
   132
  	    test(rdBuf.Compare(wrBuf)==0);
sl@0
   133
		}
sl@0
   134
sl@0
   135
	test.Next(_L("Start 2nd thread to format drive"));
sl@0
   136
	RThread thread;
sl@0
   137
	TRequestStatus stat;
sl@0
   138
	test(thread.Create(_L("Thread"),formatThread,KDefaultStackSize,KHeapSize,KHeapSize,NULL)==KErrNone);
sl@0
   139
	thread.Logon(stat);
sl@0
   140
	thread.Resume();
sl@0
   141
  
sl@0
   142
	test.Next(_L("Drive read/write during format"));
sl@0
   143
	User::After(2000000); // Wait 2Secs for format to get going
sl@0
   144
    rdBuf.SetLength(KShortBufferSize);
sl@0
   145
 	test(theDrive.Read(0,KShortBufferSize,rdBuf)==KErrInUse);
sl@0
   146
	wrBuf.SetLength(KShortBufferSize);
sl@0
   147
	test(theDrive.Write(0,wrBuf)==KErrInUse);
sl@0
   148
    
sl@0
   149
    // Verify format unaffected
sl@0
   150
    User::WaitForRequest(stat);
sl@0
   151
	test(stat==KErrNone);
sl@0
   152
	CLOSE_AND_WAIT(thread);
sl@0
   153
	wrBuf.Fill(0xFF,KShortBufferSize);
sl@0
   154
	for (i=0;i<KTestDriverMediaSize;i+=len)
sl@0
   155
		{
sl@0
   156
		len=Min(KShortBufferSize,(KTestDriverMediaSize-i));
sl@0
   157
		rdBuf.Fill(0,len);
sl@0
   158
 		test(theDrive.Read(i,len,rdBuf)==KErrNone);
sl@0
   159
		wrBuf.SetLength(len);
sl@0
   160
  	    test(rdBuf.Compare(wrBuf)==0);
sl@0
   161
		}
sl@0
   162
sl@0
   163
	test.Next(_L("Load 2nd Media Driver"));
sl@0
   164
	r=User::FreePhysicalDevice(_L("Media.Tst1"));
sl@0
   165
	test(r==KErrNone);
sl@0
   166
	r=User::LoadPhysicalDevice(MEDDRV_SIMULTANEOUS_REQ_NAME);
sl@0
   167
	test(r==KErrNone||r==KErrAlreadyExists);
sl@0
   168
	test.Printf(_L("Media drivers installed:\n\r"));
sl@0
   169
	findMediaDrv.Find(_L("Media.*"));
sl@0
   170
	r=findMediaDrv.Next(findResult);
sl@0
   171
	while (r==KErrNone)
sl@0
   172
		{
sl@0
   173
		test.Printf(_L("   %S\n\r"),&findResult);
sl@0
   174
		r=findMediaDrv.Next(findResult);
sl@0
   175
		}
sl@0
   176
sl@0
   177
	test.Next(_L("Local drive: Capabilities"));
sl@0
   178
	// Generate a media change to open the profiler media driver rather than the standard one
sl@0
   179
//	UserSvr::ForceRemountMedia(ERemovableMedia0);
sl@0
   180
	User::After(300000); // Wait 0.3Sec
sl@0
   181
	test(theDrive.Caps(info)==KErrNone);
sl@0
   182
	test(I64LOW(info().iSize)==(TUint)KTestDriverMediaSize);
sl@0
   183
	test(info().iType==EMediaFlash);
sl@0
   184
sl@0
   185
	test.Next(_L("Local drive: Write/Read"));
sl@0
   186
	wrBuf.SetLength(KShortBufferSize);
sl@0
   187
	for (i=0;i<KShortBufferSize;i++)
sl@0
   188
		wrBuf[i]=(TUint8)i;
sl@0
   189
	for (i=0;i<KTestDriverMediaSize;i+=len)
sl@0
   190
		{
sl@0
   191
		len=Min(KShortBufferSize,(KTestDriverMediaSize-i));
sl@0
   192
		wrBuf.SetLength(len);
sl@0
   193
		test(theDrive.Write(i,wrBuf)==KErrNone);
sl@0
   194
		}
sl@0
   195
	for (i=0;i<KTestDriverMediaSize;i+=len)
sl@0
   196
		{
sl@0
   197
		len=Min(KShortBufferSize,(KTestDriverMediaSize-i));
sl@0
   198
		rdBuf.Fill(0,len);
sl@0
   199
 		test(theDrive.Read(i,len,rdBuf)==KErrNone);
sl@0
   200
		wrBuf.SetLength(len);
sl@0
   201
  	    test(rdBuf.Compare(wrBuf)==0);
sl@0
   202
		}
sl@0
   203
sl@0
   204
	test.Next(_L("Start 2nd thread again to format drive"));
sl@0
   205
	test(thread.Create(_L("Thread"),formatThread,KDefaultStackSize,KHeapSize,KHeapSize,NULL)==KErrNone);
sl@0
   206
	thread.Logon(stat);
sl@0
   207
	thread.Resume();
sl@0
   208
  
sl@0
   209
	test.Next(_L("Drive read/write during format"));
sl@0
   210
	User::After(2000000); // Wait 2Secs for format to get going
sl@0
   211
    rdBuf.SetLength(KShortBufferSize);
sl@0
   212
 	test(theDrive.Read(0,KShortBufferSize,rdBuf)==KErrNone);
sl@0
   213
	wrBuf.Fill(0xFF,KShortBufferSize);
sl@0
   214
  	test(rdBuf.Compare(wrBuf)==0);
sl@0
   215
	
sl@0
   216
    for (i=0;i<KShortBufferSize;i++)
sl@0
   217
		wrBuf[i]=(TUint8)i;
sl@0
   218
	test(theDrive.Write(0,wrBuf)==KErrNone);
sl@0
   219
 	test(theDrive.Read(0,KShortBufferSize,rdBuf)==KErrNone);
sl@0
   220
  	test(rdBuf.Compare(wrBuf)==0);
sl@0
   221
    
sl@0
   222
    // Verify remaining part of format
sl@0
   223
    User::WaitForRequest(stat);
sl@0
   224
	test(stat==KErrNone);
sl@0
   225
	CLOSE_AND_WAIT(thread);
sl@0
   226
	wrBuf.Fill(0xFF,KShortBufferSize);
sl@0
   227
	for (i=KShortBufferSize;i<KTestDriverMediaSize;i+=len)
sl@0
   228
		{
sl@0
   229
		len=Min(KShortBufferSize,(KTestDriverMediaSize-i));
sl@0
   230
		rdBuf.Fill(0,len);
sl@0
   231
 		test(theDrive.Read(i,len,rdBuf)==KErrNone);
sl@0
   232
		wrBuf.SetLength(len);
sl@0
   233
  	    test(rdBuf.Compare(wrBuf)==0);
sl@0
   234
		}
sl@0
   235
sl@0
   236
	test.Next(_L("Unload 2nd Media Driver"));
sl@0
   237
	User::FreePhysicalDevice(_L("Media.Tst2"));
sl@0
   238
	// Generate a media change to restore the standard one next mount
sl@0
   239
//	UserSvr::ForceRemountMedia(ERemovableMedia0);
sl@0
   240
	User::After(300000); // Wait 0.3Sec
sl@0
   241
sl@0
   242
	theDrive.Disconnect();
sl@0
   243
	test.End();
sl@0
   244
	return(0);
sl@0
   245
	}
sl@0
   246