diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/test/util/src/esocktestutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/test/util/src/esocktestutils.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,250 @@ +// Copyright (c) 2004-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: +// + +#include "esocktestutils.h" +#include +#include +#include + + + + + + +EXPORT_C TInt ESockTestUtils::StopAllInterfaces(TDes& aErrDesc) +/** +Close all interfaces that are currently open by attaching to each in turn and then using the Stop() method. + +@param None +*/ + { + // this code is based on the implementation of the same method in TS_RConnection + // there are no methods used here which are allowed to leave and so the cleanup stack is not used + TInt err = KErrNone; + + // all operations here require a socket server + RSocketServ ss; + err = ss.Connect(); + + TDes16IgnoreOverflow overflow; + aErrDesc.Zero(); + + // how many open interfaces are there? + RConnection enumerator; + if(err == KErrNone) + { + err = enumerator.Open(ss); + } + TUint noOfConnectionsBefore = 0; + TUint noOfConnectionsAfter = 0; + if(err == KErrNone) + { + err = enumerator.EnumerateConnections(noOfConnectionsBefore); + } + if (KErrNone != err) + { + aErrDesc.AppendFormat(_L("Up to initial EnumerateConnections failed"), &overflow); + return err; + } + aErrDesc.AppendFormat(_L("Started with %d connections\n"), &overflow, noOfConnectionsBefore); + // for each interface attach to it and then stop it. + TPckgBuf connectionInfo; + while (noOfConnectionsBefore && err == KErrNone) + { + err = enumerator.GetConnectionInfo(1, connectionInfo); + if (KErrNone != err) + { + aErrDesc.AppendFormat(_L("GetConnectionInfo(1) failed"), &overflow); + break; + } + aErrDesc.AppendFormat(_L("Conn#1 IAP=%d, NID=%d\n"), &overflow, connectionInfo().iIapId, connectionInfo().iNetId); + + RConnection real; + err = real.Open(ss); + if (KErrNone != err) + { + aErrDesc.AppendFormat(_L("RConnection::Open() failed"), &overflow); + break; + } + + //Attach can fail, and it may be acceptible for it to fail + //if the connection is no longer there. + err = real.Attach(connectionInfo, RConnection::EAttachTypeNormal); + if (KErrNone == err) + { + err = real.Stop(); + if(KErrNone != err) + { + aErrDesc.Format(_L("RConnection::Stop failed"), &overflow); + } + } + aErrDesc.Format(_L("RConnection::Attach failed with %d - continuing"), &overflow, err); + real.Close(); + + //Here we check the ultimate objective of the iteration, i.e.: + //at least one connection less. + TInt errEnum = enumerator.EnumerateConnections(noOfConnectionsAfter); + if(errEnum != KErrNone) + { + aErrDesc.Format(_L("RConnection::Enumerate failed with %d - continuing"), &overflow, errEnum); + } + if (noOfConnectionsAfter < noOfConnectionsBefore) + { + //Iteration successful. If error attaching, clear it. + err = KErrNone; + noOfConnectionsBefore = noOfConnectionsAfter; + } + else if (err == KErrNone) + { + //very strange - no error recorded, though no connection stopped. + err = KErrGeneral; + } + } + + // clean up + enumerator.Close(); + ss.Close(); + return err; + } + + +EXPORT_C void ESockTestUtils::DefaultToConfig1L() + { + // If no PDUMMY1 or PDUMMY2 config files are present then run "te_esock_test_copy_config_1.script". This allows elementary tests such as TE_SOCKET + // to "work out of the box" on a freshly booted ROM, so reducing support costs. + // This trivial thing is only implemented as a test step because our test scripting language has no conditional support. + _LIT(KConfiguratorPrivateDir, "\\private\\101F7988\\"); + _LIT(KPDummyCmiMask, "pdummy*.cmi"); + _LIT(KCodealerCmiMask, "esock_codealer*.cmi"); + + RFs fs; + User::LeaveIfError(fs.Connect()); + + TFindFile ff(fs); + CDir* dummyList = NULL; + TInt ret = ff.FindWildByDir(KPDummyCmiMask, KConfiguratorPrivateDir, dummyList); + if(ret != KErrNone) + { + delete dummyList; + ret = ff.FindWildByDir(KCodealerCmiMask, KConfiguratorPrivateDir, dummyList); + if(ret != KErrNone) + { + // Run the config script. Very horribly it seems to have to be like this with ScheduleTest, as running + // TestExecute from a TestExecute test step produces KErrAlreadyExists followed by a garbled log file for the + // parent. + _LIT(KScheduleTestExe, "ScheduleTest"); + _LIT(KCopyConfig1Script, "z:\\testdata\\scripts\\te_esock_test_copy_config_1.script"); + RProcess testExec; + ret = testExec.Create(KScheduleTestExe, KCopyConfig1Script); + if(ret == KErrNone) + { + TRequestStatus completedStatus; + testExec.Logon(completedStatus); + testExec.Resume(); + User::WaitForRequest(completedStatus); + } + testExec.Close(); + } + } + delete dummyList; + } + + + + + +//from deprecated genconn library +//modified to fit in with TE_ methodology +EXPORT_C TBool ESockTestUtils::IsNetworkActiveL() +{ + + TBool result = true; + TInt err = KErrNone; + + RSocketServ ss; + err = ss.Connect(); + User::LeaveIfError(err); + + RConnection conn; + err = conn.Open(ss); + User::LeaveIfError(err); + + TUint count(0); + err = conn.EnumerateConnections(count); + User::LeaveIfError(err); + + + conn.Close(); + ss.Close(); + + //KErrNone - no connections, need to think about return status if there + //are connections taking place + if (count==0) + result= false; + else + result= true; + + return result; +} + + +//from deprecated genconn library +//modified to fit in with TE_ methodology as per esocktestsection9.cp-waitfor +EXPORT_C TInt ESockTestUtils::Delay(TInt aGuardTimerValue) +{ + //Note this function step would have been called from the iTest scripts + //to delay for a certain amount of milliseconds before checking to see + //if the socket/network/connection has changed to the desired state. + //The delay tries to ensure the socket/network/connection + //status has change before we go to the next step where we would check + //this status + + // wait for either test thread or timer to end + TInt err = KErrNone; + RTimer GuardTimer; + GuardTimer.CreateLocal(); // create for this thread + TRequestStatus TimerStatus; + + //aGuardTimerValue is in milliseconds + GuardTimer.After(TimerStatus,aGuardTimerValue * 1000); + + + User::WaitForRequest(TimerStatus); + if( TimerStatus == KRequestPending ) + { + // This is lifted from SockBench to solve some apparently + // strange behaviour with the timer. + + // Since we are still waiting for this timer, cancel it and + // wait for the request to be flagged. I believe this is + // needed since the kernel may have setup a semaphore on the + // 'TimerStatus' Request Status. The Cancel() will flag the + // status change (or maybe the timer will expire anyway) and + // if we don't clear it, we may crash later when we return + // to the Active Scheduler (since the TRequestStatus and + // RTimer won't exist). + // + GuardTimer.Cancel(); + User::WaitForRequest( TimerStatus ); + } + GuardTimer.Cancel(); + if (TimerStatus == KErrNone) + err= KErrNone; + else + err= KErrGeneral; + + return err; +} +