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();
}