os/kernelhwsrv/kerneltest/f32test/shostmassstorage/msman/test/cblockdevicetester.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 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
//
sl@0
    15
sl@0
    16
sl@0
    17
#include <e32def.h>
sl@0
    18
#include <e32cmn.h>
sl@0
    19
#include <f32file.h>
sl@0
    20
#include <e32test.h>
sl@0
    21
#include <e32math.h>
sl@0
    22
sl@0
    23
#include "tmslog.h"
sl@0
    24
#include "cblockdevicetester.h"
sl@0
    25
sl@0
    26
extern RTest test;
sl@0
    27
extern RFs fsSession;
sl@0
    28
sl@0
    29
sl@0
    30
const TInt KTestCaseDataOffset = 9;
sl@0
    31
_LIT8(KTxtTestCaseOutPreamble,  "5555AAAA");
sl@0
    32
_LIT8(KTxtTestCaseInPreamble,   "AAAA5555");
sl@0
    33
_LIT8(KTxtTestCase,         "T");
sl@0
    34
_LIT8(KTxtTestEnable,       "E");
sl@0
    35
_LIT8(KTxtTestSenseError,   "S");
sl@0
    36
_LIT8(KTxtTestConfig,       "C");
sl@0
    37
sl@0
    38
sl@0
    39
void TLocalBuffer::Init()
sl@0
    40
    {
sl@0
    41
    __MSFNSLOG
sl@0
    42
    TInt64 rndSeed = 123456789;
sl@0
    43
sl@0
    44
    //-- initialize buffer with random rubbish
sl@0
    45
    iBuffer.SetMax();
sl@0
    46
    for (TInt i = 0; i < KSize; ++i)
sl@0
    47
        {
sl@0
    48
        iBuffer[i] = static_cast<TUint8>(Math::Rand(rndSeed));
sl@0
    49
        }
sl@0
    50
sl@0
    51
    test.Printf(_L("Test area size is %x blocks\n"), KSizeInBlocks);
sl@0
    52
    }
sl@0
    53
sl@0
    54
sl@0
    55
void TLocalBuffer::Update(TInt aPos, TUint aLen)
sl@0
    56
    {
sl@0
    57
    // complement data
sl@0
    58
    for (TInt i = 0; i < aLen; i++, aPos++)
sl@0
    59
        {
sl@0
    60
        iBuffer[aPos] = ~iBuffer[aPos];
sl@0
    61
        }
sl@0
    62
    }
sl@0
    63
sl@0
    64
sl@0
    65
RTargetMedia::RTargetMedia(TInt aDriveNumber)
sl@0
    66
:   iDriveNumber(aDriveNumber)
sl@0
    67
    {
sl@0
    68
    __MSFNSLOG
sl@0
    69
    }
sl@0
    70
sl@0
    71
sl@0
    72
void RTargetMedia::OpenL()
sl@0
    73
    {
sl@0
    74
    __MSFNSLOG
sl@0
    75
    User::LeaveIfError(iRawDisk.Open(fsSession, iDriveNumber));
sl@0
    76
    }
sl@0
    77
sl@0
    78
sl@0
    79
void RTargetMedia::Close()
sl@0
    80
    {
sl@0
    81
    __MSFNSLOG
sl@0
    82
    iRawDisk.Close();
sl@0
    83
    }
sl@0
    84
sl@0
    85
sl@0
    86
TInt RTargetMedia::MediaRawWrite(TPos aPos, const TDesC8& aData)
sl@0
    87
    {
sl@0
    88
    __MSFNSLOG
sl@0
    89
    return iRawDisk.Write(aPos, (TDesC8&)aData);
sl@0
    90
    }
sl@0
    91
sl@0
    92
sl@0
    93
TInt RTargetMedia::MediaRawRead(TPos aPos, TUint32 aLen, TDes8& aData)
sl@0
    94
    {
sl@0
    95
    __MSFNSLOG
sl@0
    96
    aData.SetMax();
sl@0
    97
    TPtr8 ptr = aData.LeftTPtr(aLen);
sl@0
    98
    TInt err = iRawDisk.Read(aPos, ptr);
sl@0
    99
    aData.SetLength(aLen);
sl@0
   100
    return err;
sl@0
   101
    }
sl@0
   102
sl@0
   103
sl@0
   104
RTargetDrive::RTargetDrive(TInt aDriveNumber)
sl@0
   105
:   RTargetMedia(aDriveNumber)
sl@0
   106
    {
sl@0
   107
    }
sl@0
   108
sl@0
   109
TInt RTargetDrive::OpenTestAreaL(const TDesC8& aData)
sl@0
   110
    {
sl@0
   111
    __MSFNSLOG
sl@0
   112
    RTargetMedia::OpenL();
sl@0
   113
    iStartLba = 0x20;
sl@0
   114
sl@0
   115
    iSource.Set(aData);
sl@0
   116
    test.Printf(_L("Test area located @ LBA=%x\n"), iStartLba);
sl@0
   117
sl@0
   118
    return MediaRawWrite(StartPos(), iSource);
sl@0
   119
    }
sl@0
   120
sl@0
   121
sl@0
   122
TInt RTargetDrive::Update(TInt aPos, TUint aLen)
sl@0
   123
    {
sl@0
   124
    __MSFNSLOG
sl@0
   125
    TPtrC8 ptr = iSource.Mid(aPos, aLen);
sl@0
   126
    TPos targetPos = TargetPos(aPos);
sl@0
   127
    return MediaRawWrite(targetPos, ptr);
sl@0
   128
    }
sl@0
   129
sl@0
   130
sl@0
   131
TInt RTargetDrive::Verify()
sl@0
   132
    {
sl@0
   133
    __MSFNLOG
sl@0
   134
    TInt res = MediaRawRead(StartPos(), iSource.Length(), iTmpBuffer);
sl@0
   135
    if (res)
sl@0
   136
        return res;
sl@0
   137
sl@0
   138
    res = iTmpBuffer.Compare(iSource);
sl@0
   139
    return res == 0 ? KErrNone : KErrCorrupt;
sl@0
   140
    }
sl@0
   141
sl@0
   142
TInt RTargetDrive::Verify(TInt aPos, TUint aLen)
sl@0
   143
    {
sl@0
   144
    __MSFNSLOG
sl@0
   145
    TPos pos = TargetPos(aPos);
sl@0
   146
    TInt res = MediaRawRead(pos, aLen, iTmpBuffer);
sl@0
   147
    if (res)
sl@0
   148
        return res;
sl@0
   149
sl@0
   150
    iTmpBuffer.SetLength(aLen);
sl@0
   151
    TPtrC8 ptr = iSource.Mid(aPos, aLen);
sl@0
   152
sl@0
   153
    res = iTmpBuffer.Compare(ptr);
sl@0
   154
    return res == 0 ? KErrNone : KErrCorrupt;
sl@0
   155
    }
sl@0
   156
sl@0
   157
sl@0
   158
TInt RTargetDrive::VerifyBlock(TLba aLba, TLba aBlocks)
sl@0
   159
    {
sl@0
   160
    __MSFNSLOG
sl@0
   161
    return Verify(TLbaUtils::Pos(aLba), TLbaUtils::Length(aBlocks));
sl@0
   162
    }
sl@0
   163
sl@0
   164
sl@0
   165
_LIT(KTxtControlFile, "ControlFile.txt");
sl@0
   166
static const TChar KFillChar = 'x';
sl@0
   167
sl@0
   168
TTargetTestArea::TTargetTestArea(RTargetMedia& aMedia)
sl@0
   169
:   iTargetMedia(aMedia)
sl@0
   170
    {
sl@0
   171
    __MSFNLOG
sl@0
   172
    }
sl@0
   173
sl@0
   174
void TTargetTestArea::CreateControlFile()
sl@0
   175
    {
sl@0
   176
    __MSFNLOG
sl@0
   177
    iStartLba = -1;
sl@0
   178
    static const TInt KBlockSize = 0x200;
sl@0
   179
    static const TInt KFileSize = KBlockSize * 8;
sl@0
   180
sl@0
   181
    RFile file;
sl@0
   182
sl@0
   183
    TBuf8<KFileSize> testData;
sl@0
   184
    testData.Fill(KFillChar, KFileSize);
sl@0
   185
sl@0
   186
    // write control file
sl@0
   187
    TInt err = file.Replace(fsSession, KTxtControlFile, EFileStream);
sl@0
   188
    test(err == KErrNone);
sl@0
   189
sl@0
   190
    err = file.Write(testData);
sl@0
   191
    test(err == KErrNone);
sl@0
   192
sl@0
   193
    file.Close();
sl@0
   194
    }
sl@0
   195
sl@0
   196
sl@0
   197
void TTargetTestArea::RemoveControlFile()
sl@0
   198
    {
sl@0
   199
    __MSFNLOG
sl@0
   200
    TInt err = fsSession.Delete(KTxtControlFile);
sl@0
   201
    test(err == KErrNone);
sl@0
   202
    }
sl@0
   203
sl@0
   204
sl@0
   205
void TTargetTestArea::FindBlockStartL()
sl@0
   206
    {
sl@0
   207
    __MSFNLOG
sl@0
   208
    iTargetMedia.OpenL();
sl@0
   209
    // search for first block
sl@0
   210
    TBuf8<KBlockSize> readBlock;
sl@0
   211
    TBuf8<KBlockSize> refBlock;
sl@0
   212
    refBlock.Fill(KFillChar, KBlockSize);
sl@0
   213
sl@0
   214
    TInt err = KErrNone;
sl@0
   215
    TInt lba;
sl@0
   216
    for (lba = 0; ;lba++)
sl@0
   217
        {
sl@0
   218
        err = iTargetMedia.MediaRawRead(lba*KBlockSize, KBlockSize, readBlock);
sl@0
   219
sl@0
   220
        if (err != KErrNone)
sl@0
   221
            {
sl@0
   222
            lba = -1;
sl@0
   223
            break;
sl@0
   224
            }
sl@0
   225
sl@0
   226
        if (readBlock == refBlock)
sl@0
   227
            {
sl@0
   228
            break;
sl@0
   229
            }
sl@0
   230
        }
sl@0
   231
sl@0
   232
    iStartLba = lba;
sl@0
   233
    iTargetMedia.Close();
sl@0
   234
    test.Printf(_L("Block found at 0x%x"), lba);
sl@0
   235
    }
sl@0
   236
sl@0
   237
sl@0
   238
TInt TTargetTestArea::WriteBlockL(TBuf8<KBlockSize>& aBlock)
sl@0
   239
    {
sl@0
   240
    __MSFNLOG
sl@0
   241
    iTargetMedia.OpenL();
sl@0
   242
    TInt err = iTargetMedia.MediaRawWrite(iStartLba * KBlockSize, aBlock);
sl@0
   243
    iTargetMedia.Close();
sl@0
   244
    return err;
sl@0
   245
    }
sl@0
   246
sl@0
   247
sl@0
   248
TInt TTargetTestArea::ReadBlockL(TBuf8<KBlockSize>& aBlock)
sl@0
   249
    {
sl@0
   250
    __MSFNLOG
sl@0
   251
    iTargetMedia.OpenL();
sl@0
   252
    TInt err = iTargetMedia.MediaRawRead(iStartLba * KBlockSize, KBlockSize, aBlock);
sl@0
   253
    iTargetMedia.Close();
sl@0
   254
    return err;
sl@0
   255
    }
sl@0
   256
sl@0
   257
sl@0
   258
RBlockTargetMedia::RBlockTargetMedia(TInt aDriveNumber)
sl@0
   259
:   RTargetMedia(aDriveNumber)
sl@0
   260
    {
sl@0
   261
    __MSFNSLOG
sl@0
   262
    }
sl@0
   263
sl@0
   264
sl@0
   265
void RBlockTargetMedia::OpenL()
sl@0
   266
    {
sl@0
   267
    __MSFNSLOG
sl@0
   268
    RTargetMedia::OpenL();
sl@0
   269
sl@0
   270
    TInt64 rndSeed = 123456789;
sl@0
   271
sl@0
   272
    //-- initialize buffer with random rubbish
sl@0
   273
    iBlockData.SetMax();
sl@0
   274
    for (TInt i = 0; i < iBlockData.Length(); ++i)
sl@0
   275
        {
sl@0
   276
        iBlockData[i] = static_cast<TUint8>(Math::Rand(rndSeed));
sl@0
   277
        }
sl@0
   278
    }
sl@0
   279
sl@0
   280
sl@0
   281
TInt RBlockTargetMedia::WriteBlock(TLba aLba)
sl@0
   282
    {
sl@0
   283
    __MSFNSLOG
sl@0
   284
    TPos pos = TLbaUtils::Pos(aLba);
sl@0
   285
    return iRawDisk.Write(pos, (TDesC8&)iBlockData);
sl@0
   286
    }
sl@0
   287
sl@0
   288
sl@0
   289
TInt RBlockTargetMedia::ReadBlock(TLba aLba)
sl@0
   290
    {
sl@0
   291
    __MSFNSLOG
sl@0
   292
    TBuf8<KBlockSize> blockData;
sl@0
   293
    TPos pos = TLbaUtils::Pos(aLba);
sl@0
   294
    blockData.SetMax();
sl@0
   295
    TInt err = iRawDisk.Read(pos, blockData);
sl@0
   296
    return err;
sl@0
   297
    }
sl@0
   298
sl@0
   299
sl@0
   300
CBlockDeviceTester* CBlockDeviceTester::NewL(TInt aDriveNumber)
sl@0
   301
    {
sl@0
   302
    __MSFNSLOG
sl@0
   303
	CBlockDeviceTester* r = new (ELeave) CBlockDeviceTester(aDriveNumber);
sl@0
   304
	CleanupStack::PushL(r);
sl@0
   305
sl@0
   306
	r->ConstructL();
sl@0
   307
	CleanupStack::Pop();
sl@0
   308
	return r;
sl@0
   309
    }
sl@0
   310
sl@0
   311
sl@0
   312
void CBlockDeviceTester::ConstructL()
sl@0
   313
    {
sl@0
   314
    __MSFNLOG
sl@0
   315
    TVolumeInfo volumeInfo;
sl@0
   316
sl@0
   317
    User::LeaveIfError(fsSession.Volume(volumeInfo, iDriveNumber));
sl@0
   318
    test.Printf(_L("Drive=%d Size = %lx\n"), iDriveNumber, volumeInfo.iSize);
sl@0
   319
    iDriveSizeInBlocks = volumeInfo.iSize / KBlockSize;
sl@0
   320
    iLocalBuffer.Init();
sl@0
   321
    iTargetDrive.OpenTestAreaL(iLocalBuffer.Buffer());
sl@0
   322
    }
sl@0
   323
sl@0
   324
sl@0
   325
CBlockDeviceTester::CBlockDeviceTester(TInt aDriveNumber)
sl@0
   326
:   iDriveNumber(aDriveNumber),
sl@0
   327
    iTargetDrive(aDriveNumber)
sl@0
   328
    {
sl@0
   329
    __MSFNLOG
sl@0
   330
    }
sl@0
   331
sl@0
   332
sl@0
   333
CBlockDeviceTester::~CBlockDeviceTester()
sl@0
   334
    {
sl@0
   335
    __MSFNLOG
sl@0
   336
    iTargetDrive.Close();
sl@0
   337
    }
sl@0
   338
sl@0
   339
sl@0
   340
void CBlockDeviceTester::OpenDriveL()
sl@0
   341
    {
sl@0
   342
    iTargetDrive.OpenL();
sl@0
   343
    }
sl@0
   344
sl@0
   345
void CBlockDeviceTester::CloseDrive()
sl@0
   346
    {
sl@0
   347
    iTargetDrive.Close();
sl@0
   348
    }
sl@0
   349
sl@0
   350
sl@0
   351
sl@0
   352
TInt CBlockDeviceTester::VerifyDrive()
sl@0
   353
    {
sl@0
   354
    __MSFNLOG
sl@0
   355
    return iTargetDrive.Verify();
sl@0
   356
    }
sl@0
   357
sl@0
   358
sl@0
   359
TInt CBlockDeviceTester::Update(TPos aPos, TUint aLen)
sl@0
   360
    {
sl@0
   361
    __MSFNLOG
sl@0
   362
    iLocalBuffer.Update(aPos, aLen);
sl@0
   363
    return iTargetDrive.Update(aPos, aLen);
sl@0
   364
    }
sl@0
   365
sl@0
   366
sl@0
   367
TInt CBlockDeviceTester::UpdateBlock(TLba aLba, TLba aBlocks)
sl@0
   368
    {
sl@0
   369
    __MSFNLOG
sl@0
   370
    return Update(TLbaUtils::Pos(aLba), TLbaUtils::Length(aBlocks));
sl@0
   371
    }
sl@0
   372
sl@0
   373
sl@0
   374
TInt CBlockDeviceTester::Verify(TPos aPos, TUint aLen)
sl@0
   375
    {
sl@0
   376
    __MSFNLOG
sl@0
   377
    return iTargetDrive.Verify(aPos, aLen);
sl@0
   378
    }
sl@0
   379
sl@0
   380
TInt CBlockDeviceTester::VerifyBlock(TLba aLba, TLba aBlocks)
sl@0
   381
    {
sl@0
   382
    __MSFNLOG
sl@0
   383
    return iTargetDrive.VerifyBlock(aLba, aBlocks);
sl@0
   384
    }
sl@0
   385
sl@0
   386
/**
sl@0
   387
 * CBotTester
sl@0
   388
 */
sl@0
   389
CBotTester* CBotTester::NewL(TInt aDriveNumber)
sl@0
   390
    {
sl@0
   391
    __MSFNSLOG
sl@0
   392
	CBotTester* r = new (ELeave) CBotTester(aDriveNumber);
sl@0
   393
	CleanupStack::PushL(r);
sl@0
   394
sl@0
   395
	r->ConstructL();
sl@0
   396
	CleanupStack::Pop();
sl@0
   397
	return r;
sl@0
   398
    }
sl@0
   399
sl@0
   400
sl@0
   401
void CBotTester::ConstructL()
sl@0
   402
    {
sl@0
   403
    __MSFNLOG
sl@0
   404
sl@0
   405
    CBlockDeviceTester::ConstructL();
sl@0
   406
sl@0
   407
    iCmdBuffer.Append(KTxtTestCaseOutPreamble);
sl@0
   408
    iCmdBuffer.Append(KTxtTestCase);
sl@0
   409
    iCmdBuffer.AppendFill('t', iCmdBuffer.MaxLength() - iCmdBuffer.Length());
sl@0
   410
sl@0
   411
    iOutEnableBuffer.Append(KTxtTestCaseOutPreamble);
sl@0
   412
    iOutEnableBuffer.Append(KTxtTestEnable);
sl@0
   413
    iOutEnableBuffer.AppendFill('o', iOutEnableBuffer.MaxLength() - iOutEnableBuffer.Length());
sl@0
   414
sl@0
   415
    iInEnableBuffer.Append(KTxtTestCaseInPreamble);
sl@0
   416
    iInEnableBuffer.Append(KTxtTestEnable);
sl@0
   417
    iInEnableBuffer.AppendFill('i', iInEnableBuffer.MaxLength() - iInEnableBuffer.Length());
sl@0
   418
    }
sl@0
   419
sl@0
   420
sl@0
   421
CBotTester::CBotTester(TInt aDriveNumber)
sl@0
   422
:   CBlockDeviceTester(aDriveNumber)
sl@0
   423
    {
sl@0
   424
    __MSFNLOG
sl@0
   425
    }
sl@0
   426
sl@0
   427
sl@0
   428
CBotTester::~CBotTester()
sl@0
   429
    {
sl@0
   430
    __MSFNLOG
sl@0
   431
    iTargetDrive.Close();
sl@0
   432
    }
sl@0
   433
sl@0
   434
sl@0
   435
TInt CBotTester::SetTest(TTestCase aTestCase)
sl@0
   436
    {
sl@0
   437
    __MSFNLOG
sl@0
   438
    iCmdBuffer[KTestCaseDataOffset] = static_cast<TUint8>(aTestCase);
sl@0
   439
sl@0
   440
    TPos pos = KSetTestPos;
sl@0
   441
    return iTargetDrive.MediaRawWrite(pos, iCmdBuffer);
sl@0
   442
    }
sl@0
   443
sl@0
   444
sl@0
   445
TInt CBotTester::WriteEnableFile()
sl@0
   446
    {
sl@0
   447
    __MSFNLOG
sl@0
   448
    TPos pos = KWriteEnableFilePos;
sl@0
   449
    return iTargetDrive.MediaRawWrite(pos, iOutEnableBuffer);
sl@0
   450
    }
sl@0
   451
sl@0
   452
sl@0
   453
TInt CBotTester::InitReadEnableFile()
sl@0
   454
    {
sl@0
   455
    __MSFNLOG
sl@0
   456
    TPos pos = KReadEnableFilePos;
sl@0
   457
    return iTargetDrive.MediaRawWrite(pos, iInEnableBuffer);
sl@0
   458
    }
sl@0
   459
sl@0
   460
sl@0
   461
TInt CBotTester::ReadEnableFile()
sl@0
   462
    {
sl@0
   463
    __MSFNLOG
sl@0
   464
    TBuf8<KInEnableBufferSize> readBuf(KInEnableBufferSize);
sl@0
   465
    TPos pos = KReadEnableFilePos;
sl@0
   466
    return iTargetDrive.MediaRawRead(pos, readBuf.Size(), readBuf);
sl@0
   467
    }
sl@0
   468
sl@0
   469
sl@0
   470
/**
sl@0
   471
 * CSbcErrTester
sl@0
   472
 */
sl@0
   473
CSbcErrTester* CSbcErrTester::NewL(TInt aDriveNumber)
sl@0
   474
    {
sl@0
   475
    __MSFNSLOG
sl@0
   476
	CSbcErrTester* r = new (ELeave) CSbcErrTester(aDriveNumber);
sl@0
   477
	CleanupStack::PushL(r);
sl@0
   478
sl@0
   479
	r->ConstructL();
sl@0
   480
	CleanupStack::Pop();
sl@0
   481
	return r;
sl@0
   482
    }
sl@0
   483
sl@0
   484
sl@0
   485
void CSbcErrTester::ConstructL()
sl@0
   486
    {
sl@0
   487
    __MSFNLOG
sl@0
   488
sl@0
   489
    CBlockDeviceTester::ConstructL();
sl@0
   490
sl@0
   491
    iCmdBuffer.Append(KTxtTestCaseOutPreamble);
sl@0
   492
    iCmdBuffer.Append(KTxtTestCase);
sl@0
   493
    iCmdBuffer.AppendFill('t', iCmdBuffer.MaxLength() - iCmdBuffer.Length());
sl@0
   494
sl@0
   495
    iEnableBuffer.Append(KTxtTestCaseOutPreamble);
sl@0
   496
    iEnableBuffer.Append(KTxtTestEnable);
sl@0
   497
    iEnableBuffer.AppendFill('e', iEnableBuffer.MaxLength() - iEnableBuffer.Length());
sl@0
   498
sl@0
   499
    iSenseErrorBuffer.Append(KTxtTestCaseOutPreamble);
sl@0
   500
    iSenseErrorBuffer.Append(KTxtTestSenseError);
sl@0
   501
    iSenseErrorBuffer.AppendFill('s', iSenseErrorBuffer.MaxLength() - iSenseErrorBuffer.Length());
sl@0
   502
    }
sl@0
   503
sl@0
   504
sl@0
   505
CSbcErrTester::CSbcErrTester(TInt aDriveNumber)
sl@0
   506
:   CBlockDeviceTester(aDriveNumber)
sl@0
   507
    {
sl@0
   508
    __MSFNLOG
sl@0
   509
    }
sl@0
   510
sl@0
   511
sl@0
   512
CSbcErrTester::~CSbcErrTester()
sl@0
   513
    {
sl@0
   514
    __MSFNLOG
sl@0
   515
    iTargetDrive.Close();
sl@0
   516
    }
sl@0
   517
sl@0
   518
sl@0
   519
TInt CSbcErrTester::WriteTestFile()
sl@0
   520
    {
sl@0
   521
    __MSFNLOG
sl@0
   522
    TPos pos = KWriteTestFilePos;
sl@0
   523
    return iTargetDrive.MediaRawWrite(pos, iEnableBuffer);
sl@0
   524
    }
sl@0
   525
sl@0
   526
sl@0
   527
TInt CSbcErrTester::ReadTestFile()
sl@0
   528
    {
sl@0
   529
    __MSFNLOG
sl@0
   530
    TBuf8<KEnableBufferSize> readBuf(KEnableBufferSize);
sl@0
   531
    TPos pos = KReadTestFilePos;
sl@0
   532
    TInt err = iTargetDrive.MediaRawRead(pos, readBuf.Size(), readBuf);
sl@0
   533
    return err;
sl@0
   534
    }
sl@0
   535
sl@0
   536
sl@0
   537
TInt CSbcErrTester::WriteSenseErrorFile(TTestSenseError aTestSenseError)
sl@0
   538
    {
sl@0
   539
    __MSFNLOG
sl@0
   540
    iSenseErrorBuffer[KTestCaseDataOffset] = static_cast<TUint8>(aTestSenseError);
sl@0
   541
    TPos pos = KSenseErrorFile;
sl@0
   542
    return iTargetDrive.MediaRawWrite(pos, iSenseErrorBuffer);
sl@0
   543
    }
sl@0
   544
sl@0
   545
sl@0
   546
CWrPrTester* CWrPrTester::NewL(TInt aDriveNumber)
sl@0
   547
    {
sl@0
   548
    __MSFNSLOG
sl@0
   549
	CWrPrTester* r = new (ELeave) CWrPrTester(aDriveNumber);
sl@0
   550
	CleanupStack::PushL(r);
sl@0
   551
	r->ConstructL();
sl@0
   552
	CleanupStack::Pop();
sl@0
   553
	return r;
sl@0
   554
    }
sl@0
   555
sl@0
   556
sl@0
   557
void CWrPrTester::ConstructL()
sl@0
   558
    {
sl@0
   559
    __MSFNLOG
sl@0
   560
    iCmdBuffer.Append(KTxtTestCaseOutPreamble);
sl@0
   561
    iCmdBuffer.Append(KTxtTestConfig);
sl@0
   562
    iCmdBuffer.AppendFill('c', iCmdBuffer.MaxLength() - iCmdBuffer.Length());
sl@0
   563
sl@0
   564
    iInCmdBuffer.Append(KTxtTestCaseInPreamble);
sl@0
   565
    iInCmdBuffer.Append(KTxtTestConfig);
sl@0
   566
    iInCmdBuffer.AppendFill('c', iInCmdBuffer.MaxLength() - iInCmdBuffer.Length());
sl@0
   567
sl@0
   568
    iTargetTestArea.CreateControlFile();
sl@0
   569
    iTargetTestArea.FindBlockStartL();
sl@0
   570
    }
sl@0
   571
sl@0
   572
sl@0
   573
CWrPrTester::CWrPrTester(TInt aDriveNumber)
sl@0
   574
:   iTargetMedia(aDriveNumber),
sl@0
   575
    iTargetTestArea(iTargetMedia)
sl@0
   576
    {
sl@0
   577
    __MSFNLOG
sl@0
   578
    }
sl@0
   579
sl@0
   580
sl@0
   581
CWrPrTester::~CWrPrTester()
sl@0
   582
    {
sl@0
   583
    __MSFNLOG
sl@0
   584
    iTargetTestArea.RemoveControlFile();
sl@0
   585
    }
sl@0
   586
sl@0
   587
sl@0
   588
void CWrPrTester::SetWriteProtectL()
sl@0
   589
    {
sl@0
   590
    __MSFNLOG
sl@0
   591
    // first write WrPr CLR Control block to media to enable setting to be
sl@0
   592
    // cleared
sl@0
   593
    iInCmdBuffer[KTestCaseDataOffset] = ETestConfigMediaWpClr;
sl@0
   594
    TInt err = iTargetTestArea.WriteBlockL(iInCmdBuffer);
sl@0
   595
    User::LeaveIfError(err);
sl@0
   596
sl@0
   597
    // Now write WrPr Set Control block to test client
sl@0
   598
    iCmdBuffer[KTestCaseDataOffset] = ETestConfigMediaWpSet;
sl@0
   599
    iTargetMedia.OpenL();
sl@0
   600
    err = iTargetMedia.MediaRawWrite(KCmdPos, iCmdBuffer);
sl@0
   601
    User::LeaveIfError(err);
sl@0
   602
    iTargetMedia.Close();
sl@0
   603
    }
sl@0
   604
sl@0
   605
sl@0
   606
void CWrPrTester::ClrWriteProtectL()
sl@0
   607
    {
sl@0
   608
    __MSFNLOG
sl@0
   609
    test.Printf(_L("Clearing WRITE PROTECT"));
sl@0
   610
    TInt err = KErrNone;
sl@0
   611
    // Write protect so read the control file from the drive
sl@0
   612
    TBuf8<KCmdBufferSize> buffer;
sl@0
   613
    buffer.SetLength(KCmdBufferSize);
sl@0
   614
    iTargetTestArea.ReadBlockL(buffer);
sl@0
   615
sl@0
   616
    if (buffer != iInCmdBuffer)
sl@0
   617
        {
sl@0
   618
        err = KErrCorrupt;
sl@0
   619
        }
sl@0
   620
    User::LeaveIfError(err);
sl@0
   621
    }
sl@0
   622
sl@0
   623
sl@0
   624
TInt CWrPrTester::SetRemovableL()
sl@0
   625
    {
sl@0
   626
    __MSFNLOG
sl@0
   627
    iCmdBuffer[KTestCaseDataOffset] = ETestConfigMediaRmbSet;
sl@0
   628
    iTargetMedia.OpenL();
sl@0
   629
    TInt err = iTargetMedia.MediaRawWrite(KCmdPos, iCmdBuffer);
sl@0
   630
    iTargetMedia.Close();
sl@0
   631
    return err;
sl@0
   632
    }
sl@0
   633
sl@0
   634
TInt CWrPrTester::ClrRemovableL()
sl@0
   635
    {
sl@0
   636
    __MSFNLOG
sl@0
   637
    iCmdBuffer[KTestCaseDataOffset] = ETestConfigMediaRmbClr;
sl@0
   638
    iTargetMedia.OpenL();
sl@0
   639
    TInt err = iTargetMedia.MediaRawWrite(KCmdPos, iCmdBuffer);
sl@0
   640
    iTargetMedia.Close();
sl@0
   641
    return err;
sl@0
   642
    }
sl@0
   643
sl@0
   644
sl@0
   645
TInt CWrPrTester::WriteReadTestL()
sl@0
   646
    {
sl@0
   647
    __MSFNLOG
sl@0
   648
    TInt err = KErrNone;
sl@0
   649
    TBuf8<KCmdBufferSize> wrBuffer;
sl@0
   650
sl@0
   651
    wrBuffer.SetMax();
sl@0
   652
    for (TInt i = 0; i < KCmdBufferSize; i++)
sl@0
   653
        {
sl@0
   654
        wrBuffer[i] = i;
sl@0
   655
        }
sl@0
   656
sl@0
   657
    err = iTargetTestArea.WriteBlockL(wrBuffer);
sl@0
   658
    if (err == KErrNone)
sl@0
   659
        {
sl@0
   660
        TBuf8<KCmdBufferSize> rdBuffer;
sl@0
   661
        rdBuffer.SetMax();
sl@0
   662
        err = iTargetTestArea.ReadBlockL(rdBuffer);
sl@0
   663
        User::LeaveIfError(err);
sl@0
   664
sl@0
   665
        if (wrBuffer != rdBuffer)
sl@0
   666
            {
sl@0
   667
            err = KErrCorrupt;
sl@0
   668
            }
sl@0
   669
        }
sl@0
   670
sl@0
   671
    if (err)
sl@0
   672
        {
sl@0
   673
        test.Printf(_L("WriteRead test returned %d\n"), err);
sl@0
   674
        }
sl@0
   675
    return err;
sl@0
   676
    }
sl@0
   677
sl@0
   678
sl@0
   679