datacommsserver/esockserver/test/TE_EsockTestSteps/src/ESockDebug.TestSteps.cpp
changeset 0 dfb7c4ff071f
--- /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();
+	}
+