// Copyright (c) 2001-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:
//
// INCLUDE FILES
#include "ctlbsclientpostp201.h"
#include <LbsPositionInfo.h>
#include <Lbs.h>
#include <LbsCommon.h>
#include <LbsRequestor.h>
#include <s32file.h>
#include "ctlbsclientobserver.h"
// CONSTANTS
const TInt KSecond = 1*1000*1000;
const TInt KMaxSentenceLength = 60; //Max length of each line in EXEClient-logfile
const TInt KNoOfEXCalls = 3; // Nr of calls to ExeClient
_LIT(KExeClientPath, "ctlbsexeclient");
_LIT(KExeResultPath, "c:\\logs\\execlientresult%d.txt");
_LIT(KSucce, "Test %d was successful");
_LIT(KFail, "Test %d failed");
_LIT8(KSuccess, "SUCCESS"); //String to search for that indicates the test was succesful
// ================= MEMBER FUNCTIONS =======================
// ---------------------------------------------------------
// Constructor.
// ---------------------------------------------------------
CT_LbsClientPosTp201::CT_LbsClientPosTp201(CT_LbsServer& aParent): CT_LbsPortedStepBase(aParent)
{
_LIT(KTestName, "TP201 - Exe Client");
SetTestStepName(KTestName);
}
// ---------------------------------------------------------
// Destructor.
// ---------------------------------------------------------
CT_LbsClientPosTp201::~CT_LbsClientPosTp201()
{
}
// ---------------------------------------------------------
// CT_LbsClientPosTp201::StartL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CT_LbsClientPosTp201::StartL()
{
//This test can be run on emulator now.
TInt result;
TInt i;
TInt foundsucces;
RProcess execlient[KNoOfEXCalls];
RFile file;
RFileReadStream fstream;
RFs fileSession;
User::LeaveIfError(fileSession.Connect());
CleanupClosePushL(fileSession);
CleanupClosePushL(fstream);
CleanupClosePushL(file);
CFileMan* fileMan = CFileMan::NewL(fileSession);
CleanupStack::PushL(fileMan);
_LIT(KRemoveFiles, "Remove files");
INFO_PRINTF1(KRemoveFiles);
//1. First check for old ExeClientResult-files to remove.
TBuf<40> filepath;
filepath.Append(KExeResultPath);
for ( i = 1; i<=KNoOfEXCalls; i++)
{
filepath.Format(KExeResultPath,i);
TInt err = fileMan->Delete(filepath, CFileMan::EOverWrite);
if (err != KErrNone && err != KErrNotFound)
{
_LIT(KErrRemoveDll, "Removal of a previous ExeClientResult-file failed!");
TBuf<50> buf;
buf.Format(KErrRemoveDll, err);
LogErrorAndLeaveL(buf);
}
}
_LIT(KStartClients, "Start clients");
INFO_PRINTF1(KStartClients);
//2. Make 3 calls to ExeClient.
for ( i = 1; i<= KNoOfEXCalls; i++)
{
//Start the execlient-process
result = execlient[i-1].Create(KExeClientPath, KNullDesC);
User::LeaveIfError(result);
execlient[i-1].Resume(); //make the execlient visible
User::After(6000000);
}
CT_LbsClientObserver::WaitForEPosShutdown(); //Wait for Epos to complete
User::After(KSecond); //Wait for completion of writing to files. 1 minute.
for ( i = 0; i < KNoOfEXCalls; i++)
{
TRequestStatus closed;
execlient[i].Logon(closed);
User::WaitForRequest(closed);
TBuf<100> exit;
_LIT(KExitClient, "Client %d exited: Type %d, Reason %d");
exit.Format(KExitClient,
i+1, execlient[i].ExitType(), execlient[i].ExitReason());
INFO_PRINTF1(exit);
execlient[i].Close(); //Close handle to exe-client
}
_LIT(KCheckResults, "Check results");
INFO_PRINTF1(KCheckResults);
//3. See if all calls were successes
TBuf<40> successinfo;
successinfo.Append(KSucce);
TBuf<40> failinfo;
failinfo.Append(KFail);
for ( i = 1; i <= KNoOfEXCalls; i++)
{
filepath.Format(KExeResultPath,i);
User::LeaveIfError(file.Open(fileSession, filepath, EFileShareReadersOnly));//open read only
fstream.Attach(file);
TBuf8<KMaxSentenceLength> dbuffer; //Buffer to place read data from file
TBuf8<KMaxSentenceLength> prevbuffer; //Buffer to place previous read data from file
TBool search = ETrue;
const TChar eoline(';');
while (search)
{
dbuffer.Delete(0, KMaxSentenceLength);
TRAPD(ferr, (fstream.ReadL(dbuffer,eoline)));
if ( ferr == KErrEof)
{
search = EFalse; //stop searching
}
else if ( ferr == KErrNone)
{
prevbuffer.Delete(0, KMaxSentenceLength);
prevbuffer = dbuffer;
}
else
{
_LIT(KReadError, "Error when reading from log-file.");
LogErrorAndLeaveL(KReadError);
}
}
//Check if success
foundsucces = prevbuffer.Find(KSuccess);
if ( foundsucces != KErrNotFound)
{
successinfo.Format(KSucce,i);
INFO_PRINTF1(successinfo);
}
else
{
failinfo.Format(KFail,i);
LogErrorAndLeaveL(failinfo);
}
} //for
_LIT(KDone, "Done.");
INFO_PRINTF1(KDone);
//4. Let's clean...
CleanupStack::PopAndDestroy(fileMan); //fileMan
CleanupStack::PopAndDestroy(&file); //file
CleanupStack::PopAndDestroy(&fstream); //fstream
CleanupStack::PopAndDestroy(&fileSession); //fileSession
}
// End of File