--- /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 <comms-infras/esockdebugmessages.h>
+
+#include "SocketServer.TestSteps.h"
+#include "ESockDebug.TestSteps.h"
+
+#include <xml/parser.h>
+#include <xml/xmlparsererrors.h>
+#include "XmlParsing.h"
+#include <elements/sd_mintercept.h>
+
+#include <utf.h>
+
+
+#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<KConfigSubSectionNameMaxLength> 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<KIniDataMaxLength> 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, "<Event>%S</Event>");
+ TBuf8<KIniDataMaxLength> 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<KIniDataMaxLength> 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();
+ }
+