kerneltest/f32test/filesystem/fat/t_scn32dr1.cpp
branchRCL_3
changeset 43 c1f20ce4abcf
parent 42 a179b74831c9
child 44 3e88ff8f41d5
--- a/kerneltest/f32test/filesystem/fat/t_scn32dr1.cpp	Thu Aug 19 11:14:22 2010 +0300
+++ b/kerneltest/f32test/filesystem/fat/t_scn32dr1.cpp	Tue Aug 31 16:34:26 2010 +0300
@@ -11,9 +11,11 @@
 // Contributors:
 //
 // Description:
-// f32test\scndrv\t_scn32dr1.cpp
+// f32test\filesystem\fat\t_scn32dr1.cpp
+// Tests that ScanDrive fixes known errors to a Rugged FAT drive
 //
-//
+
+#define __E32TEST_EXTENSION__
 
 #include <f32file.h>
 #include <e32test.h>
@@ -262,10 +264,10 @@
         {
         pos += BootSector.ReservedSectors() * BootSector.BytesPerSector();
         TInt r=TheRawDisk.Open(TheFs,gSessionPath[0]-'A');
-        test(r==KErrNone);
+        test_KErrNone(r);
         TPtr8 buf(&data[0], 4);
         r=TheRawDisk.Read(pos, buf);
-        test(r==KErrNone);
+        test_KErrNone(r);
         TheRawDisk.Close();
         }
 
@@ -290,7 +292,7 @@
     return val;
     }
 
-LOCAL_C void WriteFat(TInt aFatIndex,TInt aValue,const TUint8* aFat)
+LOCAL_C void WriteToFatBuf(TInt aFatIndex,TInt aValue,const TUint8* aFat)
 //
 // Write a value to both fats starting at aFat
 //
@@ -344,7 +346,7 @@
     {
 
     TInt nRes = ReadBootSector(TheFs, CurrentDrive(), KBootSectorNum<<KDefaultSectorLog2, BootSector);
-    test(nRes == KErrNone);
+    test_KErrNone(nRes);
 
     if(!BootSector.IsValid())
         {
@@ -708,12 +710,12 @@
     if (aStart < 2 && gDiskType != EFat32)
         {
         HBufC8* buf=HBufC8::New(BootSector.RootDirEntries() * KSizeOfFatDirEntry);
-        test(buf != NULL);
+        test_NotNull(buf);
         TPtr8 ptr=buf->Des();
         TInt r=TheRawDisk.Open(TheFs,gSessionPath[0]-'A');
-        test(r==KErrNone);
+        test_KErrNone(r);
         r=TheRawDisk.Read(gRootDirStart, ptr);
-        test(r==KErrNone);
+        test_KErrNone(r);
         TheRawDisk.Close();
         DumpRootDir(buf->Ptr());
         delete(buf);
@@ -724,12 +726,12 @@
         if (GetFatEntry(cluster, aFat) != 0)
             {
             HBufC8* buf=HBufC8::New(gBytesPerCluster);
-            test(buf!=NULL);
+            test_NotNull(buf);
             TPtr8 ptr=buf->Des();
             TInt r=TheRawDisk.Open(TheFs,gSessionPath[0]-'A');
-            test(r==KErrNone);
+            test_KErrNone(r);
             r=TheRawDisk.Read(ClusterToByte(cluster), ptr);
-            test(r==KErrNone);
+            test_KErrNone(r);
             TheRawDisk.Close();
             RDebug::Print(_L("Cluster %d @ 0x%08X:"), cluster, ClusterToByte(cluster));
             DumpDirCluster(ptr.Ptr());
@@ -798,12 +800,12 @@
 //
     {
     HBufC8* buf=HBufC8::New(gBytesPerCluster*2);
-    test(buf!=NULL);
+    test_NotNull(buf);
     TPtr8 ptr=buf->Des();
     TInt r=TheRawDisk.Open(TheFs,gSessionPath[0]-'A');
-    test(r==KErrNone);
+    test_KErrNone(r);
     r=TheRawDisk.Read(ClusterToByte(aCluster), ptr);
-    test(r==KErrNone);
+    test_KErrNone(r);
     TheRawDisk.Close();
     RDebug::Print(_L("Cluster %d @ 0x%08X:"), aCluster, ClusterToByte(aCluster));
     TFatDirEntry* d = (TFatDirEntry*)ptr.Ptr() + aEntry;
@@ -841,7 +843,7 @@
     nRes = FormatFatDrive(TheFs, CurrentDrive(), ETrue);
 #endif
 
-    test(nRes == KErrNone);
+    test_KErrNone(nRes);
 
     }
 
@@ -859,7 +861,7 @@
         num[0] = TText(aDepth % 26 + 'A');
         aDir+=num;
         r=TheFs.MkDir(aDir);
-        test(r==KErrNone);
+        test_KErrNone(r);
         }
     }
 
@@ -872,7 +874,7 @@
     while(aDepth--)
         {
         r=TheFs.RmDir(aDir);
-        test(r==KErrNone);
+        test_KErrNone(r);
         aDir.SetLength(aDir.Length()-2);
         }
     }
@@ -889,7 +891,7 @@
     aDir2=aDir1;
     aDir2+=_L("a\\");
     TInt r=TheFs.MkDir(aDir2);
-    test(r==KErrNone);
+    test_KErrNone(r);
     // create dir with depth of 126 directories - one short of max depth
     CreateDeepDir(aDir1,101);
     // create dir with depth of 90
@@ -903,7 +905,7 @@
     {
     DeleteDeepDir(aDir2,64);
     TInt r=TheFs.RmDir(aDir2);
-    test(r==KErrNone);
+    test_KErrNone(r);
     aDir2.SetLength(aDir2.Length()-2);
     DeleteDeepDir(aDir1,102);
     DeleteDeepDir(aDir1,24);
@@ -937,7 +939,7 @@
         aLong[len+1] = TText(count%26 + 'A');
         count++;
         TInt r=temp.Create(TheFs,aLong,EFileShareAny);
-        test(r==KErrNone);
+        test_KErrNone(r);
         temp.Close();
         }
     }
@@ -956,7 +958,7 @@
         aLong[len+1] = TText(count%26 + 'A');
         count++;
         TInt r=TheFs.Delete(aLong);
-        test(r==KErrNone || r==KErrNotFound);
+        test_Value(r, r==KErrNone || r==KErrNotFound);
         }
     }
 
@@ -978,7 +980,7 @@
         name[2]=(TUint16)(count/26%26+'a');
         name[3]=(TUint16)(count%26+'a');
         r=TheFs.Delete(name);
-        test(r==KErrNone || r==KErrNotFound);
+        test_Value(r, r==KErrNone || r==KErrNotFound);
         ++count;
         }
     }
@@ -1002,7 +1004,7 @@
         name[2]=(TUint16)(count/26%26+'a');
         name[3]=(TUint16)(count%26+'a');
         r=f.Create(TheFs, name, EFileWrite);
-        test(r==KErrNone);
+        test_KErrNone(r);
         f.Close();
         ++count;
         }
@@ -1024,7 +1026,7 @@
         dir[1]=(TUint16)(count/26+'a');
         dir[2]=(TUint16)(count%26+'a');
         r=TheFs.MkDir(dir);
-        test(r==KErrNone);
+        test_KErrNone(r);
         entriesSoFar+=2;
         ++count;
         }
@@ -1044,7 +1046,7 @@
         dir[1]=TUint16(count/26+'a');
         dir[2]=TUint16(count%26+'a');
         r=TheFs.RmDir(dir);
-        test(r==KErrNone);
+        test_KErrNone(r);
         entriesSoFar-=2;
         ++count;
         }
@@ -1057,27 +1059,27 @@
     {
     test.Next(_L("Delete Directory Structure"));
     TInt r=TheFs.RmDir(_L("\\scndrv\\dir2\\almostfull\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     TInt entriesNeeded=(gEntriesPerCluster-2) / 2;  //7*2entries + . + .. = full sector
     for (TInt i = 0; i < entriesNeeded; i++)
         {
         TFileName file=_L("\\scndrv\\dir2\\full\\__a");
         file.AppendNum(i);
         r=TheFs.Delete(file);
-        test(r==KErrNone||r==KErrNotFound);
+        test_Value(r, r==KErrNone||r==KErrNotFound);
         }
     r=TheFs.RmDir(_L("\\scndrv\\dir2\\full\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     r=TheFs.RmDir(_L("\\scndrv\\dir2\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     TFileName veryLongName=(_L("\\scndrv\\dir1\\"));
     MakeVeryLongName(veryLongName);
     r=TheFs.Delete(veryLongName);
-    test(r==KErrNone);
+    test_KErrNone(r);
     r=TheFs.RmDir(_L("\\scndrv\\dir1\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     r=TheFs.RmDir(_L("\\scndrv\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     }
 
 LOCAL_C void CreateDirectoryStructure()
@@ -1088,34 +1090,34 @@
     test.Next(_L("Create Directory Structure"));
     // cluster 3 (root dir is cluster 2)
     TInt r=TheFs.MkDir(_L("\\scndrv\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     // cluster 4
     r=TheFs.MkDir(_L("\\scndrv\\dir1\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     TFileName veryLongName=(_L("\\scndrv\\dir1\\"));
     MakeVeryLongName(veryLongName);
     RFile f;
     // cluster 5
     r=f.Create(TheFs,veryLongName,EFileShareAny);
-    test(r==KErrNone);
+    test_KErrNone(r);
     r=f.SetSize(512);
-    test(r==KErrNone);
+    test_KErrNone(r);
     f.Close();
     // cluster 6
     r=TheFs.MkDir(_L("\\scndrv\\dir2\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     // cluster 7
     r=TheFs.MkDir(_L("\\scndrv\\dir2\\full\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     // cluster 8
     r=TheFs.MkDir(_L("\\scndrv\\dir2\\somedirwith3entries\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     // cluster 9
     r=TheFs.MkDir(_L("\\scndrv\\dir2\\somedir2with3entries\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     // cluster 10
     r=TheFs.MkDir(_L("\\scndrv\\dir2\\almostfull\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     // cluster 11-17
     TInt entriesNeeded=(gEntriesPerCluster-2) / 2;  //7*2entries + . + .. = full sector
     for (TInt i = 0; i < entriesNeeded; i++)
@@ -1124,11 +1126,11 @@
         file.AppendNum(i);
         LastInFull = file;
         r=f.Create(TheFs,file,EFileShareAny);
-        test(r==KErrNone);
+        test_KErrNone(r);
         if (i < 7)
             {
             r=f.SetSize(512);
-            test(r==KErrNone);
+            test_KErrNone(r);
             }
         f.Close();
         }
@@ -1144,14 +1146,14 @@
     file1.AppendNum(1);
     file2.AppendNum(2);
     r=f.Create(TheFs,file1,EFileShareAny);
-    test(r==KErrNone);
+    test_KErrNone(r);
     r=f.SetSize(512);
-    test(r==KErrNone);
+    test_KErrNone(r);
     f.Close();
     r=f.Create(TheFs,file2,EFileShareAny);
-    test(r==KErrNone);
+    test_KErrNone(r);
     r=f.SetSize(512);
-    test(r==KErrNone);
+    test_KErrNone(r);
     f.Close();
     }
 
@@ -1177,16 +1179,16 @@
         // contains aOffset
         ExtBufLen = 2 * gBytesPerCluster;
         ExtBufPtr = HBufC8::New(ExtBufLen);
-        test(ExtBufPtr != NULL);
+        test_NotNull(ExtBufPtr);
         // read the clusters in
         ExtBufAdd = aOffset - aOffset % gBytesPerCluster;
         TInt clust = (ExtBufAdd - (gDataStartBytes - gRootDirStart)) /gBytesPerCluster + 2;
         RDebug::Print(_L("Extension buffer for cluster %d allocated"), clust);
         TInt r=TheRawDisk.Open(TheFs,gSessionPath[0]-'A');
-        test(r==KErrNone);
+        test_KErrNone(r);
         TPtr8 des(ExtBufPtr->Des());
         r=TheRawDisk.Read(gRootDirStart + ExtBufAdd, des);
-        test(r==KErrNone);
+        test_KErrNone(r);
         TheRawDisk.Close();
         }
     // convert to offset in the extension buffer
@@ -1221,10 +1223,10 @@
 // reads directory section of disk into buffer
 //
     {
-    test(aCluster != 1);
+    test_Value(aCluster, aCluster != 1);
 
     TInt r=TheRawDisk.Open(TheFs,gSessionPath[0]-'A');
-    test(r==KErrNone);
+    test_KErrNone(r);
 
     if (aCluster == -1) // all clusters ?
         {
@@ -1245,7 +1247,7 @@
         r=TheRawDisk.Read(gRootDirStart + pos, dirPtr);
         }
 
-    test(r==KErrNone);
+    test_KErrNone(r);
     TheRawDisk.Close();
     }
 
@@ -1255,21 +1257,21 @@
 //
     {
     TInt r=TheRawDisk.Open(TheFs,gSessionPath[0]-'A');
-    test(r==KErrNone);
+    test_KErrNone(r);
     r=TheRawDisk.Read(gFatStartBytes, aFatBuf);
-    test(r==KErrNone);
+    test_KErrNone(r);
     TheRawDisk.Close();
     }
 
-LOCAL_C void WriteDirDisk(TDes8& aDirBuf, TInt aCluster = -1)
+LOCAL_C void WriteDirEntryToDisk(TDes8& aDirBuf, TInt aCluster = -1)
 //
-// writes dir buffer to disk
+// writes dir entry buffer to disk
 //
     {
-    test(aCluster != 1);
+	test_Value(aCluster, aCluster != 1);
 
     TInt r=TheRawDisk.Open(TheFs,gSessionPath[0]-'A');
-    test(r==KErrNone);
+    test_KErrNone(r);
 
     if (aCluster == -1)
         {
@@ -1290,29 +1292,29 @@
         r=TheRawDisk.Write(gRootDirStart + pos, dirPtr);
         }
 
-    test(r==KErrNone);
+    test_KErrNone(r);
     if (ExtBufPtr)
         {
         TPtr8 des(ExtBufPtr->Des());
         r=TheRawDisk.Write(gRootDirStart + ExtBufAdd, des);
-        test(r==KErrNone);
+        test_KErrNone(r);
         }
     TheRawDisk.Close();
     }
 
-LOCAL_C void WriteFatDisk(TDes8& aFatBuf, TInt aStart=0)
+LOCAL_C void WriteFatToDisk(TDes8& aFatBuf, TInt aStart=0)
 //
 // writes fat buffer to disk
 //
     {
     TInt r=TheRawDisk.Open(TheFs,gSessionPath[0]-'A');
-    test(r==KErrNone);
+    test_KErrNone(r);
     TInt fatCount=BootSector.NumberOfFats() - aStart;
     TInt pos = gFatStartBytes + aStart * gFatSizeSectors*BootSector.BytesPerSector();
     while(fatCount--)
         {
         r=TheRawDisk.Write(pos, aFatBuf);
-        test(r==KErrNone);
+        test_KErrNone(r);
         pos += gFatSizeSectors*BootSector.BytesPerSector();
         }
     TheRawDisk.Close();
@@ -1369,15 +1371,15 @@
         gFatTestEntries = KMaxFatSize;
     gFatTestSize = PosInBytes(gFatTestEntries);
     FatBufPtr=HBufC8::New(gFatTestSize);
-    test(FatBufPtr!=NULL);
+    test_NotNull(FatBufPtr);
     DirBufPtr=HBufC8::New(DirBufferSize());
-    test(DirBufPtr!=NULL);
+    test_NotNull(DirBufPtr);
 
     // Buffers for reading from disk
     FatDiskPtr=HBufC8::New(gFatTestSize);
-    test(FatDiskPtr!=NULL);
+    test_NotNull(FatDiskPtr);
     DirDiskPtr=HBufC8::New(DirBufferSize());
-    test(DirDiskPtr!=NULL);
+    test_NotNull(DirDiskPtr);
     }
 
 LOCAL_C TBool IsSameAsDrive(const TDes8& aFatBuf,const TDes8& aDirBuf)
@@ -1464,12 +1466,12 @@
     else if (ExtBufPtr)
         {
         HBufC8* extPtr = HBufC8::New(ExtBufLen);
-        test(extPtr != NULL);
+        test_NotNull(extPtr);
         TInt r=TheRawDisk.Open(TheFs,gSessionPath[0]-'A');
-        test(r==KErrNone);
+        test_KErrNone(r);
         TPtr8 des(extPtr->Des());
         r=TheRawDisk.Read(ExtBufAdd+gRootDirStart, des);
-        test(r==KErrNone);
+        test_KErrNone(r);
         TheRawDisk.Close();
         TInt i = FindUnMatch(ExtBufPtr->Ptr(), extPtr->Ptr(), ExtBufLen);
         if (i >= 0)
@@ -1518,7 +1520,7 @@
     if(aAddEOfDir)
         WriteEndOfDir(aTrg.iBytePos+aTrg.iLength*KSizeOfFatDirEntry);
     TPtr8 dirBuf=DirBufPtr->Des();
-    WriteDirDisk(dirBuf);
+    WriteDirEntryToDisk(dirBuf);
     }
 
 LOCAL_C TBool TestPartialEntry(TEntryInfo aEntry)
@@ -1528,7 +1530,7 @@
     {
     test.Next(_L("TestPartialEntry"));
     TInt r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     WriteDelete(aEntry.iBytePos,aEntry.iLength);
 
     TPtr8 fatBuf=FatBufPtr->Des();
@@ -1551,7 +1553,7 @@
     if(aAddEOfDir)
         WriteEndOfDir(aTrg.iBytePos+aTrg.iLength*KSizeOfFatDirEntry);
     TPtr8 dirBuf=DirBufPtr->Des();
-    WriteDirDisk(dirBuf);
+    WriteDirEntryToDisk(dirBuf);
     }
 
 LOCAL_C TBool TestMatchingEntry(TEntryInfo aToDelete)
@@ -1562,7 +1564,7 @@
     test.Next(_L("TestMatchingEntries"));
     WriteDelete(aToDelete.iBytePos,aToDelete.iLength);
     TInt r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
 
     TPtr8 fatBuf=FatBufPtr->Des();
     TPtr8 dirBuf=DirBufPtr->Des();
@@ -1586,8 +1588,8 @@
     CDir* dirs;
     // check no entries in the root directory
     TInt r=TheFs.GetDir(KRoot,KEntryAttMaskSupported,ESortNone,dirs);
-    test(r==KErrNone);
-    test(dirs->Count()==0);
+    test_KErrNone(r);
+    test_Equal(0,dirs->Count());
     delete(dirs);
     dirs=NULL;
 
@@ -1605,13 +1607,13 @@
 
     RFile file;
     r=file.Replace(TheFs,TestFileName,EFileShareExclusive);
-    test(r==KErrNone);
+    test_KErrNone(r);
     file.Close();
 
     // get short name
     TFileName shortName;
     r=TheFs.GetShortName(TestFileName,shortName);
-    test(r==KErrNone);
+    test_KErrNone(r);
     test(shortName==KOrigShortName);
 
     // must be first entry in root, modify to read like
@@ -1620,26 +1622,26 @@
     TInt bytePos=ClusterEntryToBytes(0,1);
     RRawDisk raw;
     r=raw.Open(TheFs,gSessionPath[0]-'A');
-    test(r==KErrNone);
+    test_KErrNone(r);
     TBuf8<1> buf(1);
 
     //-- change 2nd character in the short name (Fat DOS entry)
     buf[0]=(TUint8)'\xC4';
     r=raw.Write(gRootDirStart+bytePos+1,buf);
-    test(r==KErrNone);
+    test_KErrNone(r);
 
     //-- fix the fiddled short name checksum in the corresponding VFat entry
     bytePos=ClusterEntryToBytes(0,0);
     buf[0]=(TUint8)0x2f;
     r=raw.Write(gRootDirStart+bytePos+13,buf);
-    test(r==KErrNone);
+    test_KErrNone(r);
 
     // retrieve short name from media.
     // Note: do not use RFs::GetShortName() as its behaviours are code page dependent.
     bytePos=ClusterEntryToBytes(0,1);
     TBuf8<11> shortNameBuf8;
     r=raw.Read(gRootDirStart+bytePos,shortNameBuf8);
-    test(r==KErrNone);
+    test_KErrNone(r);
     shortNameBuf8 = DosNameFromStdFormat(shortNameBuf8);
     shortName.Copy(shortNameBuf8);
     raw.Close();
@@ -1650,15 +1652,15 @@
     //TheFs.SetDebugRegister(KFSYS);
     r=TheFs.ScanDrive(gSessionPath);
     TheFs.SetDebugRegister(0);
-    test(r==KErrNone);
+    test_KErrNone(r);
     DumpData(NULL, 0, 20);
 
     // retrieve short name from media.
     r=raw.Open(TheFs,gSessionPath[0]-'A');
-    test(r==KErrNone);
+    test_KErrNone(r);
     bytePos=ClusterEntryToBytes(0,1);
     r=raw.Read(gRootDirStart+bytePos,shortNameBuf8);
-    test(r==KErrNone);
+    test_KErrNone(r);
     shortNameBuf8 = DosNameFromStdFormat(shortNameBuf8);
     shortName.Copy(shortNameBuf8);
     raw.Close();
@@ -1667,7 +1669,7 @@
 
     // delete file
     r=TheFs.Delete(TestFileName);
-    test(r==KErrNone);
+    test_KErrNone(r);
     }
 
 LOCAL_C void TestMountAndScan()
@@ -1680,46 +1682,47 @@
 
     test.Next(_L("TestMountAndScan"));
     HBufC8* newFat=HBufC8::New(gFatTestSize);
-    test(newFat!=NULL);
+    test_NotNull(newFat);
     TPtr8 fat=newFat->Des();
     TPtr8 origFat=FatBufPtr->Des();
     TPtr8 origDir=DirBufPtr->Des();
 
     // set cluster of \scndrv\dir1\ to a hanging cluster
     ReadFatDisk(fat);
-    WriteFat(gClusterDir1ext,35,fat.Ptr());
-    WriteFat(35,36,fat.Ptr());
-    WriteFatDisk(fat);
+    WriteToFatBuf(gClusterDir1ext,35,fat.Ptr());
+    WriteToFatBuf(35,36,fat.Ptr());
+    WriteFatToDisk(fat);
     // set the default path to something other than the current drive
     TFileName fsName;
     TInt r=TheFs.FileSystemName(fsName,gSessionPath[0]-'A');
-    test(r==KErrNone);
+    test_KErrNone(r);
     TFileName origDefPath, newDefPath;
     r=TheFs.SessionPath(origDefPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     newDefPath=origDefPath;
     newDefPath[0]=(TText)'z';
     r=TheFs.SetSessionPath(newDefPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     r = TheFs.ExtensionName(extName,gSessionPath[0]-'A',0);
     if (r == KErrNone)
         {
         primaryExtensionExists = ETrue;
         }
     r=TheFs.DismountFileSystem(fsName,gSessionPath[0]-'A');
-    test(r==KErrNone);
+    test_KErrNone(r);
     // mount file system and check scandrive corrects error
     TBool isMount;
     if (primaryExtensionExists)
         r=TheFs.MountFileSystemAndScan(fsName,extName,gSessionPath[0]-'A',isMount);
     else
         r=TheFs.MountFileSystemAndScan(fsName,gSessionPath[0]-'A',isMount);
-    test(isMount && r==KErrNone);
+    test(isMount);
+    test_KErrNone(r);
     TBool res=IsSameAsDrive(origFat,origDir);
     test(res);
 
     r=TheFs.SetSessionPath(origDefPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     delete newFat;
     }
 
@@ -1733,14 +1736,14 @@
     TBool primaryExtensionExists = EFalse;
     TFileName fsName;
     TInt r=TheFs.FileSystemName(fsName,gSessionPath[0]-'A');
-    test(r==KErrNone);
+    test_KErrNone(r);
     r = TheFs.ExtensionName(extName,gSessionPath[0]-'A',0);
     if (r == KErrNone)
         {
         primaryExtensionExists = ETrue;
         }
     r=TheFs.DismountFileSystem(fsName,gSessionPath[0]-'A');
-    test(r==KErrNone);
+    test_KErrNone(r);
 
     // RFs::MountFileSystemAndScan twice consecutively
     // first time
@@ -1749,15 +1752,37 @@
         r=TheFs.MountFileSystemAndScan(fsName,extName,gSessionPath[0]-'A',isMount);
     else
         r=TheFs.MountFileSystemAndScan(fsName,gSessionPath[0]-'A',isMount);
-    test(isMount && r==KErrNone);
+    test(isMount);
+    test_KErrNone(r);
     // and a second time
     if (primaryExtensionExists)
         r=TheFs.MountFileSystemAndScan(fsName,extName,gSessionPath[0]-'A',isMount);
     else
         r=TheFs.MountFileSystemAndScan(fsName,gSessionPath[0]-'A',isMount);
-    test(!isMount && r==KErrAccessDenied);
+    test(!isMount);
+    test_Equal(KErrAccessDenied,r);
     }
 
+
+static void CreateContiguousClusterChain(TUint32 aStartIndex, TUint32 aEndIndex, const TUint8* aFatPtr, TBool aMarkEoc)
+/*
+ * Creates a contiguous cluster chain in the FAT buffer.
+ * 
+ * @param	aStartIndex	The first cluster index of the chain
+ * 			aEndIndex	The last cluster index of the chain 
+ * 			aFatPtr		FAT table buffer pointer
+ * 			aMarkEoc	If ETrue, aEndIndex will be marked as EOC, else it will be a hanging cluster chain
+ */
+	{
+	// Write cluster chain
+    for(TUint i=aStartIndex; i<aEndIndex; ++i)
+        WriteToFatBuf(i, i+1, aFatPtr);
+    // Mark EOC if needed
+    if (aMarkEoc)
+    	WriteToFatBuf(aEndIndex, gEndOfChain, aFatPtr);
+	}
+
+
 LOCAL_C void DoHangingClusters()
 //
 // Tests that scandrive removes hanging clusters
@@ -1765,42 +1790,42 @@
     {
     test.Next(_L("Check Hanging clusters"));
     HBufC8* newFat=HBufC8::New(gFatTestSize);
-    test(newFat!=NULL);
+    test_NotNull(newFat);
     TPtr8 fat=newFat->Des();
     TPtr8 origFat=FatBufPtr->Des();
     TPtr8 origDir=DirBufPtr->Des();
 
-    // set cluster of \scndrv\dir1\ to a hanging cluster
+    // Set cluster of \scndrv\dir1\ to hanging cluster chain
     test.Start(_L("Test hanging cluster in \\scndrv\\dir1\\"));
     ReadFatDisk(fat);
-    WriteFat(gClusterDir1ext,35,fat.Ptr());
-    WriteFat(35,36,fat.Ptr());
-    WriteFatDisk(fat);
+    WriteToFatBuf(gClusterDir1ext,35,fat.Ptr());
+    WriteToFatBuf(35,36,fat.Ptr());
+    WriteFatToDisk(fat); // gClusterDir1ext->35->36
     TInt r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     TBool res=IsSameAsDrive(origFat,origDir);
     test(res);
 
-    // set  cluster chain of first entry of \scndrv\dir1\ to
+    // Set cluster chain of first entry of \scndrv\dir1\ to
     // larger size than file size
     test.Next(_L("Test hanging cluster in first entry"));
     ReadFatDisk(fat);
-    WriteFat(gClusterDir1ext,39,fat.Ptr());
-    WriteFat(39,500,fat.Ptr());
-    WriteFat(500,gEndOfChain,fat.Ptr());
-    WriteFatDisk(fat);
+    WriteToFatBuf(gClusterDir1ext,39,fat.Ptr());
+    WriteToFatBuf(39,500,fat.Ptr());
+    CreateContiguousClusterChain(500, 505, fat.Ptr(), ETrue);
+    WriteFatToDisk(fat); // gClusterDir1ext->39->500->501->502->503->504->505->EOC
     r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     res=IsSameAsDrive(origFat,origDir);
     test(res);
 
-    // set cluster of \scndrv\ to a hanging cluster
+    // Set cluster of \scndrv\ to a hanging cluster
     test.Next(_L("Test hanging cluster of \\scndrv\\"));
     ReadFatDisk(fat);
-    WriteFat(gClusterScnDrv,511,fat.Ptr());
-    WriteFatDisk(fat);
+    WriteToFatBuf(gClusterScnDrv,511,fat.Ptr());
+    WriteFatToDisk(fat); // gClusterScnDrv->511
     r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     res=IsSameAsDrive(origFat,origDir);
     test(res);
 
@@ -1815,7 +1840,7 @@
     {
     test.Next(_L("Check lost clusters"));
     HBufC8* newFat=HBufC8::New(gFatTestSize);
-    test(newFat!=NULL);
+    test_NotNull(newFat);
     TPtr8 fat=newFat->Des();
     TPtr8 origFat=FatBufPtr->Des();
     TPtr8 origDir=DirBufPtr->Des();
@@ -1825,12 +1850,10 @@
     // write cluster chain
     test.Start(_L("Test removal of lost cluster chain"));
     ReadFatDisk(fat);
-    for(TInt i=25;i<35;++i)
-        WriteFat(i,i+1,fat.Ptr());
-    WriteFat(35,gEndOfChain,fat.Ptr());
-    WriteFatDisk(fat);
+    CreateContiguousClusterChain(25, 35, fat.Ptr(), ETrue);
+    WriteFatToDisk(fat); // 25->26->27->28->29->30->31->32->33->34->35->EOC
     TInt r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     TBool res=IsSameAsDrive(origFat,origDir);
     test(res);
 
@@ -1841,17 +1864,17 @@
         TInt off = j*BootSector.BytesPerSector()+j*7%512;
         fat[off]=1;
         }
-    WriteFatDisk(fat);
+    WriteFatToDisk(fat);
     r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     res=IsSameAsDrive(origFat,origDir);
     test(res);
 
     // write semi-random changes to second fat
     test.Next(_L("Test semi-random changes to second fat"));
-    WriteFatDisk(fat, 1);
+    WriteFatToDisk(fat, 1);
     r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     res=IsSameAsDrive(origFat,origDir);
     test(res);
 
@@ -1859,6 +1882,74 @@
     test.End();
     }
 
+
+static void DoHangingAndLostClusters()
+/*
+ * Tests that ScanDrive fixes MULTIPLE hanging clusters and removes lost clusters.
+ * It creates multiple hanging and lost cluster chains in the FAT table and
+ * expects ScanDrive to fix them all.
+ */
+	{
+	test.Start(_L("Check multiple hanging and lost cluster chains"));
+	HBufC8* newFat = HBufC8::New(gFatTestSize);
+	test_NotNull(newFat);
+	TPtr8 fat = newFat->Des();
+	TPtr8 origFat = FatBufPtr->Des();
+	TPtr8 origDir = DirBufPtr->Des();
+	ReadFatDisk(origFat);
+	ReadDirDisk(origDir);
+
+	test.Printf(_L("Create multiple hanging cluster chains\n"));
+	ReadFatDisk(fat);
+	// Set hanging cluster for the file in \scndrv\dir1
+	// gClusterDir1ext+1->25->26->27->28->29->30->31->32->33->34->35
+	WriteToFatBuf(gClusterDir1ext+1, 25, fat.Ptr());
+	CreateContiguousClusterChain(25, 35, fat.Ptr(), EFalse);
+	// Set hanging cluster for the first file in \scndrv\dir2
+	// gClusterDir2_AFull+1->249->250->53->54->55->EOC
+	WriteToFatBuf(gClusterDir2_AFull+1, 249, fat.Ptr());
+	WriteToFatBuf(249, 250, fat.Ptr());
+	WriteToFatBuf(250, 53, fat.Ptr());
+	CreateContiguousClusterChain(53, 55, fat.Ptr(), ETrue);
+	// Set hanging cluster for the fourth file in \scndrv\dir2
+	// gClusterDir2_AFull+4->59->60->61->62->63
+	WriteToFatBuf(gClusterDir2_AFull+4, 59, fat.Ptr());
+	CreateContiguousClusterChain(59, 63, fat.Ptr(), EFalse);
+	// Set hanging cluster for the second file in \scndrv\dir2
+	// gClusterDir2_AFull+2->67->68->69->EOC
+	WriteToFatBuf(gClusterDir2_AFull+2, 67, fat.Ptr());
+	CreateContiguousClusterChain(67, 69, fat.Ptr(), ETrue);
+
+	test.Printf(_L("Create multiple lost clusters\n"));
+	// Create 1st lost cluster chain (clusters 36-45)
+	CreateContiguousClusterChain(36, 45, fat.Ptr(), ETrue);
+	// Create 2nd lost cluster chain (clusters 246-248,56-58)
+	CreateContiguousClusterChain(246, 248, fat.Ptr(), EFalse);
+	WriteToFatBuf(248, 56, fat.Ptr());
+	CreateContiguousClusterChain(56, 58, fat.Ptr(), ETrue);
+	// Create 3rd lost cluster chain (clusters 251-253,564-566, with hanging end)
+	CreateContiguousClusterChain(251, 253, fat.Ptr(), EFalse);
+	WriteToFatBuf(253, 564, fat.Ptr());
+	CreateContiguousClusterChain(564, 566, fat.Ptr(), EFalse);
+	
+	// Flush all FAT changes to the media
+	WriteFatToDisk(fat);
+
+	test.Next(_L("Test ScanDrive fixes multiple hanging and lost cluster chains"));
+	TInt r = TheFs.CheckDisk(gSessionPath);	// CheckDisk should detect an error
+	test_Value(r, r != KErrNone);
+	r = TheFs.ScanDrive(gSessionPath);		// ScanDrive should find the errors and fix them
+	test_KErrNone(r);
+	r = TheFs.CheckDisk(gSessionPath);
+	test_KErrNone(r);
+	TBool res = IsSameAsDrive(origFat, origDir);
+	test(res);
+
+	delete newFat;
+	test.End();
+	}
+
+
 LOCAL_C void DoPartEntries()
 //
 // Tests that scandrive detects/corrects partial entries
@@ -1872,9 +1963,9 @@
     TPtr8 dirBuf=DirBufPtr->Des();
 
     TInt r=TheFs.RmDir(_L("\\scndrv\\dir2\\somedirwith3entries\\"));
-    test(r==KErrNone || r==KErrNotFound || KErrPathNotFound);
+    test_Value(r, r==KErrNone || r==KErrNotFound || r==KErrPathNotFound);
     r=TheFs.RmDir(_L("\\scndrv\\dir2\\somedir2with3entries\\"));
-    test(r==KErrNone || r==KErrNotFound || KErrPathNotFound);
+    test_Value(r, r==KErrNone || r==KErrNotFound || r==KErrPathNotFound);
 
     if (BootSector.RootDirEntries() != 0)
         {
@@ -1883,7 +1974,7 @@
         test.Next(_L("Partial entry at end of rootdir"));
         FillUpRootDir(2);
         r=temp.Create(TheFs,_L("\\temp"),EFileShareAny);
-        test(r==KErrNone);
+        test_KErrNone(r);
         temp.Close();
         ReadDirDisk(dirBuf);
         ReadFatDisk(fatBuf);
@@ -1903,7 +1994,7 @@
     CreatePartialEntry(partial2,3,EFalse);
     // entry has been allocated a cluster which scandrive should delete along with partial entry
     if (last > 0)
-        WriteFat(last,0,fatBuf.Ptr());
+        WriteToFatBuf(last,0,fatBuf.Ptr());
     res=TestPartialEntry(partial2);
     test(res);
 
@@ -1911,26 +2002,26 @@
     test.Next(_L("Test directory reclaim"));
     last = GetStartCluster(gClusterDir2_Full,gEntriesPerCluster-2);
     WriteEndOfDir(ClusterEntryToBytes(gClusterDir2_Full,gEntriesPerCluster-2));
-    WriteDirDisk(dirBuf);
+    WriteDirEntryToDisk(dirBuf);
     TInt entry = GetFatEntry(gClusterDir2_Full, fatBuf.Ptr());
-    WriteFat(gClusterDir2_Full,gEndOfChain,fatBuf.Ptr());
+    WriteToFatBuf(gClusterDir2_Full,gEndOfChain,fatBuf.Ptr());
     while (entry && (entry & gEndOfChain) != gEndOfChain)
         {
         TInt next = GetFatEntry(entry, fatBuf.Ptr());
-        WriteFat(entry,0,fatBuf.Ptr());
+        WriteToFatBuf(entry,0,fatBuf.Ptr());
         entry = next;
         }
     if (last > 0)
-        WriteFat(last,0,fatBuf.Ptr());
+        WriteToFatBuf(last,0,fatBuf.Ptr());
     r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     res=IsSameAsDrive(fatBuf,dirBuf);
     test(res);
 
     // use last entry of first cluster in \scndrv\dir2\full\ 
     test.Next(_L("Partial entry at end of subdir"));
     r=temp.Create(TheFs,_L("\\scndrv\\dir2\\full\\temp"),EFileShareAny);
-    test(r==KErrNone);
+    test_KErrNone(r);
     temp.Close();
     ReadDirDisk(dirBuf);
     ReadFatDisk(fatBuf);
@@ -1943,12 +2034,12 @@
     test.Next(_L("Partial entry preceeding end-of-dir marker"));
     last = GetStartCluster(gClusterDir2_AFull,14);
     if (last > 0)
-        WriteFat(last,0,fatBuf.Ptr());
+        WriteToFatBuf(last,0,fatBuf.Ptr());
     last = GetStartCluster(gClusterDir2_AFull,8);
     if (last > 0)
-        WriteFat(last,0,fatBuf.Ptr());
+        WriteToFatBuf(last,0,fatBuf.Ptr());
     WriteEndOfDir(ClusterEntryToBytes(gClusterDir2_AFull,14));
-    WriteDirDisk(dirBuf);
+    WriteDirEntryToDisk(dirBuf);
     TEntryInfo partial4(ClusterEntryToBytes(gClusterDir2_AFull,8),6);
     CreatePartialEntry(partial4,4,EFalse);
     res=TestPartialEntry(partial4);
@@ -1964,14 +2055,14 @@
 	// create entry in \scndrv\dir2\almostfull\ 
 //	test.Next(_L("Partial entry with invalid dos name"));
 //	r=temp.Create(TheFs,_L("\\scndrv\\dir2\\almostfull\\Dodgy file name"),EFileShareAny);
-//	test(r==KErrNone);
+//	test_KErrNone(r);
 //	temp.Close();
 //	ReadDirDisk(dirBuf);
 //	TInt dosStart=ClusterEntryToBytes(gClusterDir2_AFull,4);
 //	dirBuf[dosStart+4]=0x1;
 //	WriteDirDisk(dirBuf);
 //	r=TheFs.ScanDrive(gSessionPath);
-//	test(r==KErrNone);
+//	test_KErrNone(r);
 //	WriteDelete(dosStart-2*32,3);
 //	res=IsSameAsDrive(fatBuf,dirBuf);
 //	test(res);
@@ -1983,26 +2074,26 @@
         last = GetStartCluster(gClusterDir2_Full,gEntriesPerCluster-1);
         WriteEndOfDir(ClusterEntryToBytes(gClusterDir2_Full,gEntriesPerCluster-2));
         WriteEndOfDir(ClusterEntryToBytes(gClusterDir2_Full,gEntriesPerCluster-1));
-        WriteDirDisk(dirBuf);
+        WriteDirEntryToDisk(dirBuf);
         TFileName longFile=_L("\\scndrv\\dir2\\full\\");
         MakeVeryLongName(longFile);
         r=temp.Create(TheFs,longFile,EFileShareAny);
-        test(r==KErrNone);
+        test_KErrNone(r);
         temp.Close();
         ReadDirDisk(dirBuf);
-        WriteFat(gClusterDir2_Full,gClusterDir2_SD3E,fatBuf.Ptr());
-        WriteFat(gClusterDir2_SD3E,gClusterDir2_SD23E,fatBuf.Ptr());
-        WriteFat(gClusterDir2_SD23E,gEndOfChain,fatBuf.Ptr());
+        WriteToFatBuf(gClusterDir2_Full,gClusterDir2_SD3E,fatBuf.Ptr());
+        WriteToFatBuf(gClusterDir2_SD3E,gClusterDir2_SD23E,fatBuf.Ptr());
+        WriteToFatBuf(gClusterDir2_SD23E,gEndOfChain,fatBuf.Ptr());
         if (last > 0)
-            WriteFat(last,0,fatBuf.Ptr());
+            WriteToFatBuf(last,0,fatBuf.Ptr());
         TEntryInfo partial5(ClusterEntryToBytes(gClusterDir2_Full,gEntriesPerCluster-2),19);
         CreatePartialEntry(partial5,7,EFalse);
         res=TestPartialEntry(partial5);
         test(res);
         r=TheFs.Delete(longFile);
-        test(r==KErrNone || r==KErrNotFound);
+        test_Value(r, r==KErrNone || r==KErrNotFound);
         r=TheFs.Delete(_L("\\temp"));
-        test(r==KErrNone || r==KErrNotFound);
+        test_Value(r, r==KErrNone || r==KErrNotFound);
         }
     ReadDirDisk(dirBuf);
 
@@ -2052,16 +2143,16 @@
     test.Next(_L("matching entries in same subdir"));
     // delete entries to allow contiguous clusters in \scndrv\dir2\full directory
     TInt r=TheFs.RmDir(_L("\\scndrv\\dir2\\somedirwith3entries\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     r=TheFs.RmDir(_L("\\scndrv\\dir2\\somedir2with3entries\\"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     // ensure directory is expanded
     RFile temp;
     r=temp.Create(TheFs,_L("\\scndrv\\dir2\\full\\temp"),EFileShareAny);
-    test(r==KErrNone);
+    test_KErrNone(r);
     temp.Close();
     r=TheFs.Delete(_L("\\scndrv\\dir2\\full\\temp"));
-    test(r==KErrNone);
+    test_KErrNone(r);
     ReadDirDisk(dirBuf);
     ReadFatDisk(fatBuf);
     TEntryInfo from4(ClusterEntryToBytes(gClusterDir2_Full,4),2);
@@ -2074,14 +2165,14 @@
     test.Next(_L("matching entries in diff dirs + new cluster"));
     // delete last entry in directory
     r=TheFs.Delete(LastInFull);
-    test(r==KErrNone);
+    test_KErrNone(r);
     TFileName veryLongName=_L("\\scndrv\\dir2\\full\\");
     MakeVeryLongName(veryLongName);
     r=temp.Create(TheFs,veryLongName,EFileShareAny);
-    test(r==KErrNone);
+    test_KErrNone(r);
     temp.Close();
     r=TheFs.Delete(veryLongName);
-    test(r==KErrNone);
+    test_KErrNone(r);
     ReadDirDisk(dirBuf);
     ReadFatDisk(fatBuf);
     TEntryInfo from5(ClusterEntryToBytes(gClusterDir1,2),19);
@@ -2111,7 +2202,7 @@
     ReadFatDisk(fatBuf);
     // run scandisk and compare
     TInt r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     TBool res=IsSameAsDrive(fatBuf,dirBuf);
     test(res);
     // Create a entry with matching start cluster and check fixed up
@@ -2138,7 +2229,7 @@
     ReadFatDisk(fatBuf);
 
     TInt r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
 
     TBool res=IsSameAsDrive(fatBuf,dirBuf);
     test(res);
@@ -2231,9 +2322,9 @@
             name.AppendNumFixedWidth(i+totalFilesCreated, EHex, 3);
             RFile f;
             r = f.Create(TheFs, name, EFileShareAny);
-            test(r == KErrNone);
+            test_KErrNone(r);
             r = f.Write(buf);
-            test(r == KErrNone);
+            test_KErrNone(r);
             f.Close();
             }
 
@@ -2266,7 +2357,7 @@
 
             }
 
-        WriteDirDisk(dirBuf, cluster);
+        WriteDirEntryToDisk(dirBuf, cluster);
         totalFilesCreated += filesThisTime;
         test.Printf(_L("   created %d entries\n"), totalFilesCreated);
         }
@@ -2278,7 +2369,7 @@
 
     test.Printf(_L("Running ScanDrive\n"), filesThisTime);
     r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
 
     TBool res=IsSameAsDrive(fatBuf,dirBuf);
     test(res);
@@ -2290,17 +2381,17 @@
         name.Append(_L("tempfile."));
         name.AppendNumFixedWidth(i, EHex, 3);
         r = TheFs.Delete(name);
-        test(r == KErrNone);
+        test_KErrNone(r);
         }
 
     ReadDirDisk(dirBuf);
     ReadFatDisk(fatBuf);
     WriteEndOfDir(ClusterEntryToBytes(cluster, startEntry));
-    WriteDirDisk(dirBuf);
+    WriteDirEntryToDisk(dirBuf);
 
     test.Printf(_L("Running ScanDrive\n"), filesThisTime);
     r=TheFs.ScanDrive(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
     res=IsSameAsDrive(fatBuf,dirBuf);
     test(res);
     }
@@ -2341,6 +2432,7 @@
     DoPartEntries();
     DoLostClusters();
     DoHangingClusters();
+    DoHangingAndLostClusters();
     TestMountAndScan();
     TestConsecutiveMountAndScans();
     DeleteDirectoryStructure();
@@ -2362,7 +2454,7 @@
     {
     TInt r;
     r = TheFs.CharToDrive(gSessionPath[0], gDriveNumber);
-    test( KErrNone == r );
+    test_KErrNone(r);
 
 
     //-- set up console output
@@ -2380,7 +2472,7 @@
     // check this is not the internal ram drive
     TVolumeInfo v;
     r=TheFs.Volume(v);
-    test(r==KErrNone);
+    test_KErrNone(r);
     if(v.iDrive.iMediaAtt&KMediaAttVariableSize)
         {
         test.Printf(_L("Error: Internal ram drive not tested\n"));
@@ -2388,7 +2480,7 @@
         }
 
     r=TheFs.SetSessionPath(gSessionPath);
-    test(r==KErrNone);
+    test_KErrNone(r);
 
     DoTests();