authenticationservices/authenticationserver/test/reftestplugin/tpinplugin/tpinplugintestactive.cpp
changeset 29 ece3df019add
child 33 cf642210ecb7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/authenticationservices/authenticationserver/test/reftestplugin/tpinplugin/tpinplugintestactive.cpp	Tue Nov 24 09:06:03 2009 +0200
@@ -0,0 +1,1105 @@
+/*
+* 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 the License "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 "tpinpluginteststep.h"
+#include <authserver/authplugininterface.h>
+#include <test/testexecutelog.h>
+#include <ecom/ecom.h>
+#include <ecom/implementationinformation.h>
+#include <s32file.h>
+#include <authserver/auth_srv_errs.h>
+#include <authserver/authpatchdata.h>
+#include <u32hal.h> 
+using namespace AuthServer;
+
+_LIT(KTrainSuccess,   	"TrainingSuccess");
+_LIT(KReTrainSuccess, 	"ReTrainingSuccess");
+_LIT(KIdentifySuccess,	"IdentifySuccess");
+_LIT(KIdentifyFailure,  "IdentifyFailure");
+
+_LIT(KSuccess,   	"Success");
+_LIT(KFailure,   	"Failure");
+_LIT(KDialogCancel, "Cancel");
+_LIT(KDialogQuit, 	"Quit");
+_LIT(KServerCancel, "ServerCancel");
+
+_LIT(KInputFile, 	"C:\\t_pinplugindlg_in.dat");
+_LIT(KOutputFile, 	"C:\\t_pinplugindlg_out.dat");
+
+const TPluginId KPinPluginImplementationUid = 0x200032E5;
+const TUint32 KEntropy = 10000;
+const TUint32 KFalsePositiveRate = 0;
+const TUint32 KFalseNegativeRate = 0;
+const TBool KActive = ETrue;
+const TAuthPluginType KPluginType = EAuthKnowledge;
+
+_LIT(KPluginName, "PinPlugin");
+_LIT(KPluginDesc, "Pinplugin authenticates device holder using PIN numbers generated from 0-9 digits");
+
+TInt CPinPluginTestActive::KAuthenticationServerStackSize=0x2000;
+TInt CPinPluginTestActive::KAuthenticationServerInitHeapSize=0x1000;
+TInt CPinPluginTestActive::KAuthenticationServerMaxHeapSize=0x1000000;
+
+CPinPluginTestActive* CPinPluginTestActive::NewL(CTestExecuteLogger& aLogger, AuthServer::TIdentityId& aIdentityId, TPtrC& aPinProcessType, CPinPluginTestStep &aTestStep)
+	{
+	CPinPluginTestActive* pinPlugin = new (ELeave) CPinPluginTestActive(aLogger, aIdentityId, aPinProcessType, aTestStep);
+	pinPlugin->ContructL();
+	return pinPlugin;
+	}
+
+void CPinPluginTestActive::ContructL()
+	{
+	User::LeaveIfError(iFs.Connect());
+	}
+
+CPinPluginTestActive::CPinPluginTestActive(CTestExecuteLogger& aLogger, TIdentityId& aIdentityId,TPtrC& aPinProcessType, CPinPluginTestStep &aTestStep) 
+	:CActive(EPriorityStandard), 
+	iLogger(aLogger), 
+	iOperation(EPinPluginInfo),
+	iIdentityId(aIdentityId),
+	iPinProcessType(aPinProcessType),
+    iTestStep(aTestStep)
+	{
+	CActiveScheduler::Add( this );
+	}
+
+CPinPluginTestActive::~CPinPluginTestActive()
+	{
+	Cancel();
+	iFs.Close();
+	if (iPinPlugin)
+		{
+		REComSession::DestroyedImplementation(iDtor_ID_Key);
+		delete iPinPlugin;
+		}
+	REComSession::FinalClose();
+	}
+
+	
+void CPinPluginTestActive::RunL()
+	{
+        iTestStep.SetTestStepError(iStatus.Int()); 
+    	CActiveScheduler::Stop();
+	return;
+	}
+	
+TVerdict CPinPluginTestActive::DoTestPropertyL()
+	{
+	TBool res = ETrue; 
+
+__UHEAP_MARK;		// Check for memory leaks
+		
+	iPinPlugin = LoadPluginL();
+	if (iPinPlugin != NULL)
+		{
+		if(iPinPlugin->Id() != KPinPluginImplementationUid)
+			res = EFalse;
+		if(iPinPlugin->Name().CompareF(KPluginName) != 0)
+			res = EFalse;
+		if(iPinPlugin->Description().CompareF(KPluginDesc) != 0)
+			res = EFalse;
+		if(iPinPlugin->Type() != KPluginType)
+			res = EFalse;
+		if(iPinPlugin->MinEntropy() != KEntropy)
+			res = EFalse;
+		if(iPinPlugin->FalsePositiveRate() != KFalsePositiveRate)
+			res = EFalse;
+		if(iPinPlugin->FalseNegativeRate() != KFalseNegativeRate)
+			res = EFalse;
+		if(iPinPlugin->IsActive() != KActive)
+			res = EFalse;
+
+		INFO_PRINTF2(_L("ID			 : 0x%x"), iPinPlugin->Id());
+	    INFO_PRINTF2(_L("Name		 : %S"), &iPinPlugin->Name());
+	    INFO_PRINTF2(_L("Description	 : %S"), &iPinPlugin->Description());
+	    INFO_PRINTF2(_L("MinEntropy		 : %d"), iPinPlugin->MinEntropy());
+	    INFO_PRINTF2(_L("False Positive Rate : %d"), iPinPlugin->FalsePositiveRate());
+	    INFO_PRINTF2(_L("False Negative Rate : %d"), iPinPlugin->FalseNegativeRate());
+	    _LIT(KETrue, "ETrue");
+		_LIT(KEFalse, "EFalse");
+	    INFO_PRINTF2(_L("IsActive   	 : %S"), iPinPlugin->IsActive() ? &KETrue : &KEFalse);
+	    switch(iPinPlugin->Type())
+	    	{
+	    	case EAuthDefault:
+	    		INFO_PRINTF1(_L("Type       	 : EAuthDefault"));
+	    		break;
+	    	case EAuthBiometric:
+	    		INFO_PRINTF1(_L("Type       	 : EAuthBiometric"));
+	    		break;
+	    	case EAuthKnowledge:
+	    		INFO_PRINTF1(_L("Type       	 : EAuthKnowledge"));
+	    		break;
+	    	case EAuthToken:
+	    		INFO_PRINTF1(_L("Type       	 : EAuthToken"));
+	    		break;
+	    	case EAuthPerformance:
+	    		INFO_PRINTF1(_L("Type       	 : EAuthPerformance"));
+	    		break;
+	    	default:
+	    		INFO_PRINTF1(_L("Invalid Type"));
+	    	}
+		}
+	else
+		{
+		iLogInfo.Copy( _L("Cannot Load PinPlugin") );
+		return EFail;
+		}
+	UnLoadPlugin();
+	
+__UHEAP_MARKEND;
+
+	if (!res)
+		{
+		INFO_PRINTF1(_L("PinPlugin returns Unexpected Values"));
+		return EFail;
+		}
+	return EPass;
+	}
+
+TVerdict CPinPluginTestActive::DoTestDefaultDataL()
+	{
+	TBool res = ETrue;
+	
+__UHEAP_MARK;		// Check for memory leaks
+		
+	iPinPlugin = LoadPluginL();
+	if (iPinPlugin != NULL)
+		{
+		HBufC8* result = NULL;
+		TInt err = iPinPlugin->DefaultData(iIdentityId, result);
+		if(result != NULL)
+			{
+			delete result;
+			}
+		if (err != KErrNone)
+			{
+			if (err == KErrNoMemory)
+				{
+				User::Leave(err);
+				}
+			res = EFalse;
+			INFO_PRINTF3(_L("Err :%d while receiving the default data for the identity : %d"), err, iIdentityId);
+			}
+		else
+			{
+			_LIT(KPinValue, "11111");
+			iPinValue.Copy(KPinValue);
+			INFO_PRINTF2(_L("Requesting Identify the Identity : %d with the default pin"), iIdentityId);
+			TIdentityId identityId = iIdentityId;
+			PreferDialogInputL(KIdentifySuccess, EPinPluginIdentify, 1);
+			res = DoIdentifyL(result);
+			if(result != NULL)
+				{
+				INFO_PRINTF2(_L("The Identity : %d is Successfully identified"), iIdentityId);
+				delete result;
+				}
+			else
+				{
+				INFO_PRINTF2(_L("IdentityId : %d is not identified"), identityId);
+				}
+			}
+		}
+	else
+		{
+		iLogInfo.Copy( _L("Cannot Load PinPlugin") );
+		return EFail;
+		}
+	UnLoadPlugin();
+	
+__UHEAP_MARKEND;
+
+	return ReturnResultL(res);
+	}
+
+TVerdict CPinPluginTestActive::DoTestIdentifyL()
+	{ 
+	if(!ReadDetailsFromIni(iTestStep))
+		{
+		return EFail;
+		}
+	PreferDialogInputL(iExpectedOutput, EPinPluginIdentify, iDialogNumber);
+	TBool res = ETrue;
+
+__UHEAP_MARK;		// Check for memory leaks
+		
+	TIdentityId identityId = iIdentityId;
+	iPinPlugin = LoadPluginL();
+	if (iPinPlugin != NULL)
+		{
+		HBufC8* result = NULL;
+		INFO_PRINTF2(_L("Requesting Identify the Identity : %d"), iIdentityId);
+		res = DoIdentifyL(result);
+		if(result != NULL)
+			{
+			INFO_PRINTF2(_L("The Identity : %d is Successfully identified"), iIdentityId);
+			delete result;
+			}
+		else
+			{
+			INFO_PRINTF2(_L("IdentityId : %d is not identified"), identityId);
+			}
+		}
+	else
+		{
+		iLogInfo.Copy( _L("Cannot Load PinPlugin") );
+		return EFail;
+		}
+	UnLoadPlugin();
+__UHEAP_MARKEND;
+	
+	return ReturnResultL(res);
+	}
+	
+TVerdict CPinPluginTestActive::DoTestTrainL()
+	{
+	if(!ReadDetailsFromIni(iTestStep))
+		{
+		return EFail;
+		}
+	PreferDialogInputL(iExpectedOutput, EPinPluginTraining, iDialogNumber);
+	TBool res = ETrue;
+	
+__UHEAP_MARK;		// Check for memory leaks
+		
+	iPinPlugin = LoadPluginL();
+	if (iPinPlugin != NULL)
+		{
+		INFO_PRINTF2(_L("Requesting Train the Identity : %d"), iIdentityId);
+		res = TrainIdentifyL();
+		}
+	else
+		{
+		iLogInfo.Copy( _L("Cannot Load PinPlugin") );
+		return EFail;
+		}
+	UnLoadPlugin();
+	
+__UHEAP_MARKEND;
+	
+	return ReturnResultL(res);
+	}
+
+TVerdict CPinPluginTestActive::DoTestForgetL()
+	{
+	if(!ReadDetailsFromIni(iTestStep))
+		{
+		return EFail;
+		}
+
+	TBool res = ETrue;
+
+__UHEAP_MARK;		// Check for memory leaks
+		
+	iPinPlugin = LoadPluginL();
+	if (iPinPlugin != NULL)
+		{
+		ForgetIdentifyL();
+		}
+	else
+		{
+		iLogInfo.Copy( _L("Cannot Load PinPlugin") );
+		return EFail;
+		}
+	UnLoadPlugin();
+__UHEAP_MARKEND;
+
+	return ReturnResultL(res);
+	}
+
+void CPinPluginTestActive::DoCancel() 
+	{ 
+	iPinPlugin->Cancel();
+	}
+
+TVerdict CPinPluginTestActive::DoTestReTrainL()
+	{
+	if(!ReadDetailsFromIni(iTestStep))
+		{
+		return EFail;
+		}
+
+	TInt dialogno = iDialogNumber;
+	TBool DialogCancel = EFalse;
+	if (iExpectedOutput.CompareF(KDialogCancel) == 0
+		|| iExpectedOutput.CompareF(KDialogQuit) == 0)
+		{
+		DialogCancel = ETrue;
+		}
+	PreferDialogInputL(KTrainSuccess, EPinPluginTraining, 1);
+	TBool res = ETrue;
+
+__UHEAP_MARK;		// Check for memory leaks
+	TIdentityId identityId = iIdentityId;
+	iPinPlugin = LoadPluginL();
+	if (iPinPlugin != NULL)
+		{
+		INFO_PRINTF2(_L("Requesting Train the Identity : %d"), iIdentityId);
+		res = TrainIdentifyL();
+		if (res)
+			{
+			iTempPinValue.Copy(iPinValue);
+			if (DialogCancel)
+				{
+				PreferDialogInputL(KDialogCancel, EPinPluginTraining, dialogno);
+				}
+			else
+				{
+				PreferDialogInputL(KReTrainSuccess, EPinPluginTraining, dialogno);		
+				}
+			INFO_PRINTF2(_L("Requesting ReTrain the Identity : %d"), iIdentityId);
+			res = TrainIdentifyL();
+			if (res)
+				{
+				iPinValue.Copy(iTempPinValue);
+				iIdentityId = identityId;
+				if (DialogCancel)
+					{
+					PreferDialogInputL(KIdentifySuccess, EPinPluginIdentify, dialogno);	
+					}
+				else
+					{
+					PreferDialogInputL(KIdentifyFailure, EPinPluginIdentify, 3);		
+					}		
+				HBufC8* result = NULL;
+				HBufC* pinVal = HBufC::NewLC(iPinValue.Length());
+			   	pinVal->Des().Copy(iPinValue);
+				INFO_PRINTF3(_L("Requesting Identify the Identity : %d with the pin : %S"), iIdentityId, pinVal);
+				CleanupStack::PopAndDestroy(pinVal);
+				res = DoIdentifyL(result);
+				if(result != NULL)
+					{
+					INFO_PRINTF2(_L("The Identity : %d is Successfully identified"), iIdentityId);
+					delete result;
+					}
+				else
+					{
+					INFO_PRINTF2(_L("IdentityId : %d is not identified"), identityId);
+					}
+				}
+			}
+		}
+	else
+		{
+		iLogInfo.Copy( _L("Cannot Load PinPlugin") );
+		return EFail;
+		}
+	UnLoadPlugin();
+__UHEAP_MARKEND;
+	
+	return ReturnResultL(res);
+	}
+	
+TVerdict CPinPluginTestActive::DoTestServerCancelL()
+	{
+	if(!ReadDetailsFromIni(iTestStep))
+		{
+		return EFail;
+		}
+	PreferDialogInputL(iExpectedOutput, EPinPluginTraining, 1);
+	
+	TBool res = ETrue;
+	
+__UHEAP_MARK;		// Check for memory leaks
+	TIdentityId identityId = iIdentityId;
+	iPinPlugin = LoadPluginL();
+	if (iPinPlugin != NULL)
+		{
+		if (iPinProcessType.CompareF(KReTrainServerCancel) == 0)
+			{
+			INFO_PRINTF2(_L("Requesting Train the Identity : %d"), iIdentityId);
+			res = TrainIdentifyL();
+			}
+		HBufC8* result = NULL;
+		if (iPinProcessType.CompareF(KTrainServerCancel) == 0
+			|| iPinProcessType.CompareF(KReTrainServerCancel) == 0)
+			{
+			iTempPinValue.Copy(iPinValue);
+			INFO_PRINTF2(_L("Requesting Train the Identity : %d"), iIdentityId);
+			iPinPlugin->Train(iIdentityId, result, iStatus);
+			SetActive();
+			}
+		else if (iPinProcessType.CompareF(KIdentifyServerCancel) == 0)
+			{
+			INFO_PRINTF2(_L("Identify the Identity : %d"), iIdentityId);
+			iPinPlugin->Identify(iIdentityId, KNullDesC(), result, iStatus);
+			SetActive();
+			}
+
+		INFO_PRINTF1(_L("Cancel the process from the Authentication Server"));
+
+		Cancel();
+		
+		if(iStatus.Int() != -3)
+			{
+			res = EFalse;
+			}
+		if (res && iPinProcessType.CompareF(KIdentifyServerCancel) != 0)
+			{
+			iIdentityId = identityId;
+			if (iPinProcessType.CompareF(KTrainServerCancel) == 0)
+				{
+				_LIT(KPinValue, "123456");
+				iPinValue.Copy(KPinValue);
+				PreferDialogInputL(KIdentifyFailure, EPinPluginIdentify, 3);	
+				}
+			else
+				{
+				iPinValue.Copy(iTempPinValue);
+				PreferDialogInputL(KIdentifySuccess, EPinPluginIdentify, 1);		
+				}		
+			HBufC8* result = NULL;
+			HBufC* pinVal = HBufC::NewLC(iPinValue.Length());
+		   	pinVal->Des().Copy(iPinValue);
+			INFO_PRINTF3(_L("Requesting Identify the Identity : %d with the pin : %S"), iIdentityId, pinVal);
+			CleanupStack::PopAndDestroy(pinVal);
+			res = DoIdentifyL(result);
+			if(result != NULL)
+				{
+				INFO_PRINTF2(_L("The Identity : %d is Successfully identified"), iIdentityId);
+				delete result;
+				}
+			else
+				{
+				INFO_PRINTF2(_L("IdentityId : %d is not identified"), identityId);
+				}
+			}
+		}
+	else
+		{
+		iLogInfo.Copy( _L("Cannot Load PinPlugin") );
+		return EFail;
+		}
+	UnLoadPlugin();
+
+__UHEAP_MARKEND;
+	
+	return ReturnResultL(res);
+	}
+	
+TVerdict CPinPluginTestActive::DoTestSequenceL()
+	{
+	PreferDialogInputL(KTrainSuccess, EPinPluginTraining, 1);
+	
+	TBool res = ETrue;
+	
+__UHEAP_MARK;		// Check for memory leaks
+		
+	iPinPlugin = LoadPluginL();
+	if (iPinPlugin != NULL)
+		{
+		INFO_PRINTF2(_L("Requesting Train the Identity : %d"), iIdentityId);
+		res = TrainIdentifyL();
+		if (res)
+			{
+			PreferDialogInputL(KReTrainSuccess, EPinPluginTraining, 1);
+			INFO_PRINTF2(_L("Requesting ReTrain the Identity : %d"), iIdentityId);
+			HBufC8* result = NULL;
+			res = DoTrainL(result);
+			if (result != NULL)
+				{
+				delete result;
+				}
+			if (res)
+				{
+				TIdentityId id = iIdentityId;
+				res = ForgetIdentifyL();
+				if(res)
+					{
+					for (TInt i = 0; i <= 2; i++)
+						{
+						iIdentityId = id;
+						INFO_PRINTF2(_L("Requesting Train the Identity : %d"), iIdentityId);
+						if (i==2)
+							{
+							PreferDialogInputL(KTrainSuccess, EPinPluginTraining, 1);
+							}
+						else
+							{
+							iInfoMsg = EPinPluginTrainingSuccess;
+							PreferDialogInputL(KDialogCancel, EPinPluginTraining, 1);
+							}
+						res = TrainIdentifyL();
+						if (!res)
+							{
+							break;
+							}
+						}
+					}
+				}
+			}
+		}
+	else
+		{
+		iLogInfo.Copy( _L("Cannot Load PinPlugin") );
+		return EFail;
+		}
+	UnLoadPlugin();
+
+__UHEAP_MARKEND;
+	
+	return ReturnResultL(res);
+	}
+	
+TVerdict CPinPluginTestActive::DoTestOomL()
+	{
+ 	if(!iTestStep.GetIntFromConfig(iTestStep.ConfigSection(), _L("oomtest"), iOomTest))
+   		{
+   		INFO_PRINTF1(_L("Test about which function is needed"));
+   		return EFail;
+   		}
+	__UHEAP_MARK;
+		TIdentityId id = 1234;
+		HBufC8* result = NULL;
+	switch(iOomTest)
+		{
+		case 1:
+			{
+			iPinPlugin = LoadPluginL();
+			UnLoadPlugin();
+			}
+			break;
+		case 2:
+			{
+			iPinPlugin = LoadPluginL();
+			TInt err = iPinPlugin->DefaultData(id, result);
+			CleanupStack::PushL(result);
+			if (err == KErrNoMemory)
+				{
+				User::Leave(err);
+				}
+			err = iPinPlugin->Forget(id);
+			if (err == KErrNoMemory)
+				{
+				User::Leave(err);
+				}
+			CleanupStack::PopAndDestroy(result);
+			UnLoadPlugin();
+			}
+			break;
+		case 3:
+			{
+			iPinPlugin = LoadPluginL();
+			iStatus = KRequestPending;
+			_LIT(KPinValue, "11111");
+			iPinValue.Copy(KPinValue);
+			PreferDialogInputL(KIdentifySuccess, EPinPluginIdentify, 1);
+			iPinPlugin->Identify(id, KNullDesC(), result, iStatus);
+			CleanupStack::PushL(result);
+			SetActive();
+			CActiveScheduler::Start();
+			CleanupStack::PopAndDestroy(result);
+			UnLoadPlugin();
+			}
+			break;
+		case 4:
+			{
+			iPinPlugin = LoadPluginL();
+			iStatus = KRequestPending;
+			PreferDialogInputL(KTrainSuccess, EPinPluginTraining, 1);
+			iPinPlugin->Train(id, result, iStatus);
+			SetActive();
+			CActiveScheduler::Start();
+			if (result != NULL)
+				{
+				delete result;
+				}
+			TInt err = iPinPlugin->Forget(id);
+			if (err == KErrNoMemory)
+				{
+				User::Leave(err);
+				}
+			UnLoadPlugin();
+			}
+			break;
+		case 5:
+			{
+			iPinPlugin = LoadPluginL();
+			iStatus = KRequestPending;
+			PreferDialogInputL(KTrainSuccess, EPinPluginTraining, 1);
+			iPinPlugin->Train(id, result, iStatus);
+			SetActive();
+			CActiveScheduler::Start();
+			if (result != NULL)
+				{
+				delete result;
+				}
+			UnLoadPlugin();
+			}
+			break;
+		case 6:
+			{
+			iPinPlugin = LoadPluginL();
+			TInt err = iPinPlugin->Forget(id);
+			if (err == KErrNoMemory)
+				{
+				User::Leave(err);
+				}
+			UnLoadPlugin();
+			}
+			break;
+		}
+
+	__UHEAP_MARKEND;
+ 	return EPass;
+	}
+
+CPinPlugin* CPinPluginTestActive::LoadPluginL()
+	{
+	 TEComResolverParams resolverParams;
+	  TBufC8<16> pluginIdTxt;
+	  
+	  pluginIdTxt.Des().Format(_L8("%x"), KPinPluginImplementationUid);
+	  pluginIdTxt.Des().UpperCase();
+	  resolverParams.SetDataType(pluginIdTxt);
+	  
+	  //To load plugins from sources other than ROM the patch 
+	  // data KEnablePostMarketAuthenticationPlugins must be set to True.
+	  TUint32 enablePostMarketPlugin = KEnablePostMarketAuthenticationPlugins;
+
+	#ifdef __WINS__
+
+	  // Default SymbianOS behavior is to only load auth plugins from ROM.
+	  enablePostMarketPlugin = 0;
+
+	  // For the emulator allow the constant to be patched via epoc.ini
+	  UserSvr::HalFunction(EHalGroupEmulator, EEmulatorHalIntProperty,
+	  (TAny*)"KEnablePostMarketAuthenticationPlugins", &enablePostMarketPlugin); // read emulator property (if present)
+
+	#endif
+
+	  TAny* plugin = 0;
+	  TInt err = 0;
+	  
+	  if(enablePostMarketPlugin == 0) 
+	  	{
+	  	TRAP(err, plugin = 
+		REComSession::CreateImplementationL(KCAuthPluginInterfaceUid,
+											iDtor_ID_Key,
+											resolverParams,
+											KRomOnlyResolverUid));
+	  	}
+	  
+	  else
+	  	{
+	  	TRAP(err, plugin = 
+		REComSession::CreateImplementationL(KCAuthPluginInterfaceUid,
+											iDtor_ID_Key,
+											resolverParams));
+	  	}
+	  
+	 if (err == KErrNotFound)
+	    {
+	    err = KErrAuthServNoSuchPlugin;  
+	    }
+	  User::LeaveIfError(err);
+	    
+	  return reinterpret_cast<CPinPlugin*>(plugin);
+	
+	}
+
+void CPinPluginTestActive::UnLoadPlugin()
+	{
+	delete iPinPlugin;
+	iPinPlugin = NULL;
+	REComSession::DestroyedImplementation(iDtor_ID_Key);
+	REComSession::FinalClose();
+	}
+	
+TVerdict CPinPluginTestActive::ReturnResultL(TBool aRes)
+	{
+	TVerdict result = EPass;
+	DeleteFileL();
+	if (!aRes)
+		{
+		result = EFail;
+		}
+	return result;
+	}
+	
+TBool CPinPluginTestActive::TrainIdentifyL()
+	{
+	TBool res = ETrue;
+
+	HBufC8* result = NULL;
+	res = DoTrainL(result);
+	if (res)
+		{
+		HBufC* pinVal = HBufC::NewLC(iPinValue.Length());
+	   	pinVal->Des().Copy(iPinValue);
+		INFO_PRINTF3(_L("Identify the Identity : %d using pin : %S"), iIdentityId, pinVal);
+		HBufC8* result1 = NULL;
+		TIdentityId identityId = iIdentityId;
+		res = DoIdentifyL(result1);
+		if(res && result1 != NULL)
+			{
+			if (result->Des().CompareF(result1->Des()) != 0)
+				{
+				INFO_PRINTF1( _L("Trained result is different from identification result"));
+				res = EFalse;
+				}
+			else
+				{
+				INFO_PRINTF3(_L("The Identity : %d is Successfully identified with pin : %S"), iIdentityId, pinVal);
+				}
+			delete result1;
+			}
+		else
+			{
+			INFO_PRINTF2(_L("The Identity %d is not trained"), identityId);
+			}
+		CleanupStack::PopAndDestroy(pinVal);
+		}
+	if(result != NULL)
+		{
+		delete result;
+		}
+		
+	return res;
+	}
+
+TBool CPinPluginTestActive::ForgetIdentifyL()
+	{
+	INFO_PRINTF2(_L("Requesting Forget the Identity : %d"), iIdentityId);
+	TInt err = iPinPlugin->Forget(iIdentityId);
+	
+	TBool res = CheckResultL(err);
+	if (res)
+		{
+		INFO_PRINTF2(_L("IdentityId :%d is successfully removed"), iIdentityId);
+		INFO_PRINTF1(_L("Verify using Identify Process"));	
+		HBufC8* result = NULL;
+		res = DoIdentifyL(result);
+		if(res && result != NULL)
+			{
+			INFO_PRINTF2(_L("The Identity : %d is Successfully identified"), iIdentityId);
+			delete result;
+			}
+		}
+	return res;	
+	}
+	
+TBool CPinPluginTestActive::DoTrainL(HBufC8*& aResult)
+	{
+	TBool res = ETrue;
+	iStatus = KRequestPending;
+	
+	iPinPlugin->Train(iIdentityId, aResult, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+		
+	res = VerifyResultL(iStatus.Int());
+	return res;
+	}
+	
+TBool CPinPluginTestActive::DoIdentifyL(HBufC8*& aResult)
+	{
+	TBool res = ETrue;
+		
+	iPinPlugin->Identify(iIdentityId, KNullDesC(), aResult, iStatus);
+	if(!IsActive())
+		SetActive();
+	CActiveScheduler::Start();
+	
+	res = VerifyResultL(iStatus.Int());
+	return res;
+	}
+	
+TBool CPinPluginTestActive::VerifyResultL(TInt aOutputVal)
+	{
+	TBool result = ETrue;
+	
+	if ((iExpectedOutput.CompareF(KDialogCancel) == 0)
+		&& (aOutputVal != KErrAuthServPluginCancelled))
+		{
+		INFO_PRINTF1(_L("RequestStatus is not completed with expected result"));
+		result = EFalse;
+		}
+	else if ((iExpectedOutput.CompareF(KDialogQuit) == 0)
+		&& (aOutputVal != KErrAuthServPluginQuit))
+		{
+		INFO_PRINTF1(_L("RequestStatus is not completed with expected result"));
+		result = EFalse;
+		}
+	else if ((iExpectedOutput.CompareF(KTrainSuccess) == 0)
+		&& (aOutputVal == KErrAuthServRegistrationFailed))
+		{
+		INFO_PRINTF2(_L("Authserver registration failed. Returned error code = %d"), aOutputVal);
+		result = EFalse;
+		}	
+	else if ((iExpectedOutput.CompareF(KDialogCancel) != 0)
+			&& (iExpectedOutput.CompareF(KDialogQuit) != 0)
+			&& (iExpectedOutput.CompareF(KServerCancel) != 0)
+			&& (aOutputVal != KErrNone))
+		{
+		INFO_PRINTF1(_L("RequestStatus is not completed with expected result"));
+		result = EFalse;
+		}
+	if (result && aOutputVal == KErrNone)
+		{
+		TInt dialogNumber;
+		TPinValue pinValue;
+		TPinPluginInfoMessage displayedMsg;
+		ReadOutputDetailsL(dialogNumber, pinValue, displayedMsg);
+		TPtrC message;
+		switch(displayedMsg)
+	    	{
+	    	case EPinPluginTrainingSuccess:
+	    		message.Set(_L("EPinPluginTrainingSuccess"));
+	    		break;
+	    	case EPinPluginReTrainingSuccess:
+	    		message.Set(_L("EPinPluginReTrainingSuccess"));
+	    		break;
+	    	case EPinPluginIdentificationSuccess:
+	    		message.Set(_L("EPinPluginIdentificationSuccess"));	  
+	    		break;
+	    	case EPinPluginIdentificationFailure:
+	    		message.Set(_L("EPinPluginIdentificationFailure"));
+	    		break;
+	    	}
+		if(displayedMsg != iInfoMsg)
+			{
+			INFO_PRINTF2(_L("INFO :%S which is not expected"), &message);
+			result = EFalse;
+			}
+		if (iCmdResult == EOk && dialogNumber != iDialogNumber)
+			{
+			INFO_PRINTF3(_L("Number of dialog displayed : %d differ from expected dialog: %d."), dialogNumber,iDialogNumber);
+			result = EFalse;
+			}
+		if (displayedMsg == EPinPluginIdentificationFailure
+			&& dialogNumber == 0)
+			{
+			INFO_PRINTF2(_L("INFO :%S because IdentityId is not available in the DB"), &message);
+			}
+		if (displayedMsg == EPinPluginIdentificationFailure
+			&& dialogNumber == 3)
+			{
+			INFO_PRINTF2(_L("INFO :%S because wrong pin input for all retries and IdentityId exists in the DB"), &message);
+			}
+		if (displayedMsg == EPinPluginIdentificationFailure
+			&& iIdentityId != KUnknownIdentity)
+			{
+			INFO_PRINTF2(_L("IdentityId was not reset for %S"), &message);
+			}
+		if (displayedMsg != EPinPluginIdentificationSuccess
+			&& displayedMsg != EPinPluginIdentificationFailure)
+			{
+			iPinValue.Copy(pinValue);
+			if (iInfoMsg == EPinPluginTrainingSuccess 
+				|| iInfoMsg == EPinPluginReTrainingSuccess)
+				{
+				HBufC* pinVal = HBufC::NewLC(pinValue.Length());
+			   	pinVal->Des().Copy(pinValue);
+				INFO_PRINTF3(_L("The Identity %d is trained with pin number %S"), iIdentityId, pinVal);
+				CleanupStack::PopAndDestroy(pinVal);
+				PreferDialogInputL(KIdentifySuccess, EPinPluginIdentify, 1);
+				}
+			else
+				{
+				PreferDialogInputL(KIdentifyFailure, EPinPluginIdentify, 0);
+				}
+			}
+		}
+	if(aOutputVal != KErrNone)
+		{
+		if (aOutputVal == KErrAuthServPluginCancelled)
+			{
+			INFO_PRINTF1(_L("Cancel the process from the Dialog Notifier"));	
+			}
+		else if (aOutputVal == KErrAuthServPluginQuit)
+			{
+			INFO_PRINTF1(_L("Quit the process from the Dialog Notifier"));	
+			}
+		CheckResultL(aOutputVal);
+		}
+	return result;
+	}
+	
+TBool CPinPluginTestActive::CheckResultL(TInt aResult)
+	{
+	_LIT(KPinValue, "123456");
+	if (iExpectedOutput.CompareF(KSuccess) == 0
+		&& aResult == KErrAuthServNoSuchIdentity)
+		{
+		INFO_PRINTF2(_L("IdentityId : %d is not identified when should be"), iIdentityId);
+		return EFalse;
+		}
+	else if(iExpectedOutput.CompareF(KFailure) == 0
+		&& aResult == KErrNone)
+		{
+		INFO_PRINTF2(_L(" IdentityId : %d is identified when should not be"), iIdentityId);
+		return EFalse;
+		}
+	iPinValue.Copy(KPinValue);
+	PreferDialogInputL(KIdentifyFailure, EPinPluginIdentify, 3);
+	return ETrue;
+	}
+	
+TBool CPinPluginTestActive::ReadDetailsFromIni(CPinPluginTestStep& aStep)
+	{
+	TPtrC pinVal;
+	if(!aStep.GetStringFromConfig(aStep.ConfigSection(), _L("expectedoutput"), iExpectedOutput))
+		{
+		INFO_PRINTF1(_L("expectedoutput value is missing"));
+		return EFalse;
+		}
+	// Optional input, if the input is not available by default the iIndex is set to 0.
+	if(!aStep.GetIntFromConfig(aStep.ConfigSection(), _L("selectindex"), iIndex))
+		{
+		iIndex = 0;
+		}
+	// optional input, if not pinplugin use the default pinlength from the config file.
+	aStep.GetIntFromConfig(aStep.ConfigSection(), _L("newpinlength"), iNewPinLength);
+
+	// optional input, 
+	aStep.GetStringFromConfig(aStep.ConfigSection(), _L("pinvalue"), pinVal);
+	iPinValue.Copy(pinVal);
+
+	// Optional input, if the input is not available by default the resultant output cmd will given
+	// in the dialog No 1.
+	if(!aStep.GetIntFromConfig(aStep.ConfigSection(), _L("outputatdialog"), iDialogNumber))
+		{
+		if (iExpectedOutput.CompareF(KIdentifyFailure) == 0)
+			{
+			iDialogNumber = 3;
+			}
+		else
+			{
+			iDialogNumber = 1;
+			}
+		}
+	return ETrue;
+	}
+	
+void CPinPluginTestActive::PreferDialogInputL(const TDesC& aExpectedOutput,
+			TPinPluginDialogOperation aOp, TInt aDialogNo)
+	{
+	// iPinValue, iIndex, iNewPinLength is not changing for every operation. if
+	// any changes occurs , we have to reset just before calling this function.
+	iOperation = aOp;
+	iDialogNumber = aDialogNo;
+	iExpectedOutput.Set(aExpectedOutput);
+		
+	if (aExpectedOutput.CompareF(KTrainSuccess) == 0)
+		{
+		iInfoMsg = EPinPluginTrainingSuccess;
+		}
+	else if (aExpectedOutput.CompareF(KReTrainSuccess) == 0)
+		{
+		iInfoMsg = EPinPluginReTrainingSuccess;
+		}
+	else if (aExpectedOutput.CompareF(KIdentifySuccess) == 0)
+		{
+		iInfoMsg = EPinPluginIdentificationSuccess;
+		}
+	else if (aExpectedOutput.CompareF(KIdentifyFailure) == 0)
+		{
+		iInfoMsg = EPinPluginIdentificationFailure;
+		}
+
+	if (aExpectedOutput.CompareF(KDialogCancel) == 0)
+		{
+		iCmdResult = iCmdFinalResult = ECancel;
+		}
+	else if (aExpectedOutput.CompareF(KDialogQuit) == 0)
+		{
+		iCmdResult = iCmdFinalResult = EQuit;
+		}
+	else 
+		{
+		iCmdResult = iCmdFinalResult = EOk;
+		}
+		
+	if (iDialogNumber > 1 && 
+	   	aExpectedOutput.CompareF(KIdentifyFailure) != 0 &&
+		aExpectedOutput.CompareF(KIdentifySuccess) != 0)
+		{
+		iCmdResult = ENext;
+		}
+	DeleteFileL();
+	WriteOutputDetailsL();
+	}
+	
+void CPinPluginTestActive::WriteOutputDetailsL()
+	{
+	RFileWriteStream stream;
+	TInt err = stream.Create(iFs, KInputFile, EFileWrite | EFileShareExclusive);
+	User::LeaveIfError(err);
+	stream.PushL();
+
+	MStreamBuf* streamBuf = stream.Sink();
+	streamBuf->SeekL(MStreamBuf::EWrite, EStreamEnd);
+	stream.WriteInt32L(iOperation);
+	stream.WriteInt32L(iPinValue.Length());
+	stream.WriteL(iPinValue);
+	stream.WriteInt32L(iIndex);
+	stream.WriteInt32L(iNewPinLength);
+	stream.WriteInt32L(iCmdResult);
+	iOperation = EPinPluginInfo;
+	stream.WriteInt32L(iOperation);
+	stream.WriteInt32L(iCmdFinalResult);
+	stream.WriteInt32L(iDialogNumber);
+	stream.CommitL();
+	CleanupStack::PopAndDestroy(); // stream
+	}
+
+void CPinPluginTestActive::ReadOutputDetailsL(TInt& aDialogNumber, TPinValue& aPinValue, TPinPluginInfoMessage& aDisplayedMsg)
+	{
+	RFileReadStream stream;
+	User::LeaveIfError(stream.Open(iFs, KOutputFile, EFileRead | EFileShareExclusive));
+	stream.PushL();
+
+	MStreamBuf* streamBuf = stream.Source();
+	TPinValue pinvalue;
+	TInt pinValueSize;
+	
+	aDialogNumber = stream.ReadInt32L();
+	
+	pinValueSize = stream.ReadInt32L();
+	HBufC8* pinValueBuf = HBufC8::NewMaxLC(pinValueSize);
+	TPtr8 pinValuePtr(pinValueBuf->Des());
+	stream.ReadL(pinValuePtr, pinValueSize);
+	aPinValue.Copy(pinValuePtr);
+	CleanupStack::PopAndDestroy(1, pinValueBuf);	
+
+	aDisplayedMsg = static_cast<TPinPluginInfoMessage>(stream.ReadInt32L());
+	
+	CleanupStack::PopAndDestroy(&stream); 
+	}
+	
+void CPinPluginTestActive::DeleteFileL()
+	{
+	CFileMan* fileMan = CFileMan::NewL(iFs);
+	CleanupStack::PushL(fileMan);
+	TInt err = fileMan->Delete(KInputFile);
+	if ( err != KErrNotFound && err != KErrNone )
+		{
+		User::LeaveIfError(err);
+		}
+	err = fileMan->Delete(KOutputFile);
+	if (err != KErrNotFound && err != KErrNone )
+		{
+		User::LeaveIfError(err);
+		}
+	CleanupStack::PopAndDestroy(fileMan);	
+	}
+
+
+
+
+