kerneltest/f32test/shostmassstorage/msman/test/t_msblock.cpp
changeset 0 a41df078684a
child 297 b2826f67641f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/shostmassstorage/msman/test/t_msblock.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,237 @@
+// Copyright (c) 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:
+//
+
+
+#include <e32def.h>
+#include <e32cmn.h>
+#include <e32base.h>
+#include <f32file.h>
+#include <e32cons.h>
+#include <e32debug.h>
+#define __E32TEST_EXTENSION__
+#include <e32test.h>
+#include <e32property.h>
+
+#include "f32_test_utils.h"
+
+#include "cblockdevicetester.h"
+#include "cmsdrive.h"
+#include "tmsprintdrive.h"
+#include "ttestutils.h"
+#include "tmslog.h"
+
+using namespace F32_Test_Utils;
+
+extern CMsDrive* msDrive;
+
+RTest test(_L("T_MSBLOCK"));
+RFs fsSession;
+
+
+class TTestMsBlock
+    {
+public:
+    void tFileAccess();
+    void tBlockAccessL();
+    void tRawAccessL();
+    void tLastLbaAccessL();
+    };
+
+
+void TTestMsBlock::tFileAccess()
+    {
+    test.Start(_L("tFileAccess\n"));
+
+    test.Next(_L("DriveInfo"));
+    PrintDrvInfo(fsSession, msDrive->DriveNumber());
+
+    TVolumeInfo volInfo;
+    TInt err = fsSession.Volume(volInfo);
+    test(err == KErrNone);
+
+    test.Printf(_L("Memory 'in use' = %lx\n"), (volInfo.iSize - volInfo.iFree));
+    test.Printf(_L("volInfo.iSize = %lx\n"), volInfo.iSize);
+    test.Printf(_L("volInfo.iFree = %lx\n"), volInfo.iFree);
+
+    //-- 1. create a file
+    _LIT(KFile, "\\test_file.file");
+    const TUint KFileSz = 54321;
+
+    test.Next(_L("Write file\n"));
+    err = CreateCheckableStuffedFile(fsSession, KFile, KFileSz);
+    test_KErrNone(err);
+
+    //-- 2. verify the file, just in case.
+    test.Next(_L("Verify file\n"));
+    err = VerifyCheckableFile(fsSession, KFile);
+    test_KErrNone(err);
+
+    //-- 3. delete the file
+    test.Next(_L("Delete file\n"));
+    fsSession.Delete(KFile);
+    test.End();
+    }
+
+void TTestMsBlock::tBlockAccessL()
+    {
+    test.Start(_L("tBlockAccess\n"));
+
+    test.Next(_L("Create Test drive\n"));
+    TInt driveNumber = msDrive->DriveNumber();
+    CBlockDeviceTester* blockDeviceTester = CBlockDeviceTester::NewL(driveNumber);
+
+    test.Next(_L("Verify Test area on drive\n"));
+    TInt res = blockDeviceTester->VerifyDrive();
+    test_KErrNone(res);
+
+    test.Next(_L("Test Single Block access\n"));
+    TLba lba = 1;
+    TLba blocks = 1;
+
+    test.Printf(_L("write block LBA=0x%x Blocks=0x%x\n"),lba, blocks);
+    res = blockDeviceTester->UpdateBlock(lba, blocks);
+    test_KErrNone(res);
+
+    test.Printf(_L("read block LBA=0x%x Blocks=0x%x\n"),lba, blocks);
+    res = blockDeviceTester->VerifyBlock(lba, blocks);
+    test_KErrNone(res);
+
+    test.Printf(_L("Verify drive\n"));
+    res = blockDeviceTester->VerifyDrive();
+    test_KErrNone(res);
+
+    test.Next(_L("Test Multiple Block access\n"));
+    lba = 6;
+    blocks = 7;
+    res = blockDeviceTester->UpdateBlock(lba, blocks);
+    test_KErrNone(res);
+    res = blockDeviceTester->VerifyBlock(lba, blocks);
+    test_KErrNone(res);
+    res = blockDeviceTester->VerifyDrive();
+    test_KErrNone(res);
+
+    delete blockDeviceTester;
+    test.End();
+    }
+
+void TTestMsBlock::tRawAccessL()
+    {
+    test.Start(_L("tRawAccess\n"));
+
+    // Head
+    const TPos KPos_H = (KBlockSize * 5) + 0x7;
+    const TUint KLen_H = 0x123;
+
+    // Head + Tail
+    const TPos KPos_HT = (KBlockSize * 7) + 0x180;
+    const TUint KLen_HT = 0x100;
+
+    // Head + Body + Tail
+    const TPos KPos_HBT = (KBlockSize * 9) + 0x190;
+    const TUint KLen_HBT = (KBlockSize * 4) + 0x110;
+
+
+    test.Next(_L("Create Test drive\n"));
+    TInt driveNumber = msDrive->DriveNumber();
+    CBlockDeviceTester* blockDeviceTester = CBlockDeviceTester::NewL(driveNumber);
+
+    test.Next(_L("Verify Test area on drive\n"));
+    TInt res = blockDeviceTester->VerifyDrive();
+    test_KErrNone(res);
+
+
+    TPos pos = KPos_H;
+    TUint len = KLen_H;
+    test.Next(_L("Test head access\n"));
+    test.Printf(_L("Pos=0x%lx Len=0x%x\n"), pos, len);
+    res = blockDeviceTester->Update(pos, len);
+    test_KErrNone(res);
+    res = blockDeviceTester->Verify(pos, len);
+    test_KErrNone(res);
+    res = blockDeviceTester->VerifyDrive();
+    test_KErrNone(res);
+
+    pos = KPos_HT;
+    len = KLen_HT;
+    test.Next(_L("Test head + tail access\n"));
+    test.Printf(_L("Pos=0x%lx Len=0x%x\n"), pos, len);
+    res = blockDeviceTester->Update(pos, len);
+    test_KErrNone(res);
+    res = blockDeviceTester->Verify(pos, len);
+    test_KErrNone(res);
+    res = blockDeviceTester->VerifyDrive();
+    test_KErrNone(res);
+
+    pos = KPos_HBT;
+    len = KLen_HBT;
+    test.Next(_L("Test head + body+ tail access\n"));
+    test.Printf(_L("Pos=0x%lx Len=0x%x\n"), pos, len);
+    res = blockDeviceTester->Update(pos, len);
+    test_KErrNone(res);
+    res = blockDeviceTester->Verify(pos, len);
+    test_KErrNone(res);
+    res = blockDeviceTester->VerifyDrive();
+    test_KErrNone(res);
+
+    delete blockDeviceTester;
+    test.End();
+    }
+
+
+void TTestMsBlock::tLastLbaAccessL()
+    {
+    test.Start(_L("tLastLbaAccess\n"));
+    test.Next(_L("tLastLbaAccess\n"));
+
+    TInt driveNumber = msDrive->DriveNumber();
+
+    TVolumeInfo volInfo;
+    TInt err = fsSession.Volume(volInfo);
+    test(err == KErrNone);
+
+    test.Printf(_L("Memory 'in use' = 0x%lx (0x%x)\n"),
+                (volInfo.iSize - volInfo.iFree), (volInfo.iSize - volInfo.iFree)/KBlockSize);
+    test.Printf(_L("volInfo.iSize   = 0x%lx (0x%x)\n"),
+                volInfo.iSize, volInfo.iSize/KBlockSize);
+    test.Printf(_L("volInfo.iFree   = 0x%lx (0x%x)\n"),
+                volInfo.iFree, volInfo.iFree/KBlockSize);
+
+    TLba lba = volInfo.iSize/KBlockSize;
+    RBlockTargetMedia media(driveNumber);
+    media.OpenL();
+
+    TInt writeRes = KErrNone;
+    TInt readRes = KErrNone;
+    test.Printf(_L("LBA=%x\n"), lba);
+    for (;writeRes == KErrNone && readRes == KErrNone; lba++)
+        {
+        writeRes = media.WriteBlock(lba);
+        readRes = media.ReadBlock(lba);
+        }
+
+    test.Printf(_L("LBA=%x ERR Write=%d Read=%d\n"), lba, writeRes, readRes);
+
+    media.Close();
+    test.End();
+    }
+
+void CallTestsL()
+    {
+    TTestMsBlock t;
+    t.tFileAccess();
+    t.tBlockAccessL();
+    t.tRawAccessL();
+    t.tLastLbaAccessL();
+    }