diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/test/TE_EsockTestSteps/src/ESockDebug.TestSteps.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/test/TE_EsockTestSteps/src/ESockDebug.TestSteps.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,498 @@ +// Copyright (c) 2006-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 ESockDebug.TestSteps.cpp +*/ + +#include + +#include "SocketServer.TestSteps.h" +#include "ESockDebug.TestSteps.h" + +#include +#include +#include "XmlParsing.h" +#include + +#include + + +#ifdef _DEBUG +// Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module +// (if it could happen through user error then you should give it an explicit, documented, category + code) +_LIT(KSpecAssert_ESockTestESckDbg, "ESockTestESckDbg"); +#endif + +using namespace Xml; + +// ESOCK Message Intercept Register +//================================= + +// Build message intercept pattern +//-------------------------------- +CAppendMessageInterceptPattern::CAppendMessageInterceptPattern(CCEsockTestBase*& aEsockTest) +: CTe_EsockStepBase(aEsockTest) + { + SetTestStepName(KAppendMessageInterceptPattern); + } + +TInt CAppendMessageInterceptPattern::ConfigureFromIni() + { + // Read in name of socket server used for controlling esock debug + if((GetStringFromConfig(iSection, KTe_SocketServName, iSocketSvrName) != 1) + || (iSocketSvrName.Length() == 0)) + { + INFO_PRINTF1(_L("Couldn't find appropriate field in config file")); + return KErrNotFound; + } + + // We need to have at least one expression + TInt success; + TBool done(EFalse); + + // The expressions are indexed from 1 in our config files + TInt expressionCount = 1; + + // Fetch the action first + TAction action; + TRAPD(error, ReadActionL(action)); + if(error != KErrNone) + { + INFO_PRINTF1(_L("Couldn't find action field in config file")); + return KErrNotFound; + } + else + { + RExpressionList expressionList; + CleanupClosePushL(expressionList); + + // We have an action so start looking for expressions to go with it + // One at a time read in whole expressions till no more to be found + while(!done) + { + TEventExpression eventExpression; + + // Read in the expression + TRAPD(error, ReadEventExpressionL(expressionCount, eventExpression)); + + if(error == KErrNone) + { + // Found an expression so lets add it to an expression list for this pattern + expressionList.Append(eventExpression); + } + else if(error == KErrNotFound) + { + // Must be the end of list of expressions + done = ETrue; + } + else + { + // Some kind of xml parsing issue lets get out of here + CleanupStack::PopAndDestroy(&expressionList); + return error; + } + + expressionCount++; + } + + if(expressionList.Count() > 0) + { + iPattern = CPattern::NewL(expressionList, action); + CleanupStack::Pop(&expressionList); + success = KErrNone; + } + else + { + CleanupStack::PopAndDestroy(&expressionList); + success = KErrArgument; + } + + } + + return success; + } + +const TInt KConfigSubSectionNameMaxLength = 64; +const TInt KIniDataMaxLength = 256; + +void CAppendMessageInterceptPattern::ReadEventExpressionL(TInt aIndex, TEventExpression& aExpression) + { + // Fetch the whole ini data subsection that we will parse + _LIT(KEventSubSectionFormat, "Event%d"); + TBuf subSectionName; + subSectionName.Format(KEventSubSectionFormat, aIndex); + + TPtrC iniData; + if(!GetStringFromConfig(iSection, subSectionName, iniData)) + { + // We must have already found the last event expression + User::Leave(KErrNotFound); + } + + // Damn we need to convert the whole ini section back to UTF8 + TBuf8 iniData8; + CnvUtfConverter::ConvertFromUnicodeToUtf8(iniData8, iniData); + + // Add some tags around the outside. XML parser needs them and leaving them out of the ini keeps things simple + _LIT8(KSurroundingEventTagsFormat, "%S"); + TBuf8 iniData8tagged; + iniData8tagged.Format(KSurroundingEventTagsFormat, &iniData8); + + // Its some xml so lets just parse the lot + CEventExpressionXmlHandler handler(aExpression); + CParser* parser = CParser::NewLC(KXmlMimeType, handler); + TRAPD(error, Xml::ParseL(*parser, iniData8tagged)); + if(error != KErrNone) + { + INFO_PRINTF2(_L("Error during XML parsing of (%S)."), &subSectionName); + User::Leave(KErrArgument); + } + + // Cleanup + CleanupStack::PopAndDestroy(parser); + } + +void CAppendMessageInterceptPattern::ReadActionL(TAction& aAction) + { + // Fetch the whole ini data subsection that we will parse + TPtrC iniData; + _LIT(KAction, "Action"); + if(!GetStringFromConfig(iSection, KAction, iniData)) + { + User::Leave(KErrNotFound); + } + + // Damn we need to convert the whole ini section back to UTF8 + TBuf8 iniData8; + CnvUtfConverter::ConvertFromUnicodeToUtf8(iniData8, iniData); + + // Its some xml so lets just parse the lot + CActionXmlHandler handler(aAction); + CParser* parser = CParser::NewLC(KXmlMimeType, handler); + TRAPD(error, Xml::ParseL(*parser, iniData8)); + if(error != KErrNone) + { + INFO_PRINTF2(_L("Error during XML parsing of (%S)."), KAction); + User::Leave(KErrNotFound); + } + + // Cleanup + CleanupStack::PopAndDestroy(parser); + } + +TVerdict CAppendMessageInterceptPattern::doSingleTestStep() + { + SetTestStepResult(EFail); + + // Look up the socket server being used for esock debug control + RSocketServ* debugSocketServer = iEsockTest->iSockServs.Find(iSocketSvrName); + + if(debugSocketServer) + { + // Make the call to reset the ESock debug register with the socket server given + TRAPD(error, AppendPatternToRegisterL(*debugSocketServer)); + if(error == KErrNone) + { + SetTestStepResult(EPass); + } + else + { + // If it errored then this step failed + INFO_PRINTF2(_L("Could not enable the ESock message intercept register. Error (%S)."), error); + } + } + else + { + INFO_PRINTF1(_L("Could not find socket server for debug control of esock. Error (%S).")); + } + + return TestStepResult(); + } + +CAppendMessageInterceptPattern::~CAppendMessageInterceptPattern() + { + delete iPattern; + } + +void CAppendMessageInterceptPattern::AppendPatternToRegisterL(RSocketServ& /*aSocketSvr*/) const + { + __ASSERT_DEBUG(iPattern, User::Panic(KSpecAssert_ESockTestESckDbg, 1)); + TUint numExpressions = iPattern->Expressions().Count(); + __ASSERT_DEBUG(numExpressions > 0, User::Panic(KSpecAssert_ESockTestESckDbg, 2)); + +//TODO MessageIntercept not operational +#if 0 + // Pull apart the pattern built and send it across to the message intercept register + TUint index; + TInt error; + for(index = 0; index < numExpressions; index++) + { + TEventExpression expression = iPattern->Expressions()[index]; + + // Build the debug control message for current expression and send it to esock + TAppendExpressionMsg msg1(expression); + error = aSocketSvr.__DbgControl(msg1); + if(error != KErrNone) + { + User::Leave(KErrGeneral); + } + } + + // And finally terminate the pattern with the action + TAppendActionMsg msg2(iPattern->Action()); + error = aSocketSvr.__DbgControl(msg2); + if(error != KErrNone) + { + User::Leave(KErrGeneral); + } +#endif + User::Leave(KErrGeneral); + } + + + +// Enable message intercept register +//---------------------------------- +CEnableMessageInterceptRegister::CEnableMessageInterceptRegister(CCEsockTestBase*& aEsockTest) +: CTe_EsockStepBase(aEsockTest), iSocketSvrName(KNullDesC) + { + SetTestStepName(KEnableMessageInterceptRegister); + } + +TInt CEnableMessageInterceptRegister::ConfigureFromIni() + { + // Read in appropriate fields + if((GetStringFromConfig(iSection, KTe_SocketServName, iSocketSvrName) != 1) + || (iSocketSvrName.Length() == 0)) + { + INFO_PRINTF1(_L("Couldn't find appropriate field in config file")); + return KErrNotFound; + } + + // All ok if we got this far + return KErrNone; + } + +TVerdict CEnableMessageInterceptRegister::doSingleTestStep() + { + SetTestStepResult(EFail); + + // Look up the socket server being used for esock debug control + RSocketServ* debugSocketServer = iEsockTest->iSockServs.Find(iSocketSvrName); + +//TODO MessageIntercept not operational +#if 0 + if(debugSocketServer) + { + // Build a debug control message and send it to esock + MessageIntercept::TEnableMsg msg; + TInt error = debugSocketServer->__DbgControl(msg); + + if (error != KErrNone) + { + // If it errored then this step failed + INFO_PRINTF2(_L("Could not enable the ESock message intercept register. Error (%S)."), error); + } + else + { + SetTestStepResult(EPass); + } + } + else + { + INFO_PRINTF1(_L("Could not find socket server for debug control of esock. Error (%S).")); + } +#endif + return TestStepResult(); + } + + +// Disable message intercept +//-------------------------- +CDisableMessageInterceptRegister::CDisableMessageInterceptRegister(CCEsockTestBase*& aEsockTest) + : CTe_EsockStepBase(aEsockTest), iSocketSvrName(KNullDesC) + { + SetTestStepName(KDisableMessageInterceptRegister); + } + +TInt CDisableMessageInterceptRegister::ConfigureFromIni() + { + // Read in appropriate fields + if((GetStringFromConfig(iSection, KTe_SocketServName, iSocketSvrName) != 1) + || (iSocketSvrName.Length() == 0)) + { + INFO_PRINTF1(_L("Couldn't find appropriate field in config file")); + return KErrNotFound; + } + + // All ok if we got this far + return KErrNone; + } + +TVerdict CDisableMessageInterceptRegister::doSingleTestStep() + { + SetTestStepResult(EFail); + + // Look up the socket server being used for esock debug control + RSocketServ* debugSocketServer = iEsockTest->iSockServs.Find(iSocketSvrName); + + if(debugSocketServer) + { + // Build a debug control message and send it to esock +//TODO MessageIntercept not operational +#if 0 + MessageIntercept::TDisableMsg msg; + TInt error = debugSocketServer->__DbgControl(msg); + + if (error != KErrNone) + { + // If it errored then this step failed + INFO_PRINTF2(_L("Could not disable the ESock message intercept register. Error (%S)."), error); + } + else + { + SetTestStepResult(EPass); + } +#endif + } + else + { + INFO_PRINTF1(_L("Could not find socket server for debug control of esock. Error (%S).")); + } + + // All ok if we got this far + return TestStepResult(); + } + + +// Reset message intercept register +//--------------------------------- + +CResetMessageInterceptRegister::CResetMessageInterceptRegister(CCEsockTestBase*& aEsockTest) + : CTe_EsockStepBase(aEsockTest), iSocketSvrName(KNullDesC) + { + SetTestStepName(KResetMessageInterceptRegister); + } + +TInt CResetMessageInterceptRegister::ConfigureFromIni() + { + // Read in appropriate fields + if((GetStringFromConfig(iSection, KTe_SocketServName, iSocketSvrName) != 1) + || (iSocketSvrName.Length() == 0)) + { + INFO_PRINTF1(_L("Couldn't find appropriate field in config file")); + return KErrNotFound; + } + + // All ok if we got this far + return KErrNone; + } + +TVerdict CResetMessageInterceptRegister::doSingleTestStep() + { + // Default to failing + SetTestStepResult(EFail); +//TODO MessageIntercept not operational +#if 0 + // Look up the socket server being used for esock debug control + RSocketServ* debugSocketServer = iEsockTest->iSockServs.Find(iSocketSvrName); + + if(debugSocketServer) + { + // Build a debug control message and send it to esock + MessageIntercept::TSoftResetMsg msg; + TInt error = debugSocketServer->__DbgControl(msg); + + if (error != KErrNone) + { + // If it errored then this step failed + INFO_PRINTF2(_L("Could not reset the ESock message intercept register. Error (%S)."), error); + SetTestStepError(error); + } + else + // Everything ok so we passed + { + SetTestStepResult(EPass); + } + } + else + { + INFO_PRINTF1(_L("Could not find socket server for debug control of esock. Error (%S).")); + } +#endif + return TestStepResult(); + } + + +// Query completion of message interception +//----------------------------------------- + +CQueryMsgInterceptComplete::CQueryMsgInterceptComplete(CCEsockTestBase*& aEsockTest) + : CTe_EsockStepBase(aEsockTest), iSocketSvrName(KNullDesC) + { + SetTestStepName(KQueryMsgInterceptComplete); + } + +TInt CQueryMsgInterceptComplete::ConfigureFromIni() + { + // Read in appropriate fields + if((GetStringFromConfig(iSection, KTe_SocketServName, iSocketSvrName) != 1) + || (iSocketSvrName.Length() == 0)) + { + INFO_PRINTF1(_L("Couldn't find appropriate field in config file")); + return KErrNotFound; + } + + // All ok if we got this far + return KErrNone; + } + +TVerdict CQueryMsgInterceptComplete::doSingleTestStep() + { + // Default to failing + SetTestStepResult(EFail); + + // Look up the socket server being used for esock debug control + RSocketServ* debugSocketServer = iEsockTest->iSockServs.Find(iSocketSvrName); + +//TODO MessageIntercept not operational +#if 0 + if(debugSocketServer) + { + // Build a debug control message and send it to esock + MessageIntercept::TQueryCompleteMsg msg; + TInt result = debugSocketServer->__DbgControl(msg); + + if (result < 0) + { + // If it errored then this step failed + INFO_PRINTF2(_L("Could not reset the ESock message intercept register. Error (%S)."), result); + SetTestStepError(result); + } + else if (result == MessageIntercept::EPassedState) + // Everything ok so we passed + { + SetTestStepResult(EPass); + } + } + else + { + INFO_PRINTF1(_L("Could not find socket server for debug control of esock. Error (%S).")); + } +#endif + return TestStepResult(); + } +