/*
* Copyright (c) 2008 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 <e32base.h>
#include <es_sock.h>
#include <comms-infras/eintsock.h>
#include <connpref.h>
#include <f32file.h>

#include "te_serverbaseteststep.h"
#include "es_ptest.h"


CTestServerTestStep::CTestServerTestStep()
	{
	}

CTestServerTestStep::~CTestServerTestStep()
	{
	iESockProxyThread.Close();
	}

enum TVerdict CTestServerTestStep::doTestStepPreambleL( void )
	{
	return EPass;
	}

enum TVerdict CTestServerTestStep::doTestStepL()
	{
	
	TRAPD(trapRet,enum TVerdict stepRet = InternalDoTestStepL();\
		if (stepRet !=EPass)\
			{\
			SetTestStepResult(stepRet);\
			}\
			)
			
			if (trapRet != KErrNone)
				{
				SetTestStepResult(EFail);
				return EFail;
				}
			return EPass;
	};

enum TVerdict CTestServerTestStep::doTestStepPostambleL( void )
	{	
	return EPass;
	}
	
enum TVerdict CTestServerTestStep::InternalDoTestStepL()
	{
	RSocketServ ss1;
	TInt ret;
	ret = ss1.Connect();
	if (ret != KErrNone)
		{
		Logger().WriteFormat(_L("Connect to socket server failed with %S"),&EpocErrorToText(ret));
		}
	CleanupClosePushL(ss1);
	TESTL(ret == KErrNone);
	
	RConnection connection;
	connection.Open(ss1);
	TRequestStatus status;
	
	TPtrC ptr (ConfigSection());		
	if ( ptr.Find ( _L("te_upnp_tcpclient") ) >= 0
			|| ptr.Find ( _L("te_upnp_tcpserver") ) >= 0 )
		{
		TConnSnapPref prefs ( 3 ); // !Note! Link Layer Access Point from upnp cfg.
		connection.Start( prefs, status );	
		}	 
	else
		{
		connection.Start(status);		
		}
	User::WaitForRequest(status);
	RSocket sock1;
	ret = sock1.Open(ss1,KProxyAddrFamily,KSockDatagram, KProxy);
	if (ret != KErrNone)
		{
		Logger().WriteFormat(_L("Opening socket to the Test Internal Socket Protocol failed with %S"),&EpocErrorToText(ret));
		}
	TESTL(ret == KErrNone);
	//Logger().Close();
	TRequestStatus stat;
		
	TProxyProtocolRequest request;
	request.name.Copy(TestStepName());
	
	TPckg<TProxyProtocolRequest> requestPckg(request);
	
	_LIT(PanicStep,"Test21");
	if (TestStepName() == PanicStep)
		{
		doPanicStepTestPreambleL();
		}

	sock1.Ioctl(KProxyProtocolTestRequest,stat,&requestPckg);
	User::WaitForRequest(stat);
	CleanupStack::Pop(&ss1);
	ss1.Close();

	if (TestStepName() == PanicStep)
		{
		doPanicStepTestPostambleL(stat);
		}
	else
		{
		TESTL(stat == KErrNone);
		SetTestStepResult(request.result);
		}
	return TestStepResult();
	}

void CTestServerTestStep::doPanicStepTestPreambleL()
	{
	// Search for *ESock_Proxy* thread
	TFindThread findThread(_L("*ESock_Proxy*"));
	TFullName threadName;
	TESTL(findThread.Next(threadName) == KErrNone);
		
	TESTL(iESockProxyThread.Open(findThread) == KErrNone);

	iESockProxyThread.Logon(iESockProxyThreadStatus);
	}

void CTestServerTestStep::doPanicStepTestPostambleL( TRequestStatus& aStat )
	{
	//ESock is expected to have a panic. The Kernel will therefore return KErrAbort
	TESTL(aStat  == KErrAbort);

	User::WaitForRequest(iESockProxyThreadStatus);

	//Test that ESock_Proxy Paniced
	TESTL(iESockProxyThread.ExitType() == EExitPanic);
	
	// Test that the Panic Category was "InternalSocket"
	_LIT(KInternalSocketPanic, "InternalSocket");
	TESTL(iESockProxyThread.ExitCategory() == KInternalSocketPanic);

	// Test that the Panic Reason was EInternalSocketNotNullSocket (12)
	TESTL(iESockProxyThread.ExitReason() == ENotNullSocket);

	SetTestStepResult(EPass);	
	}
	
// extra logging methods
const TPtrC& CTestServerTestStep::EpocErrorToText(const TInt aErrCode)
/**
Convert a Error code to text.

  @param aError error code to display as text.
  @return Text describing the error.
  */
	{
	//	TPtr errText;
	switch (aErrCode)
		{
		case KErrNone:
			iErrText.Set(_L("KErrNone"));
			break;
		case KErrNotFound:
			iErrText.Set(_L("KErrNotFound"));
			break;
		case KErrGeneral:
			iErrText.Set(_L("KErrGeneral"));
			break;
		case KErrCancel:
			iErrText.Set(_L("KErrCancel"));
			break;
		case KErrNoMemory:
			iErrText.Set(_L("KErrNoMemory"));
			break;
		case KErrNotSupported:
			iErrText.Set(_L("KErrNotSupported"));
			break;
		case KErrArgument:
			iErrText.Set(_L("KErrArgument"));
			break;
		case KErrTotalLossOfPrecision:
			iErrText.Set(_L("KErrTotalLossOfPrecision"));
			break;
		case KErrBadHandle:
			iErrText.Set(_L("KErrBadHandle"));
			break;
		case KErrOverflow:
			iErrText.Set(_L("KErrOverflow"));
			break;
		case KErrUnderflow:
			iErrText.Set(_L("KErrUnderflow"));
			break;
		case KErrAlreadyExists:
			iErrText.Set(_L("KErrAlreadyExists"));
			break;
		case KErrPathNotFound:
			iErrText.Set(_L("KErrPathNotFound"));
			break;
		case KErrDied:
			iErrText.Set(_L("KErrDied"));
			break;
		case KErrInUse:
			iErrText.Set(_L("KErrInUse"));
			break;
		case KErrServerTerminated:
			iErrText.Set(_L("KErrServerTerminated"));
			break;
		case KErrServerBusy:
			iErrText.Set(_L("KErrServerBusy"));
			break;
		case KErrCompletion:
			iErrText.Set(_L("KErrCompletion"));
			break;
		case KErrNotReady:
			iErrText.Set(_L("KErrNotReady"));
			break;
		case KErrUnknown:
			iErrText.Set(_L("KErrUnknown"));
			break;
		case KErrCorrupt:
			iErrText.Set(_L("KErrCorrupt"));
			break;
		case KErrAccessDenied:
			iErrText.Set(_L("KErrAccessDenied"));
			break;
		case KErrLocked:
			iErrText.Set(_L("KErrLocked"));
			break;
		case KErrWrite:
			iErrText.Set(_L("KErrWrite"));
			break;
		case KErrDisMounted:
			iErrText.Set(_L("KErrDisMounted"));
			break;
		case KErrEof:
			iErrText.Set(_L("KErrEof"));
			break;
		case KErrDiskFull:
			iErrText.Set(_L("KErrDiskFull"));
			break;
		case KErrBadDriver:
			iErrText.Set(_L("KErrBadDriver"));
			break;
		case KErrBadName:
			iErrText.Set(_L("KErrBadName"));
			break;
		case KErrCommsLineFail:
			iErrText.Set(_L("KErrCommsLineFail"));
			break;
		case KErrCommsFrame:
			iErrText.Set(_L("KErrCommsFrame"));
			break;
		case KErrCommsOverrun:
			iErrText.Set(_L("KErrCommsOverrun"));
			break;
		case KErrCommsParity:
			iErrText.Set(_L("KErrCommsParity"));
			break;
		case KErrTimedOut:
			iErrText.Set(_L("KErrTimedOut"));
			break;
		case KErrCouldNotConnect:
			iErrText.Set(_L("KErrCouldNotConnect"));
			break;
		case KErrCouldNotDisconnect:
			iErrText.Set(_L("KErrCouldNotDisconnect"));
			break;
		case KErrDisconnected:
			iErrText.Set(_L("KErrDisconnected"));
			break;
		case KErrBadLibraryEntryPoint:
			iErrText.Set(_L("KErrBadLibraryEntryPoint"));
			break;
		case KErrBadDescriptor:
			iErrText.Set(_L("KErrBadDescriptor"));
			break;
		case KErrAbort:
			iErrText.Set(_L("KErrAbort"));
			break;
		case KErrTooBig:
			iErrText.Set(_L("KErrTooBig"));
			break;
		case KRequestPending:
			iErrText.Set(_L("KRequestPending"));
			break;
		default:
			iErrBuff.Format(_L(" %d"),aErrCode);
			iErrText.Set(iErrBuff.Ptr());
			break;
		}
		return iErrText;
	}	

