kerneltest/f32test/server/t_ext1.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
child 43 c1f20ce4abcf
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// 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 <f32file.h>
#include <e32test.h>
#include <e32svr.h>
#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<TBool> 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<TBool> 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();
	}