kerneltest/f32test/filesystem/fat/t_nonrugged.cpp
author Mike Kinghan <mikek@symbian.org>
Tue, 16 Nov 2010 14:39:21 +0000
branchGCC_SURGE
changeset 303 9b85206a602c
parent 109 b3a1d9898418
permissions -rw-r--r--
We need a way to pass flags to rombuilds in Raptor via extension flm interfaces, so that the CPP pass of the rom input files can be informed what toolchain we are building with and conditionally include or exclude files depending on whether the toolchain could build them.

// Copyright (c) 2009-2010 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\filesystem\fat\t_nonrugged.cpp
// Functional tests for the non-Rugged file mode (also called the File Sequential mode)
// Only perform tests on the Rugged FAT file system
//

#define __E32TEST_EXTENSION__

#include <f32file.h>
#include <e32test.h>

#include "t_server.h"
#include "fat_utils.h"
using namespace Fat_Test_Utils;


RTest test(_L("T_NONRUGGED"));

TInt gDriveNum;

_LIT(KTestPath, ":\\F32-TST\\T_NONRUGGED\\");	// 22


enum TNonRuggedFileMode
	{
	ENormalFileMode,	// File is in normal (Rugged) mode
	ENonRuggedFileMode	// File is in non-Rugged file mode (EFileSequential)
	};

enum TNonRuggedControlIO
/*
 * ControlIo enum values
 */
    {
    EControlIOIsRuggedFSys		= 4,			// Defined as EIsRuggedFSys in \fileserver\sfat32\common_constants.h
    EControlIOIsFileSequential	= KMaxTInt-23	// Defined as KControlIoIsFileSequential in \fileserver\inc\f32dbg.h
    };


void CreateFile(RFile& aFile, const TDesC& aPath, TUint aFileMode)
/*
 * Creates/opens a file in Rugged/non-Rugged mode after emptying the trace buffer
 */
	{
	TInt r = TheFs.MkDirAll(aPath);
	test_Value(r, r == KErrNone || r == KErrAlreadyExists);
	r = aFile.Replace(TheFs, aPath, aFileMode);
	test_KErrNone(r);
	}


void DeleteFileAndDir(const TDesC& aPath)
/*
 * Deletes a single file and the directory containing it
 */
	{
	TInt r = TheFs.Delete(aPath);
	test_KErrNone(r);
	r = TheFs.RmDir(aPath);
	test_KErrNone(r);
	}


void SingleClientTest()
/*
 * Unit test for Non-Rugged File mode with a single client
	 ***********************************************************************************
	 * 1. Create a file in non-Rugged file mode and then close the file.
	 * 2. Open the file in normal Rugged file mode and then close it.
	 * 3. Open the file in non-Rugged file mode again and then close it.
	 * Expected Results:
	 * 1. File is in non-Rugged file mode.
	 * 2. File is in normal Rugged file mode.
	 * 3. File is in non-Rugged file mode.
	 ***********************************************************************************
 */
	{
	test.Next(_L("Test single client"));

	TBuf<34> singleFile;
	singleFile.Append(gDriveToTest);		//  1
	singleFile.Append(KTestPath);			// 22
	singleFile.Append(_L("file.single"));	// 11
	TInt r = TheFs.Delete(singleFile);
	test_Value(r, r == KErrNone || r == KErrNotFound || r == KErrPathNotFound);
	TBuf8<KMaxPath> singleFilePkg;
	singleFilePkg.Copy(singleFile.Mid(2));
	TUint8 fileMode = 0;
	TPtr8 fileModePkg(&fileMode, 1, 1);

	test.Printf(_L("Create file in non-Rugged file mode\n"));
	RFile file;
	CreateFile(file, singleFile, (EFileWrite | EFileSequential));
	r = TheFs.ControlIo(gDriveNum, EControlIOIsFileSequential, singleFilePkg, fileModePkg);
	test_KErrNone(r);
	test_Equal(ENonRuggedFileMode, fileMode);
	file.Close();

	test.Printf(_L("Open file in normal mode\n"));
	CreateFile(file, singleFile, EFileWrite);
	r = TheFs.ControlIo(gDriveNum, EControlIOIsFileSequential, singleFilePkg, fileModePkg);
	test_KErrNone(r);
	test_Equal(ENormalFileMode, fileMode);
	file.Close();

	test.Printf(_L("Open file in non-Rugged file mode again\n"));
	CreateFile(file, singleFile, (EFileWrite | EFileSequential));
	r = TheFs.ControlIo(gDriveNum, EControlIOIsFileSequential, singleFilePkg, fileModePkg);
	test_KErrNone(r);
	test_Equal(ENonRuggedFileMode, fileMode);
	file.Close();

	DeleteFileAndDir(singleFile);
	}


void MultipleClientsTest()
/*
 * Unit tests for Non-Rugged File mode with multiple clients accessing the same file
 */
	{
	/***********************************************************************************
	 * Use Case 1:
	 * 1. Client1 opens a file in non-Rugged file mode.
	 * 2. Client2 then opens the same file in normal Rugged file mode.
	 * Expected Results:
	 * 1. File is in non-Rugged file mode.
	 * 2. File changed to normal Rugged file mode.
	 ***********************************************************************************
	 */
	test.Next(_L("Test multiple clients - Use case 1"));

	TBuf<33> fileName1;
	fileName1.Append(gDriveToTest);		//  1
	fileName1.Append(KTestPath);		// 22
	fileName1.Append(_L("file1.mult"));	// 10
	TInt r = TheFs.Delete(fileName1);
	test_Value(r, r == KErrNone || r == KErrNotFound || r == KErrPathNotFound);
	TBuf8<31> fileName1Pkg;
	fileName1Pkg.Copy(fileName1.Mid(2));
	TUint8 fileMode = 0;
	TPtr8 fileModePkg(&fileMode, 1, 1);


	// Use Case 1.1, Client 1 (Non-Rugged Client) ------------------------------------
	test.Printf(_L("Client1 create file in non-Rugged file mode\n"));

	RFile file1;
	CreateFile(file1, fileName1, (EFileWrite | EFileSequential | EFileShareAny));
	r = TheFs.ControlIo(gDriveNum, EControlIOIsFileSequential, fileName1Pkg, fileModePkg);
	test_KErrNone(r);
	test_Equal(ENonRuggedFileMode, fileMode);


	// Use Case 1.2, Client 2 (Rugged Client) ----------------------------------------
	test.Printf(_L("Client2 open file in 'normal' Rugged file mode\n"));

	RFile file2;
	CreateFile(file2, fileName1, (EFileWrite | EFileShareAny));
	r = TheFs.ControlIo(gDriveNum, EControlIOIsFileSequential, fileName1Pkg, fileModePkg);
	test_KErrNone(r);
	test_Equal(ENormalFileMode, fileMode);


	file1.Close();
	file2.Close();
	r = TheFs.Delete(fileName1);
	test_KErrNone(r);


	/***********************************************************************************
	 * Use Case 2:
	 * 1. Client1 opens a file in normal Rugged file mode.
	 * 2. Client2 then opens the same file in non-Rugged file mode.
	 * Expected Results:
	 * 1. File is in normal Rugged file mode.
	 * 2. File does not change to non-Rugged file mode.
	 ***********************************************************************************
	 */
	test.Next(_L("Test multiple clients - Use case 2"));

	TBuf<34> fileName2;
	fileName2.Append(gDriveToTest);		//  1
	fileName2.Append(KTestPath);		// 22
	fileName2.Append(_L("file2.mult"));	// 10
	r = TheFs.Delete(fileName2);
	test_Value(r, r == KErrNone || r == KErrNotFound || r == KErrPathNotFound);
	TBuf8<KMaxPath> fileName2Pkg;
	fileName2Pkg.Copy(fileName2.Mid(2));


	// Use Case 2.1, Client 1 (Rugged Client) ----------------------------------------
	test.Printf(_L("Client1 create file in 'normal' Rugged file mode\n"));

	CreateFile(file1, fileName2, (EFileWrite | EFileShareAny));
	r = TheFs.ControlIo(gDriveNum, EControlIOIsFileSequential, fileName2Pkg, fileModePkg);
	test_KErrNone(r);
	test_Equal(ENormalFileMode, fileMode);


	// Use Case 2.2, Client 2 (Non-Rugged Client) ------------------------------------
	test.Printf(_L("Client2 open file in non-Rugged file mode\n"));

	CreateFile(file2, fileName2, (EFileWrite | EFileSequential | EFileShareAny));
	r = TheFs.ControlIo(gDriveNum, EControlIOIsFileSequential, fileName2Pkg, fileModePkg);
	test_KErrNone(r);
	test_Equal(ENormalFileMode, fileMode);


	file1.Close();
	file2.Close();
	DeleteFileAndDir(fileName2);
	}



void CallTestsL()
/*
 * Start point of T_NONRUGGED
 */
	{
#ifndef _DEBUG
    test.Printf(_L("T_NONRUGGED skipped. To run only on debug builds.\n"));
    return;
#else
    
	TInt r = TheFs.CharToDrive(gDriveToTest, gDriveNum);
	test_KErrNone(r);
	
	// Currently only FAT file system supports Rugged drive
    if (!Is_Fat(TheFs, gDriveNum))
		{
		test.Printf(_L("T_NONRUGGED skipped. Requires FAT filesystem to run.\n"));
		return;
		}

// Use this to set filesystem to Rugged if it is not set as such
#if(0)
	{
	// Ensure that the FAT filesystem is Rugged
	TUint8 ruggedVal = 0;
	TPtr8 ruggedPkg(&ruggedVal, 1, 1);
	r = TheFs.ControlIo(gDriveNum, EControlIOIsRuggedFSys, ruggedPkg);
	test_KErrNone(r);
	if (!ruggedVal)
		{
		r = TheFs.ControlIo(gDriveNumber, KControlIoRuggedOn);
		test_KErrNone(r);
		}
	}
#endif
	
    // Test to run only on a rugged FAT drive
    TUint8 ruggedVal = 0;
    TPtr8 ruggedPkg(&ruggedVal, 1, 1);
    r = TheFs.ControlIo(gDriveNum, EControlIOIsRuggedFSys, ruggedPkg);
    test_KErrNone(r);
    if (!ruggedVal)
    	{
		test.Printf(_L("T_NONRUGGED skipped. Requires Rugged FAT to run.\n"));
		return;
    	}

	test.Start(_L("T_NONRUGGED Test Start"));
	
	// Run tests
	SingleClientTest();
	MultipleClientsTest();
	
// Use this to unset filesystem to non-Rugged if it has been set above
#if(0)
	// Set filesystem back to non-Rugged
	if (!ruggedVal)
		{
		r = TheFs.ControlIo(gDriveNumber, KControlIoRuggedOff);
		test_KErrNone(r);
		}
#endif
	
	test.End();
	test.Close();
#endif
	}