datacommsserver/esockserver/test/TS_MultiHoming/TS_ResolveName.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/TS_MultiHoming/TS_ResolveName.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,255 @@
+// Copyright (c) 2003-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 "TS_MultiHomingStep.h"
+#include "TS_ResolveName.h"
+
+// From ../../networking/inhook6/inc/dnd_err.h
+const TInt KErrDndNameNotFound = -5120; 
+
+/*       
+ * Resolve a hostname to an address
+ */
+CTS_ResolveName::CTS_ResolveName()
+	{
+	iTestStepName = KResolveName;
+	}
+
+CTS_ResolveName::~CTS_ResolveName()
+	{	
+	}
+
+
+enum TVerdict CTS_ResolveName::doTestStepPreambleL(void)
+/**
+ * Implements OOM testing in each test
+ */
+	{
+	if (!(GetBoolFromConfig(KResolveName, KOomTest, iIsOOMTest)))
+		iIsOOMTest=EFalse;
+	return EPass;
+	}
+
+enum TVerdict CTS_ResolveName::doTestStepL(void)
+/**
+ * Resolve a hostname to address
+ * @return The test step verdict  
+ */
+	{			
+	TInt err = KErrNone;
+	TInt numOfResolvers = 0;
+
+	
+	err = GetIntFromConfig(KResolveName, KNumOfResolvers, numOfResolvers);
+	if ((!err) || (numOfResolvers < 1))
+		{
+		return EInconclusive;
+		}
+
+	RArray<CResolveName*> resolverArray;
+	RArray<TBool> expectResolveToSucceedArray;
+	RArray<TBool> expectResolveToTimeoutArray;
+	RArray<TBool> expectResolveToBeNotReadyArray;
+
+	TInt i;
+	for (i = 0; i < numOfResolvers; i++)
+		{
+				
+		CResolveName* newResolver = CResolveName::NewL();
+			 
+		TConnDetails *theConn;
+		TBool expectSuccess = ETrue;
+		TBool expectTimeout = EFalse; 
+		TBool expectNotReady = EFalse;
+		TBool explicitResolve = EFalse;
+		TInt protocol = KProtocolInetTcp;
+		
+		TName	hostName;  
+		GetResolverConfig(i, hostName, protocol, expectSuccess, expectTimeout, expectNotReady, explicitResolve, &theConn);
+				
+		expectResolveToSucceedArray.Append(expectSuccess);   
+		expectResolveToTimeoutArray.Append(expectTimeout); 
+		expectResolveToBeNotReadyArray.Append(expectNotReady); 
+
+		StepLog(_L("Trying to resolving[%i]: %S"), i, &hostName);			
+		err = newResolver->DoResolution(hostName, theConn, protocol, this, explicitResolve);		
+		if (err == KErrNone)
+			{
+			err = resolverArray.Append(newResolver);
+			if (err != KErrNone)
+				{
+				newResolver->DoCancel();
+				delete newResolver;
+				newResolver = 0;
+				//Log(KELogger,err);		// We can't keep a ref outside the loop...
+				}
+			}
+//		else
+//			Log (KELogger,err);
+		}	// for (i<numOfSockets)
+	
+	CEnhancedScheduler::Start();	// And start them off...
+	
+	// Wait for all to finish / time out.	
+	TInt result(0);
+	for (i = 0; i < resolverArray.Count(); i++)
+		{
+		result = resolverArray[i]->GetResult();
+		StepLog(_L("Resolving %i: returned:%i"), i, result);
+
+		if(result == KErrNotFound  && !expectResolveToSucceedArray[i] 
+			||	result == KErrDndNameNotFound && !expectResolveToSucceedArray[i]
+			||  result == KErrNone && expectResolveToSucceedArray[i] 
+			||  result == KErrNotReady && expectResolveToBeNotReadyArray[i]
+			||  result == KErrTimedOut && expectResolveToTimeoutArray[i] 
+			||  result == KErrDndNameNotFound && expectResolveToTimeoutArray[i] )
+			{
+		
+			}
+		else
+			{
+			// fail all case
+			iTestStepResult = EFail;
+			}
+			
+		
+		delete resolverArray[i];
+		}
+
+	expectResolveToSucceedArray.Close();
+	expectResolveToTimeoutArray.Close();    
+	expectResolveToBeNotReadyArray.Close();    
+	resolverArray.Close();
+	return iTestStepResult;
+
+	}
+
+
+					
+TInt CResolveName::DoResolution(TName aHostName, TConnDetails *aConn, TInt aProtocol, 
+								CTS_ResolveName *aOwnerStep, TBool aExplicitResolve)
+								
+	{
+	TInt err;
+	iResolverHasSS = FALSE;	
+	iHostName.Copy(aHostName.Ptr(), aHostName.Length());
+
+
+	iOwnerStep = aOwnerStep;
+	iTConnection = aConn;
+
+
+	
+	if (aExplicitResolve)		
+		{		
+		err = iResolver.Open(iTConnection->iSocketServ, KAfInet, 
+			aProtocol, iTConnection->iConnection);		
+		}
+	else
+		{						
+		if (iTConnection != 0)
+			// Use the SocketServ session of opened connection 
+			err = iResolver.Open(iTConnection->iSocketServ, KAfInet, aProtocol);			
+		else
+			{
+			// No connection specified to use so create session
+			iResolverHasSS = TRUE;
+			err = iResolverSS.Connect();
+			if(err != KErrNone)
+			    {
+			    return err;
+			    }
+			err = iResolver.Open(iResolverSS, KAfInet, aProtocol);
+			}
+		}
+		
+	if (err != KErrNone)
+		return err;			// No point going any further...
+	
+	iStatus = KRequestPending; 
+
+	// Increment the counter before we start.
+	iOwnerStep->iOwnerSuite->iScheduler->IncCount();
+	SetActive();
+
+	TRequestStatus* pS = &iStatus;
+	User::RequestComplete(pS,KErrNone);
+
+	return KErrNone;
+	}
+
+
+CResolveName::~CResolveName()
+	{
+	//Cancel();	
+	if (iResolverHasSS)
+	    {
+	    iResolver.Close();
+	    iResolverSS.Close();
+	    }
+
+	}
+
+CResolveName* CResolveName::NewL()
+	{
+	
+	CResolveName* self = new(ELeave) CResolveName;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+
+void CResolveName::ConstructL()
+	{
+	CEnhancedScheduler::Add(this);
+	}
+
+void CResolveName::DoCancel()
+	{
+	iResolver.Close();
+	}
+
+void CResolveName::RunL()
+	{
+	
+	switch (iState)
+		{
+		case EResReady:
+			{
+			iResolver.GetByName(iHostName, iResultingName, iStatus);
+			iState = EWaitingForResult;
+			SetActive();
+			}
+			break;
+
+		case EWaitingForResult:
+			{
+				iState = EResComplete;
+				iResolverResult = iStatus.Int();
+				iOwnerStep->iOwnerSuite->iScheduler->DecCount();
+				if(0 == iOwnerStep->iOwnerSuite->iScheduler->GetCount())
+						CEnhancedScheduler::Stop();
+			}		
+			break;
+				
+		default:
+				iOwnerStep->StepLog(KTxtWhatHappened);
+			break;
+		}
+		//iOwnerStep->StepLog(KState, iState, iOwnerStep->iOwnerSuite->iScheduler->GetCount());
+	}
+