// 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 "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:
//
/**
@file
@test
@internalComponent - Internal Symbian test code
*/
#include <e32base.h>
#include <f32file.h>
#include <s32file.h>
#include "ssmcletestapp.h"
#include "ssmdebug.h"
void XSsmCleTestApp::WriteStartTimeL(RFs aFs, const TDesC& aLogPrefix)
{
TBuf<KTestCommandLineMaxLength> logFileName;
logFileName.Format(_L("%Stime"), &aLogPrefix);
TTime now;
now.UniversalTime();
TUint32 high = 0;
TUint32 low = 0;
high = I64HIGH(now.Int64());
low = I64LOW(now.Int64());
RFileWriteStream ws;
User::LeaveIfError(ws.Replace(aFs, logFileName, EFileWrite));
ws.PushL();
ws.WriteUint32L(high);
ws.WriteUint32L(low);
ws.CommitL();
CleanupStack::PopAndDestroy(); // ws
}
void XSsmCleTestApp::WriteResultL(RFs aFs, const TDesC& aLogPrefix, const TCleTestFailHow& aFailHow)
{
TBuf<KTestCommandLineMaxLength> logFileName, logFileNameExitReason;
TInt result, err;
RFileWriteStream fileWriteStream;
//For Getting the Exit Reason
if(aFailHow == EBadRendezvous)
{
//This is done because for BadRendezvous Case, we need to do 2 things:
//1. Write the constant KErrBadRendezvousTest as the Exit Reason for the process in a separate file.
//2. Write the EBadRendezvous value to a separate file, hence separate close and pop operations required.
logFileNameExitReason.Format(_L("%Sreason"), &aLogPrefix);
result = KErrBadRendezvousTest;
err =fileWriteStream.Replace(aFs, logFileNameExitReason, EFileWrite);
CleanupClosePushL(fileWriteStream);
User::LeaveIfError(err);
fileWriteStream.WriteUint32L(result);
fileWriteStream.CommitL();
CleanupStack::PopAndDestroy(); // fileWriteStream
}
logFileName.Format(_L("%Sresult"), &aLogPrefix);
result = aFailHow;
err =fileWriteStream.Replace(aFs, logFileName, EFileWrite);
CleanupClosePushL(fileWriteStream);
User::LeaveIfError(err);
fileWriteStream.WriteUint32L(result);
fileWriteStream.CommitL();
CleanupStack::PopAndDestroy(); // fileWriteStream
}
TInt XSsmCleTestApp::GetRunCountL(RFs aFs, const TDesC& aLogPrefix)
{
TBuf<KTestCommandLineMaxLength> logFileName;
logFileName.Format(_L("%Scount"), &aLogPrefix);
RFileReadStream file;
TInt err = 0;
err = file.Open(aFs, logFileName, EFileRead);
TInt result = 0;
if (err != KErrNotFound && err != KErrPathNotFound)
{
file.PushL();
User::LeaveIfError(err);
result = file.ReadInt32L();
file.Close();
CleanupStack::PopAndDestroy(); //file
}
return result;
}
TInt XSsmCleTestApp::IncrementRunCountL(RFs aFs, const TDesC& aLogPrefix)
{
TInt runcount = GetRunCountL(aFs, aLogPrefix);
TBuf<KTestCommandLineMaxLength> logFileName;
logFileName.Format(_L("%Scount"), &aLogPrefix);
runcount++;
RFileWriteStream file;
User::LeaveIfError(file.Replace(aFs, logFileName, EFileWrite));
file.PushL();
file.WriteInt32L(runcount);
file.Close();
CleanupStack::PopAndDestroy();//file
return runcount;
}
void XSsmCleTestApp::GetCommandLineArgsL(TSsmCleTestAppArgs& aArgStruct)
{
DEBUGPRINT1A("Parsing commandline argument");
TBuf<KTestCommandLineMaxLength> commandLine;
commandLine.SetLength(0);
if(User::CommandLineLength() > commandLine.MaxLength())
{
User::Leave(KErrTooBig);
}
User::CommandLine(commandLine);
DEBUGPRINT3(_L("ssmcletestapp.cpp %d: Argument string: %S"), __LINE__, &commandLine);
aArgStruct.iWaitTime = 0;
aArgStruct.iSucceedOnRun = 0;
aArgStruct.iFailHow = EDontFail;
TLex cmdLnLex(commandLine);
if (cmdLnLex.Eos()) // If there aren't any arguments, that is an error
{
DEBUGPRINT1A("Argument error");
User::Leave(KErrArgument);
}
else
{
TPtrC token(cmdLnLex.NextToken());
aArgStruct.iLogPrefix.SetLength(0);
aArgStruct.iLogPrefix.Format(_L("%S%S"), &KTestAppLogFileLoc, &token);
DEBUGPRINT4(_L("ssmcletestapp.cpp %d: Log file prefix (length: %d): %S"), __LINE__, aArgStruct.iLogPrefix.Length(), &(aArgStruct.iLogPrefix));
}
if(!cmdLnLex.Eos()) // If there was only one argument, we are finished and there was no timeout requested.
{
TPtrC token(cmdLnLex.NextToken());
TLex timeoutLex(token);
User::LeaveIfError(timeoutLex.Val(aArgStruct.iWaitTime)); // If Val() returns an error the second argument wasn't an integer, which it should have been
}
DEBUGPRINT2A("Wait time: %d", aArgStruct.iWaitTime);
if(!cmdLnLex.Eos()) // If we've run out of arguments, we are finished and there was no failed runs requested.
{
TPtrC token(cmdLnLex.NextToken());
TLex timeoutLex(token);
User::LeaveIfError(timeoutLex.Val(aArgStruct.iSucceedOnRun)); // If Val() returns an error the third argument wasn't an integer, which it should have been
}
DEBUGPRINT2A("Times to fail: %d", aArgStruct.iSucceedOnRun);
if(!cmdLnLex.Eos()) // If we've run out of arguments, we are finished and there was no failure mode requested.
{
TInt temp;
TPtrC token(cmdLnLex.NextToken());
TLex timeoutLex(token);
User::LeaveIfError(timeoutLex.Val(temp)); // If Val() returns an error the third argument wasn't an integer, which it should have been
aArgStruct.iFailHow = static_cast<TCleTestFailHow>(temp);
}
DEBUGPRINT2A("Failure mode: %d", aArgStruct.iFailHow);
}