kerneltest/f32test/cfileman/t_cfileman.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
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) 2008-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\cfileman\t_cfileman.cpp
// 
//

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

#include "t_cfileman_cases.h"

static RArray<TUint> gFailedTestCases;

RTest test(_L("T_CFILEMAN"));

/*
 * Prints failure notification for failed test cases during test running period
 */ 
void DoLogTestCaseFailure(const TTestParamAll& aParam)
	{
	const TUint testCaseId = aParam.iTestCaseID; 
	test.Printf(_L("Test Failure: Case %d !\n"), testCaseId);
	gFailedTestCases.Append(testCaseId);
	test.Printf(_L("Print out directory contents:\n"));
	PrintDir(aParam.iSrcPrsPath, *aParam.iSrcDrvChar);
	PrintDir(aParam.iSrcCmpPath, *aParam.iSrcDrvChar);
	if (aParam.iAPI == ECFMMove || aParam.iAPI == ECFMRename || aParam.iAPI == ECFMCopy || aParam.iAPI == ECFMCopyHandle)
		{
		PrintDir(aParam.iTrgPrsPath, *aParam.iTrgDrvChar);
		PrintDir(aParam.iTrgCmpPath, *aParam.iTrgDrvChar);
		}
	}

/*
 * Overall test results logging module, prints out the failing test cases with their ID
 */
void DoPrintTestResults()
	{
	// if no failure found
	if (gFailedTestCases.Count() == 0)
		{
		test.Printf(_L("All test cases have passed!\n"));
		return;
		}

	test.Printf(_L("Test failure(s) found in following case(s):\n"));
	for (TInt i = 0; i < gFailedTestCases.Count(); i++)
		{
		test.Printf(_L("Test Case: %u"), gFailedTestCases[i]);
		}
	test(EFalse);
	}

/*
 * Presetting module, presets initial source, target and comparing direcotries.
 * @param	aParam	test param that contains all information about a test case
 */
void DoPresettings(const TTestParamAll& aParam)
	{

	// Setup source files
	TFileName path = aParam.iSrcPrsPath;
	path[0] = (TUint16)*aParam.iSrcDrvChar;
	
	if(path[0] == (TUint8)gDriveToTest || path[0] == (TUint8)gFixedDriveValid)
		{
		SetupDirFiles(path, aParam.iSrcPrsFiles);

		// setup source cmp files
		path = aParam.iSrcCmpPath;
		path[0] = (TUint16)*aParam.iSrcDrvChar;
		SetupDirFiles(path, aParam.iSrcCmpFiles);
		}
	
		if (aParam.iAPI == ECFMMove || aParam.iAPI == ECFMRename || aParam.iAPI == ECFMCopy || aParam.iAPI == ECFMCopyHandle)
			{
			// setup trg files
			path = aParam.iTrgPrsPath;
			path[0] = (TUint16)*aParam.iTrgDrvChar;
			
			if(path[0]== (TUint8)gDriveToTest)
				{
				SetupDirFiles(path, aParam.iTrgPrsFiles);
			
				// setup trg cmp files
				path = aParam.iTrgCmpPath;
				path[0] = (TUint16)*aParam.iTrgDrvChar;
				SetupDirFiles(path, aParam.iTrgCmpFiles);
				}
			}
	}

/*
 * Test execution module
 * @param	aParam	test param that contains all information about a test case
 * @panic	USER:84	if return codes do not match the expected values. 	
 */

typedef TBuf<350> TTestFileName; 
void DoCmdExecution(const TTestParamAll& aParam)
	{
	TTestFileName srcCmd = aParam.iSrcCmdPath;
	if (srcCmd.Length() > 0)
		{
		srcCmd[0] = (TUint16)*aParam.iSrcDrvChar;
		}
	else
		{
		srcCmd= gSessionPath;
		srcCmd[0] = (TUint16)*aParam.iSrcDrvChar;
		}
	TInt r = KErrNone;
	switch(aParam.iAPI)
		{
		case ECFMDelete:
			if (!gAsynch)
				{
				r = gFileMan->Delete(srcCmd, aParam.iSwitch);
				test_Equal(r, aParam.iSyncReturn);
				}
			else
				{
				r = gFileMan->Delete(srcCmd, aParam.iSwitch, gStat);
				User::WaitForRequest(gStat);
				test_Equal(r , aParam.iAsyncReturn);
				test(gStat == aParam.iAsyncStatus);
				}
		break;
		
	    case ECFMRmDir:
			if (!gAsynch)
				{
				r = gFileMan->RmDir(srcCmd);
				test_Equal(r , aParam.iSyncReturn);
				}
			else
				{
				r = gFileMan->RmDir(srcCmd, gStat);
				User::WaitForRequest(gStat);
				test_Equal(r , aParam.iAsyncReturn);
				test(gStat == aParam.iAsyncStatus);
				}
		break;
		case ECFMAttribs:
			if (!gAsynch)
				{
				r = gFileMan->Attribs(srcCmd, aParam.iSetAttribs, aParam.iClearAttribs, aParam.iSetModified, aParam.iSwitch);
				test_Equal(r , aParam.iSyncReturn);
				}
			else
				{
				r = gFileMan->Attribs(srcCmd, aParam.iSetAttribs, aParam.iClearAttribs, aParam.iSetModified, aParam.iSwitch, gStat);
				User::WaitForRequest(gStat);
				test_Equal(r , aParam.iAsyncReturn);
				test(gStat == aParam.iAsyncStatus);
				}
			break;
		case ECFMMove:
			{
			TTestFileName trgCmd = aParam.iTrgCmdPath;
			if (trgCmd.Length() > 0)
				{
				trgCmd[0] = (TUint16)*aParam.iTrgDrvChar;
				}
			else
				{
				trgCmd= gSessionPath;
				}
			if (!gAsynch)
				{
				r = gFileMan->Move(srcCmd, trgCmd, aParam.iSwitch);
				test_Equal(r , aParam.iSyncReturn);
				}
			else
				{
				r = gFileMan->Move(srcCmd, trgCmd, aParam.iSwitch, gStat);
				User::WaitForRequest(gStat);
				test_Equal(r , aParam.iAsyncReturn);
				test(gStat == aParam.iAsyncStatus);
				}
			break;
			}
		case ECFMCopy:
			{
			TTestFileName trgCmd = aParam.iTrgCmdPath;
			if (trgCmd.Length() > 0)
				{
				trgCmd[0] = (TUint16)*aParam.iTrgDrvChar;
				}
			else
				{
				trgCmd= gSessionPath;
				}
			if (!gAsynch)
				{
				r = gFileMan->Copy(srcCmd, trgCmd, aParam.iSwitch);
				test_Equal(r , aParam.iSyncReturn);
				}
			else
				{
				r = gFileMan->Copy(srcCmd, trgCmd,aParam.iSwitch, gStat);
				User::WaitForRequest(gStat);
				test_Equal(r , aParam.iAsyncReturn);
				test(gStat == aParam.iAsyncStatus);
				}
			break;
			}
		case ECFMRename:
			{
			TTestFileName trgCmd = aParam.iTrgCmdPath;
			if (trgCmd.Length() > 0)
				{
				trgCmd[0] = (TUint16)*aParam.iTrgDrvChar;
				}
			else
				{
				trgCmd= gSessionPath;
				}
			if (!gAsynch)
				{
				r = gFileMan->Rename(srcCmd, trgCmd, aParam.iSwitch);
				test_Equal(r , aParam.iSyncReturn);
				}
			else
				{
				r = gFileMan->Rename(srcCmd, trgCmd, aParam.iSwitch, gStat);
				User::WaitForRequest(gStat);
				test_Equal(r , aParam.iAsyncReturn);
				test(gStat == aParam.iAsyncStatus);
				}
			break;
			}
		case ECFMCopyHandle:
		 {
			TTestFileName trgCmd = aParam.iTrgCmdPath;
			if (trgCmd.Length() > 0)
				{
				trgCmd[0] = (TUint16)*aParam.iTrgDrvChar;
				}
			else
				{
				trgCmd= gSessionPath;
				} 
			
			if (!gAsynch)
				{
				RFile tryfile;
				TInt ret = 0;
				ret = tryfile.Open(TheFs, srcCmd, EFileRead|EFileWrite);
				test_Equal(ret , KErrNone);
				r = gFileMan->Copy(tryfile, trgCmd, aParam.iSwitch);
				test_Equal(r , aParam.iSyncReturn);
				tryfile.Close();
				}
			else
				{
				RFile tryfile;
				TInt ret = 0;
				ret = tryfile.Open(TheFs, srcCmd, EFileRead|EFileWrite);
				test(ret == KErrNone);
				r = gFileMan->Copy(tryfile, trgCmd, aParam.iSwitch, gStat);
				User::WaitForRequest(gStat);
				test_Equal(r , aParam.iAsyncReturn);
				test(gStat == aParam.iAsyncStatus);
				tryfile.Close();
				}
		}
		default:
		break;

		}
			
	}

/*
 * Result verification module.
 * @param	aParam	test param that contains all information about a test case
 * @return	ETrue	if test results in expected behaviour, i.e. test passes
 * 			EFalse	if test results in unexpected behaviour, i.e. test fails
 */
TBool DoResultsVerification(const TTestParamAll& aParam)
	{
	TFileName srcPath = aParam.iSrcPrsPath;
	srcPath[0] = (TUint16)*aParam.iSrcDrvChar;
	TFileName srcCmpPath = aParam.iSrcCmpPath;
	srcCmpPath[0] = (TUint16)*aParam.iSrcDrvChar;
	
	if ((*aParam.iSrcDrvChar == gDriveToTest))
		{
		TBool rel = CompareL(srcPath, srcCmpPath);
		if(!rel)
			return EFalse;
		}
	
		if (aParam.iAPI == ECFMMove || aParam.iAPI == ECFMRename || aParam.iAPI == ECFMCopy || aParam.iAPI == ECFMCopyHandle)
			{
			TFileName trgPath = aParam.iTrgPrsPath;
			trgPath[0] = (TUint16)*aParam.iTrgDrvChar;
			TFileName trgCmpPath = aParam.iTrgCmpPath;
			trgCmpPath[0] = (TUint16)*aParam.iTrgDrvChar;
			if ((*aParam.iTrgDrvChar == gDriveToTest))
				{
				TBool rel = CompareL(trgPath, trgCmpPath);
				if(!rel)
					return rel;
				}
			
			}	
	return ETrue;
	}

/*
 * Search test cases by the index of the array of test case group, overloaded version for basic unitary cases.
 * @param 	aIdx		the test case index in search
 * @param	aBasicUnitaryTestCaseGroup		the input test group, should always be gBasicUnitaryTestCases[]
 * @param	aTestCaseFound		contains params of the test case found by the test case Id.
 * @return	KErrNone	if only one test case on the id is found
 * 			KErrNotFound	if no test case is found
 */
TInt SearchTestCaseByArrayIdx(TUint aIdx, const TTestCaseUnitaryBasic aBasicUnitaryTestCaseGroup[], TTestParamAll& aTestCaseFound)
	{
	if (aBasicUnitaryTestCaseGroup[aIdx].iBasic.iTestCaseID != 0)
		{
		aTestCaseFound.iTestCaseID 	= aBasicUnitaryTestCaseGroup[aIdx].iBasic.iTestCaseID;
		aTestCaseFound.iAPI 		= aBasicUnitaryTestCaseGroup[aIdx].iBasic.iAPI;
		aTestCaseFound.iSwitch		= aBasicUnitaryTestCaseGroup[aIdx].iBasic.iSwitch;
		aTestCaseFound.iSyncReturn	= aBasicUnitaryTestCaseGroup[aIdx].iBasic.iSyncReturn;
		aTestCaseFound.iAsyncReturn	= aBasicUnitaryTestCaseGroup[aIdx].iBasic.iAsyncReturn;
		aTestCaseFound.iAsyncStatus	= aBasicUnitaryTestCaseGroup[aIdx].iBasic.iAsyncStatus;

		aTestCaseFound.iSrcDrvChar	= aBasicUnitaryTestCaseGroup[aIdx].iSrcPrsBasic.iDrvChar;
		aTestCaseFound.iSrcCmdPath.Set(aBasicUnitaryTestCaseGroup[aIdx].iSrcPrsBasic.iCmdPath);
		aTestCaseFound.iSrcPrsPath.Set(aBasicUnitaryTestCaseGroup[aIdx].iSrcPrsBasic.iPrsPath);
		aTestCaseFound.iSrcPrsFiles = aBasicUnitaryTestCaseGroup[aIdx].iSrcPrsBasic.iPrsFiles;
		aTestCaseFound.iSrcCmpPath.Set(aBasicUnitaryTestCaseGroup[aIdx].iSrcPrsBasic.iCmpPath);
		aTestCaseFound.iSrcCmpFiles = aBasicUnitaryTestCaseGroup[aIdx].iSrcPrsBasic.iCmpFiles;
		}
	else
		return KErrNotFound;
	return KErrNone;
		
	}

/*
 * Search test cases by the index of the array of test case group, overloaded version for basic binary cases.
 * @param 	aIdx		the test case index in search
 * @param	aBasicUnitaryTestCaseGroup		the input test group, should always be gBasicBinaryTestCases[]
 * @param	aTestCaseFound		contains params of the test case found by the test case Id.
 * @return	KErrNone	if only one test case on the id is found
 * 			KErrNotFound	if no test case is found
 */
TInt SearchTestCaseByArrayIdx(TUint aIdx, const TTestCaseBinaryBasic aBasicBinaryTestCaseGroup[], TTestParamAll& aTestCaseFound)
	{
	if (aBasicBinaryTestCaseGroup[aIdx].iBasic.iTestCaseID != 0)
		{
		aTestCaseFound.iTestCaseID 	= aBasicBinaryTestCaseGroup[aIdx].iBasic.iTestCaseID;
		aTestCaseFound.iAPI 		= aBasicBinaryTestCaseGroup[aIdx].iBasic.iAPI;
		aTestCaseFound.iSwitch		= aBasicBinaryTestCaseGroup[aIdx].iBasic.iSwitch;
		aTestCaseFound.iSyncReturn	= aBasicBinaryTestCaseGroup[aIdx].iBasic.iSyncReturn;
		aTestCaseFound.iAsyncReturn	= aBasicBinaryTestCaseGroup[aIdx].iBasic.iAsyncReturn;
		aTestCaseFound.iAsyncStatus	= aBasicBinaryTestCaseGroup[aIdx].iBasic.iAsyncStatus;

		aTestCaseFound.iSrcDrvChar	= aBasicBinaryTestCaseGroup[aIdx].iSrcPrsBasic.iDrvChar;
		aTestCaseFound.iSrcCmdPath.Set(aBasicBinaryTestCaseGroup[aIdx].iSrcPrsBasic.iCmdPath);
		aTestCaseFound.iSrcPrsPath.Set(aBasicBinaryTestCaseGroup[aIdx].iSrcPrsBasic.iPrsPath);
		aTestCaseFound.iSrcPrsFiles = aBasicBinaryTestCaseGroup[aIdx].iSrcPrsBasic.iPrsFiles;
		aTestCaseFound.iSrcCmpPath.Set(aBasicBinaryTestCaseGroup[aIdx].iSrcPrsBasic.iCmpPath);
		aTestCaseFound.iSrcCmpFiles = aBasicBinaryTestCaseGroup[aIdx].iSrcPrsBasic.iCmpFiles;

		aTestCaseFound.iTrgDrvChar	= aBasicBinaryTestCaseGroup[aIdx].iTrgPrsBasic.iDrvChar;
		aTestCaseFound.iTrgCmdPath.Set(aBasicBinaryTestCaseGroup[aIdx].iTrgPrsBasic.iCmdPath);
		aTestCaseFound.iTrgPrsPath.Set(aBasicBinaryTestCaseGroup[aIdx].iTrgPrsBasic.iPrsPath);
		aTestCaseFound.iTrgPrsFiles = aBasicBinaryTestCaseGroup[aIdx].iTrgPrsBasic.iPrsFiles;
		aTestCaseFound.iTrgCmpPath.Set(aBasicBinaryTestCaseGroup[aIdx].iTrgPrsBasic.iCmpPath);
		aTestCaseFound.iTrgCmpFiles = aBasicBinaryTestCaseGroup[aIdx].iTrgPrsBasic.iCmpFiles;
		}
	else
		{
		return KErrNotFound;
		}
	return KErrNone;
	}

/*
 * Search test cases by test case Id, overloaded version for Basic unitary cases.
 * @param 	aCaseId		the test case Id in search
 * @param	aBasicUnitaryTestCaseGroup		the input test group, should always be gBasicUnitaryTestCases[]
 * @param	aTestCaseFound		contains params of the test case found by the test case Id.
 * @return	KErrNone	if only one test case on the id is found
 * 			KErrAlreadyExists	if more than one test cases found by the test case Id
 * 			KErrNotFound	if no test case is found
 */
TInt SearchTestCaseByTestCaseId(TUint aCaseId, const TTestCaseUnitaryBasic aBasicUnitaryTestCaseGroup[], TTestParamAll& aTestCaseFound)
	{
	TBool found = EFalse;
	TInt rel = KErrNone;

	// Scan through the test group by array index
	for(TInt i = 0; rel == KErrNone; i++)
		{
		rel = SearchTestCaseByArrayIdx(i, aBasicUnitaryTestCaseGroup, aTestCaseFound);
		if(aTestCaseFound.iTestCaseID == aCaseId)
			{
			// If more than one test cases found, return error 
			if(found)
				{
				return KErrAlreadyExists;
				}
			found = ETrue;
			}
		}

	if (!found)
		{
		return KErrNotFound;
		}
	return KErrNone;
	}

/*
 * Do all basic binary test cases defined in gBasicUnitaryTestCases[]
 */
void DoAllBasicUnitaryTests(const TTestCaseUnitaryBasic aBasicUnitaryTestCaseGroup[])
	{
	TTestParamAll nextTestCase;
	TInt i = 0;
	
	while (SearchTestCaseByArrayIdx(i, aBasicUnitaryTestCaseGroup, nextTestCase) == KErrNone)
		{
		TTime startTime;
		TTime endTime;
		startTime.HomeTime();
		DoPresettings(nextTestCase);
		DoCmdExecution(nextTestCase);
		if (!DoResultsVerification(nextTestCase))
			{
			DoLogTestCaseFailure(nextTestCase);
			}
		else
			{
			test.Printf(_L("Test ID %d passed \n"),nextTestCase.iTestCaseID);
			}
		endTime.HomeTime();
		TTimeIntervalMicroSeconds timeTaken(0);
		timeTaken = endTime.MicroSecondsFrom(startTime);
		TInt time2=0;
		time2=I64LOW(timeTaken.Int64()/1000);
		test.Printf(_L("Time Taken by testid %d = %d mS \n"),nextTestCase.iTestCaseID,time2);		
		++i;

		}
	}

/*
 * Do all basic binary test cases defined in gBasicBinaryTestCases[]
 */
void DoAllBasicBinaryTests(const TTestCaseBinaryBasic aBasicBinaryTestCaseGroup[])
	{
	TTestParamAll nextTestCase;
	TInt i = 0;
	while (SearchTestCaseByArrayIdx(i, aBasicBinaryTestCaseGroup, nextTestCase) == KErrNone)
		{
		TTime startTime;
		TTime endTime;
		startTime.HomeTime();
		DoPresettings(nextTestCase);
		DoCmdExecution(nextTestCase);
		if (!DoResultsVerification(nextTestCase))
			{
			DoLogTestCaseFailure(nextTestCase);
			}
		else
			{
			test.Printf(_L("Test ID %d passed \n"),nextTestCase.iTestCaseID);
			}
		endTime.HomeTime();
		TTimeIntervalMicroSeconds timeTaken(0);
		timeTaken = endTime.MicroSecondsFrom(startTime);

		TInt time2=0;
		time2=I64LOW(timeTaken.Int64()/1000);
		test.Printf(_L("Time Taken by test id %d = %d mS \n"),nextTestCase.iTestCaseID,time2);
		++i;
		}
	}

// Future work: provide command arguement parsing faclity so that users
//  can choose specific test case(s) in ranges
//  can choose specific API(s), switches, configurations, etc. for testing
/*
 * Main testing control unit
 */
void TestMain()
	{
//The __PERFTEST__ macro is for future use when a tests are setup to run on a performance machine 
//which will be enabled to run for both WINSCW and ARMV5
#ifndef __PERFTEST__
	//Tests are enabled to run for WINSCW only on the below specified drives due to the time constraint.
	if((gDriveToTest == 'C') || (gDriveToTest == 'X') || (gDriveToTest == 'Y'))
		{
		DoAllBasicUnitaryTests(gBasicUnitaryTestCases);
		DoAllBasicBinaryTests(gBasicBinaryTestCases);
		}
	else
		{
		test.Printf(_L("Drive %C: is not supported for this configuration, see test logs for supported configuration details"),gDriveToTest);
		}
#endif
	
#ifdef __PERFTEST__
		DoAllBasicUnitaryTests(gBasicUnitaryTestCases);
		DoAllBasicBinaryTests(gBasicBinaryTestCases);
#endif	
	}


/*
 * Initialise test, do all tests in both sync and async mode. 
*/
void CallTestsL()
	{
	InitialiseL();
	
	CreateTestDirectory(_L("\\F32-TST\\T_CFILEMAN\\"));

	gAsynch=EFalse;	
	test.Next(_L("Synchronous tests ..."));
	TestMain();
	
	DeleteTestDirectory();

	CreateTestDirectory(_L("\\F32-TST\\T_CFILEMAN\\"));
	gAsynch=ETrue;
	test.Next(_L("Asynchronous tests ..."));
	TestMain();

	DoPrintTestResults();
	Cleanup();
	DeleteTestDirectory();
	}