diff -r 000000000000 -r a41df078684a kerneltest/f32test/server/t_ext1.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/server/t_ext1.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,478 @@ +// Copyright (c) 2002-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: +// f32test\ext\t_ext1.cpp +// +// + +#include +#include +#include +#include "t_server.h" +#include "f32_test_utils.h" + +using namespace F32_Test_Utils; + + +GLDEF_D RTest test(_L("T_EXT1")); + +_LIT(KExtensionLog,"T_LOGEXT"); +_LIT(KExtensionLogName,"Logger"); +_LIT(KExtensionEmpty,"T_EMPTYEXT"); +_LIT(KExtensionEmptyName,"Empty"); +_LIT(KExtensionBit,"T_BITEXT"); +_LIT(KExtensionBitName,"Bitchange"); +_LIT(KExtensionRubbish,"T_RUBBISH"); +_LIT(dir1,"\\dir1\\"); +_LIT(file1Name,"\\dir1\\file1.doc"); +_LIT8(toWrite,"abcdefghijklmnop"); + +void TestSecondaryExtensions() +// +// a secondary extension is one that is added to a drive with an existing file system +// therefore a mount is successful with or without the extension +// + { + test.Next(_L("TestSecondaryExtensions()")); + TInt drive; + TInt err=RFs::CharToDrive(gDriveToTest,drive); + test(err==KErrNone); + + TPckgBuf drvSyncBuf; + err = TheFs.QueryVolumeInfoExt(drive, EIsDriveSync, drvSyncBuf); + test(err==KErrNone); + const TBool bDrvSync = drvSyncBuf(); + + + TFullName fsName; + TInt r=TheFs.FileSystemName(fsName,drive); + test(r==KErrNone); + test.Printf(_L("fsName=%S\n"),&fsName); + +#if defined(__WINS__) + if(drive==EDriveC) + { + // check that the extension cannot be mounted since not supported by the file system + r=TheFs.AddExtension(KExtensionLog); + test(r==KErrNone); + r=TheFs.MountExtension(KExtensionLogName,drive); + test(r==KErrNotSupported); + r=TheFs.RemoveExtension(KExtensionLogName); + test(r==KErrNone); + return; + } +#endif + + test.Next(_L("RFs::AddExtension()")); + r=TheFs.AddExtension(KExtensionLog); + RDebug::Print(_L("addext=%d"),r); + test(r==KErrNone); + r=TheFs.AddExtension(KExtensionLog); + test(r==KErrAlreadyExists); + r=TheFs.AddExtension(KExtensionRubbish); + test(r==KErrNotFound); + r=TheFs.AddExtension(KExtensionEmpty); + test(r==KErrNone); + + test.Next(_L("RFs::MountExtension()")); +#if !defined(__WINS__) + // check that the extension cannot be mounted on file system that does not support extensions + r=TheFs.MountExtension(KExtensionLogName,EDriveZ); + test(r==KErrNotSupported); +#endif + // test mounting on drive with no file system + r=TheFs.DismountFileSystem(fsName,drive); + test(r==KErrNone); + r=TheFs.MountExtension(KExtensionLogName,drive); + test(r==KErrNotReady); + r=TheFs.MountFileSystem(fsName,drive,bDrvSync); + test(r==KErrNone); + // test with a resource open + _LIT(KFileName,"testing.doc"); + RFile file; + r=file.Replace(TheFs,KFileName,EFileShareExclusive); + test(r==KErrNone); + r=TheFs.MountExtension(KExtensionLogName,drive); + test(r==KErrInUse); + file.Close(); + r=TheFs.Delete(KFileName); + test(r==KErrNone); + // test with a format open + TBuf<4> driveBuf=_L("?:\\"); + driveBuf[0]=(TText)(drive+'A'); + RFormat format; + TInt count; + r=format.Open(TheFs,driveBuf,EHighDensity,count); + test(r==KErrNone); + r=TheFs.MountExtension(KExtensionLogName,drive); + test(r==KErrInUse); + format.Close(); + // get the extension name + TFullName extName; + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNotFound); + // now load the extension + r=TheFs.MountExtension(KExtensionLogName,drive); + test(r==KErrNone); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNone && extName==KExtensionLogName); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNotFound); + // try remounting the same extension + r=TheFs.MountExtension(KExtensionLogName,drive); + test(r==KErrAlreadyExists); + // mount a second extension + r=TheFs.MountExtension(KExtensionEmptyName,drive); + test(r==KErrNone); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNone && extName==KExtensionLogName); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNone && extName==KExtensionEmptyName); + + // force a remount on a removable media and check that extensions both exist + test.Printf(_L("Test forcing remount\n")); + TDriveInfo info; + r=TheFs.Drive(info,drive); + if(info.iDriveAtt&KDriveAttRemovable) + { + const TInt KMediaRemountForceMediaChange = 0x00000001; + + + TRequestStatus changeStatus; + TheFs.NotifyChange(ENotifyAll, changeStatus); + + test.Printf(_L("Remounting the drive\n"), r); + r = TheFs.RemountDrive(drive, NULL, (TUint) KMediaRemountForceMediaChange); + test(r == KErrNotReady || r == KErrNone); + + do + { + test.Printf(_L("Waiting for media change...\n")); + User::WaitForRequest(changeStatus); + + r=TheFs.Drive(info,drive); + test.Printf(_L("Drive() returned %d\n"), r); + + TheFs.NotifyChange(ENotifyAll, changeStatus); + } + while (r == KErrNotReady); + TheFs.NotifyChangeCancel(changeStatus); + + User::After(1000000); //-- don't know why we need this, otherwise for WINS mediadriver returns -18 + + + +/* + //-- strange, but this variant caused Media Driver to always return -18 + //-- and the media have become inaccessible forever (on H2). + //-- funny enough, but turning ON heavy logging from the drivers (PBUS & KLOCDRV) helped the problem + + test.Printf(_L("Force media change\n")); + RLocalDrive d; + TBool flag=EFalse; + r=d.Connect(1,flag); + test(r==KErrNone); + d.ForceMediaChange(); + d.Close(); +//#if defined(__WINS__) + // ??? seems to work, find out why + //User::After(500000); + User::After(2000000); +//#endif +*/ + } + + + + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNone && extName==KExtensionLogName); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNone && extName==KExtensionEmptyName); + + test.Printf(_L("Accessing media...\n")); + // and now do some file system operations + TBuf8<16> readBuf; + r=TheFs.MkDir(dir1); + + test.Printf(_L("res=%d\n"), r); + + + test(r==KErrNone||r==KErrAlreadyExists); + RFile file1; + r=file1.Replace(TheFs,file1Name,EFileShareExclusive); + test(r==KErrNone); + r=file1.Write(toWrite); + test(r==KErrNone); + r=file1.Read(0,readBuf); + test(readBuf==toWrite); + r=file1.SetSize(0); + test(r==KErrNone); + file1.Close(); + r=TheFs.Delete(file1Name); + test(r==KErrNone); + r=TheFs.RmDir(dir1); + test(r==KErrNone); + + test.Next(_L("RFs::DismountExtension()")); + // test with a resource open + r=file.Replace(TheFs,KFileName,EFileShareExclusive); + test(r==KErrNone); + r=TheFs.DismountExtension(KExtensionLogName,drive); + test(r==KErrInUse); + file.Close(); + r=TheFs.Delete(KFileName); + test(r==KErrNone); + // test with a format open + r=format.Open(TheFs,driveBuf,EHighDensity,count); + test(r==KErrNone); + r=TheFs.DismountExtension(KExtensionLogName,drive); + test(r==KErrInUse); + format.Close(); + // now dismount an extension + r=TheFs.DismountExtension(KExtensionLogName,drive); + test(r==KErrNone); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNone && extName==KExtensionEmptyName); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNotFound); + // try to dismount an extension that is not mounted + r=TheFs.DismountExtension(KExtensionLogName,drive); + test(r==KErrNotFound); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNone && extName==KExtensionEmptyName); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNotFound); + // dismount the remaining extension + r=TheFs.DismountExtension(KExtensionEmptyName,drive); + test(r==KErrNone); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNotFound); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNotFound); + + test.Next(_L("RFs::RemoveExtension()")); + r=TheFs.RemoveExtension(KExtensionLogName); + test(r==KErrNone); + r=TheFs.RemoveExtension(KExtensionEmptyName); + test(r==KErrNone); + } + +void TestPrimaryExtensions() +// +// a primary extension is one that is added to a drive before a file system is mounted +// must be present for the mount to be successful (eg. FTL) +// + { + test.Next(_L("TestPrimaryExtensions()")); + TInt drive; + TInt err=RFs::CharToDrive(gDriveToTest,drive); + test(err==KErrNone); + +#if defined(__WINS__) + if(drive==EDriveC) + return; +#endif + + TPckgBuf drvSyncBuf; + err = TheFs.QueryVolumeInfoExt(drive, EIsDriveSync, drvSyncBuf); + test(err==KErrNone); + const TBool bDrvSync = drvSyncBuf(); + + // don't test on ram drive since accesses memory directly + TDriveInfo info; + TInt r=TheFs.Drive(info,drive); + if(info.iMediaAtt&KMediaAttVariableSize) + return; + + TFullName fsName; + r=TheFs.FileSystemName(fsName,drive); + test(r==KErrNone); + test.Printf(_L("fsName=%S\n"),&fsName); + + test.Next(_L("RFs::AddExtension()")); + r=TheFs.AddExtension(KExtensionLog); + test(r==KErrNone); + r=TheFs.AddExtension(KExtensionEmpty); + test(r==KErrNone); + r=TheFs.AddExtension(KExtensionBit); + test(r==KErrNone); + + test.Next(_L("RFs::MountFileSystem()")); + // test with file system that already exists + r=TheFs.MountFileSystem(fsName,KExtensionBitName,drive,bDrvSync); + test(r==KErrAccessDenied); + // unmount drive and mount primary extension along with file system + r=TheFs.DismountFileSystem(fsName,drive); + test(r==KErrNone); + + //-- !! N.B this extension mangles data read/written ftom/to the media, for some file systems it is OK and mounting succeeds + //-- for others - this will result in KErrCorrupt + r=TheFs.MountFileSystem(fsName,KExtensionBitName,drive,bDrvSync); + test(r==KErrNone||r==KErrCorrupt); + + // and now format + Format(drive); + TFullName extName; + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNone && extName==KExtensionBitName); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNotFound); + + // and now do some file system operations + TBuf8<16> readBuf; + r=TheFs.MkDir(dir1); + test(r==KErrNone||r==KErrAlreadyExists); + RFile file1; + r=file1.Replace(TheFs,file1Name,EFileShareExclusive); + test(r==KErrNone); + r=file1.Write(toWrite); + test(r==KErrNone); + r=file1.Read(0,readBuf); + test(readBuf==toWrite); + r=file1.SetSize(0); + test(r==KErrNone); + file1.Close(); + r=TheFs.Delete(file1Name); + test(r==KErrNone); + r=TheFs.RmDir(dir1); + test(r==KErrNone); + + // add a secondary extension + test.Printf(_L("RFs::MountExtension()")); + r=TheFs.MountExtension(KExtensionLogName,drive); + test(r==KErrNone); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNone && extName==KExtensionBitName); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNone && extName==KExtensionLogName); + // try to add the same extension + r=TheFs.MountExtension(KExtensionBitName,drive); + test(r==KErrAlreadyExists); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNone && extName==KExtensionBitName); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNone && extName==KExtensionLogName); + // try to add a third extension + r=TheFs.MountExtension(KExtensionEmptyName,drive); + test(r==KErrAccessDenied); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNone && extName==KExtensionBitName); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNone && extName==KExtensionLogName); + + // and now do some file system operations + r=TheFs.MkDir(dir1); + test(r==KErrNone||r==KErrAlreadyExists); + r=file1.Replace(TheFs,file1Name,EFileShareExclusive); + test(r==KErrNone); + r=file1.Write(toWrite); + test(r==KErrNone); + r=file1.Read(0,readBuf); + test(readBuf==toWrite); + r=file1.SetSize(0); + test(r==KErrNone); + file1.Close(); + r=TheFs.Delete(file1Name); + test(r==KErrNone); + r=TheFs.RmDir(dir1); + test(r==KErrNone); + + test.Printf(_L("RFs::DismountExtension()")); + // test that can't dismount a primary extension via this method + r=TheFs.DismountExtension(KExtensionLogName,drive); + test(r==KErrNone); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNone && extName==KExtensionBitName); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNotFound); + r=TheFs.DismountExtension(KExtensionBitName,drive); + test(r==KErrAccessDenied); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNone && extName==KExtensionBitName); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNotFound); + + test.Printf(_L("RFs::DismountFileSystem()")); + r=TheFs.MountExtension(KExtensionLogName,drive); + test(r==KErrNone); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNone && extName==KExtensionBitName); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNone && extName==KExtensionLogName); + // and now dismount + r=TheFs.DismountFileSystem(fsName,drive); + test(r==KErrNone); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNotReady); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNotReady); + // remount the file system + r=TheFs.MountFileSystem(fsName,drive,bDrvSync); + test(r==KErrNone||r==KErrCorrupt); + r=TheFs.ExtensionName(extName,drive,0); + test(r==KErrNotFound); + r=TheFs.ExtensionName(extName,drive,1); + test(r==KErrNotFound); + Format(drive); + + test.Next(_L("RFs::RemoveExtension()")); + r=TheFs.RemoveExtension(KExtensionLogName); + test(r==KErrNone); + r=TheFs.RemoveExtension(KExtensionEmptyName); + test(r==KErrNone); + r=TheFs.RemoveExtension(KExtensionBitName); + test(r==KErrNone); + } + + +GLDEF_C void CallTestsL() +// +// Do tests relative to the session path +// + { + //-- set up console output + F32_Test_Utils::SetConsole(test.Console()); + + TInt drive; + TInt err=RFs::CharToDrive(gDriveToTest,drive); + test.Start(_L("Starting Test - T_EXT1")); + test(err==KErrNone); + + PrintDrvInfo(TheFs, drive); + +//Do not run this test on the NAND drive, as +//this has the FTL mounted as a primary extension +//which causes the test to fail +#if defined(__WINS__) + if (drive==EDriveU) + return; +#else + TDriveInfo driveInfo; + TheFs.Drive(driveInfo,drive); + if (driveInfo.iType == EMediaNANDFlash) + { + return; + } +#endif + TestSecondaryExtensions(); + + //-- the t_bitext extension mangles data from the media, which may make FS mounting fail because of "corrupted" data. + //-- Then this step formats the media, automounter doesn't support it straightforward way + if(!Is_Lffs(TheFs, drive) && !Is_Automounter(TheFs, drive)) + { + TestPrimaryExtensions(); + } + + test.End(); + test.Close(); + }