cryptomgmtlibs/cryptotokenfw/tframework/t_ctframework.cpp
changeset 8 35751d3474b7
parent 0 2c201484c85f
--- a/cryptomgmtlibs/cryptotokenfw/tframework/t_ctframework.cpp	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptomgmtlibs/cryptotokenfw/tframework/t_ctframework.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -1,888 +1,888 @@
-/*
-* Copyright (c) 2001-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 <e32test.h>
-#include <ct.h>
-#include <f32file.h>
-#include "MTestInterface.h"
-#include <ecom/ecom.h>
-
-RTest test(_L("CT Framework Tests"));
-
-
-
-TBool gLogging=ETrue;
-TBool gSilent=EFalse;
-
-const TInt gInterfaceA = 0x101f4e50;
-const TInt gInterfaceB = 0x101f4e51;
-const TInt gInterfaceC = 0x101f4e52;
-
-const TInt gAttribute1 = 0x101f4e4a;
-const TInt gAttribute2 = 0x101f4e4b;
-
-const TInt gImplementation6 = 0x101f4e4c;
-const TInt gImplementation5 = 0x101f4e4d;
-
-class CTestConsole:public CConsoleBase
-
-	{
-	public:
-		static CTestConsole* NewL(CConsoleBase* aCon);
-		TInt Create(const TDesC16& aTitle,TSize aSize) {return iCon->Create(aTitle,aSize);};
-		void Read(TRequestStatus& aStatus) {iCon->Read(aStatus);};
-		void ReadCancel(void) {iCon->ReadCancel();};
-		void Write(const TDesC16& aString);
-		TPoint CursorPos(void) const {return iCon->CursorPos();};
-		void SetCursorPosAbs(const TPoint& aPos) {iCon->SetCursorPosAbs(aPos);};
-		void SetCursorPosRel(const TPoint& aPos) {iCon->SetCursorPosRel(aPos);};
-		void SetCursorHeight(TInt aHeight) {iCon->SetCursorHeight(aHeight);};
-		void SetTitle(const TDesC16& aTitle) {iCon->SetTitle(aTitle);};
-		void ClearScreen(void) {iCon->ClearScreen();};
-		void ClearToEndOfLine(void) {iCon->ClearToEndOfLine();};
-		TSize ScreenSize(void) const {return iCon->ScreenSize();};
-		TKeyCode KeyCode(void) const {return iCon->KeyCode();};
-		TUint KeyModifiers(void) const {return iCon->KeyModifiers();};
-		~CTestConsole(void);
-		void SetLogFile(RFile* aFile);
-	private:
-		CTestConsole(void);
-		CConsoleBase* iCon;
-		RFile* iFile;
-	};
-
-CTestConsole* CTestConsole::NewL(CConsoleBase* aCon)
-
-	{
-	CTestConsole* self;
-	self=new (ELeave) CTestConsole;
-	self->iCon=aCon;
-	self->iFile=NULL;
-	return self;
-	}
-
-CTestConsole::CTestConsole(void):CConsoleBase()
-
-	{
-	}
-
-CTestConsole::~CTestConsole(void)
-
-	{
-	delete iCon;
-	if (iFile)
-		{
-		iFile->Close();
-		}
-	}
-
-void CTestConsole::Write(const TDesC16& aString)
-
-	{
-	if (gSilent)
-		return;
-	iCon->Write(aString);
-	if ((iFile)&&(gLogging))
-		{
-		TUint8 space[200];
-		TPtr8 ptr(space,200);
-		ptr.Copy(aString);
-		iFile->Write(ptr);
-		}
-	}
-
-void CTestConsole::SetLogFile(RFile* aFile)
-
-	{
-	iFile=aFile;
-	}
-
-template <class T> class TTestArray
-	{
-public:
-	TTestArray(T* aArray, TInt aCount);
-	TArray<T> Array();
-private:
-	static TInt Count(const CBase* aThat);
-	static const TAny* Get(const CBase* aThat, TInt aIndex);
-
-	T* iArray;
-	TInt iCount;
-	};
-
-template <class T> TTestArray<T>::TTestArray(T* aArray, TInt aCount)
-		: iArray(aArray), iCount(aCount)
-	{	
-	}
-
-template <class T> TInt TTestArray<T>::Count(const CBase* aThat)
-	{
-	return reinterpret_cast<const TTestArray*>(aThat)->iCount;
-	}
-
-template <class T> const TAny* TTestArray<T>::Get(const CBase* aThat, TInt aIndex)
-	{
-	return &reinterpret_cast<const TTestArray*>(aThat)->iArray[aIndex];
-	}
-
-template <class T> TArray<T> TTestArray<T>::Array()
-	{
-	return TArray<T>(Count, Get, reinterpret_cast<CBase*>(this));
-	}
-
-/** A filter that includes nothing (as a random easy-to-write test filter */
-class TNoTokenTypes : public MCTTokenTypeFilter
-	{
- public:
-	/** Always returns EFalse. */
-	virtual TBool Accept(const CCTTokenTypeInfo& aTokenType) const;
-	};
-
-// Accept everything
-TBool TNoTokenTypes::Accept(const CCTTokenTypeInfo&) const
-	{
-	return EFalse;
-	}
-
-class CStopScheduler : public CActive
-	{
-public:
-	void DoCancel() {};
-	void RunL();
-	CStopScheduler();
-	};
-
-void CStopScheduler::RunL()
-	{
-	CActiveScheduler::Stop();
-	};
-
-CStopScheduler::CStopScheduler()
-		: CActive(EPriorityIdle)
-	{
-	CActiveScheduler::Add(this);
-	SetActive();
-	TRequestStatus* r = &iStatus;
-	User::RequestComplete(r, KErrNone);
-	}
-
-TInt TokenTypeInfoListTestsL()
-	{
-	test.Printf(_L("1.1,Testing getting all token types,"));
-	RCPointerArray<CCTTokenTypeInfo> myTokenTypes;
-	CleanupClosePushL(myTokenTypes);
-
-	CCTTokenTypeInfo::ListL(myTokenTypes);
-
-	if (myTokenTypes.Count() < 6)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (1);
-		}
-
-	myTokenTypes.ResetAndDestroy();
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("1.2,Testing user-supplied filter,"));
-	TNoTokenTypes filter;
-	CCTTokenTypeInfo::ListL(myTokenTypes, filter);
-
-	if (myTokenTypes.Count() > 0)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (2);
-		}
-
-	myTokenTypes.ResetAndDestroy();
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("1.3,Testing finding filters matching 1 interface,"));
-	RArray<TUid> a;
-	TUid aa = {gInterfaceA};
-	User::LeaveIfError(a.Append(aa));
-	CleanupClosePushL(a);
-	TCTFindTokenTypesByInterface findA(a.Array());
-	CCTTokenTypeInfo::ListL(myTokenTypes, findA);
-	if (myTokenTypes.Count() != 4)
-		{
-		CleanupStack::PopAndDestroy(2);
-		test.Printf(_L("FAILED\r\n"));
-		return (3);
-		}
-	TInt findAResults[] = {1,4,5,6};
-	TInt flag[] = {1,1,1,1};
-	for (TInt ii = 0; ii < 4; ii++)
-		{
-		TInt count = 0;
-		TInt iii=0;
-		TBuf<20> matchString;
-		_LIT(format, "Test Token Type %d");
-		matchString.Format(format, findAResults[iii]);
-		TBuf<20> idisplay_name= myTokenTypes[ii]->Label();
-        
-        if (matchString.Compare(idisplay_name))
-        	count++;
-        else
-        	{
-        	if(flag[0]==1)
-        		flag[0]=0;	
-        	else
-        		count++;
-        	}
-        matchString.Format(format, findAResults[iii+1]);
-        if (matchString.Compare(idisplay_name))
-        	count++;
-        else
-        	{
-        	if(flag[1]==1)
-        		flag[1]=0;	
-        	else
-        		count++;
-        	}
-        matchString.Format(format, findAResults[iii+2]);
-        if (matchString.Compare(idisplay_name))
-        	count++;
-        else
-        	{
-        	if(flag[2]==1)
-        		flag[2]=0;	
-        	else
-        		count++;
-        	}
-        matchString.Format(format, findAResults[iii+3]);
-        if (matchString.Compare(idisplay_name))
-        	count++;
-        else
-        	{
-        	if(flag[3]==1)
-        		flag[3]=0;	
-        	else
-        		count++;
-        	}
-        if(count==4)
-        	{
-        	CleanupStack::PopAndDestroy(2);
-			test.Printf(_L("FAILED\r\n"));
-			return (4);
-        	}
-       } 
-			
-	myTokenTypes.ResetAndDestroy();
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("1.5,Testing finding filters matching 2 interfaces,"));
-	TUid aAndB[] = {{gInterfaceA}, {gInterfaceB}};
-	TTestArray<TUid> aAndBArray(aAndB, 2);
-	TCTFindTokenTypesByInterface findAAndB(aAndBArray.Array());
-	CCTTokenTypeInfo::ListL(myTokenTypes, findAAndB);
-	if (myTokenTypes.Count() != 2)
-		{
-		CleanupStack::PopAndDestroy(2);
-		test.Printf(_L("FAILED\r\n"));
-		return (5);
-		}
-	TInt findAAndBResults[] = {4,6};
-	TInt flag1[] = {1,1};
-	for (TInt jj = 0; jj < 2; jj++)
-		{
-		TInt count = 0;
-		TInt jjj=0;
-		TBuf<20> matchString;
-		_LIT(format, "Test Token Type %d");
-		matchString.Format(format, findAAndBResults[jjj]);
-		TBuf<20> idisplay_name = myTokenTypes[jj]->Label();
-		if (matchString.Compare(idisplay_name))
-        	count++;
-        else
-        	{
-        	if(flag1[0]==1)
-        		flag1[0]=0;	
-        	else
-        		count++;
-        	}
-        matchString.Format(format, findAAndBResults[jjj+1]);
-        if (matchString.Compare(idisplay_name))
-        	count++;
-        else
-        	{
-        	if(flag1[1]==1)
-        		flag1[1]=0;	
-        	else
-        		count++;
-        	}
-        if(count==2)
-        	{
-        	CleanupStack::PopAndDestroy(2);
-			test.Printf(_L("FAILED\r\n"));
-			return (6);
-        	}
-        }
-		
-	// NOTE No ResetAndDestroy
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("1.6,Testing appending interface infos,"));
-	CCTTokenTypeInfo::ListL(myTokenTypes, findA);
-	if (myTokenTypes.Count() != 6)
-		{
-		CleanupStack::PopAndDestroy(2);
-		test.Printf(_L("FAILED\r\n"));
-		return (7);
-		}
-	TInt flag2[] = {1,1,1,1};
-	for (TInt kk = 0; kk < 4; kk++)
-		{
-		TInt count = 0;
-		TInt kkk=0;
-		TBuf<20> matchString;
-		_LIT(format, "Test Token Type %d");
-		matchString.Format(format, findAResults[kkk]);
-		TBuf<20> idisplay_name = myTokenTypes[kk+2]->Label();
-		if (matchString.Compare(idisplay_name))
-        	count++;
-        else
-        	{
-        	if(flag2[0]==1)
-        		flag2[0]=0;	
-        	else
-        		count++;
-        	}
-        matchString.Format(format, findAResults[kkk+1]);
-        if (matchString.Compare(idisplay_name))
-        	count++;
-        else
-        	{
-        	if(flag2[1]==1)
-        		flag2[1]=0;	
-        	else
-        		count++;
-        	}
-        matchString.Format(format, findAResults[kkk+2]);
-        if (matchString.Compare(idisplay_name))
-        	count++;
-        else
-        	{
-        	if(flag2[2]==1)
-        		flag2[2]=0;	
-        	else
-        		count++;
-        	}
-        matchString.Format(format, findAResults[kkk+3]);
-        if (matchString.Compare(idisplay_name))
-        	count++;
-        else
-        	{
-        	if(flag2[3]==1)
-        		flag2[3]=0;	
-        	else
-        		count++;
-        	}
-        if(count==4)
-        {
-        	CleanupStack::PopAndDestroy(2);
-			test.Printf(_L("FAILED\r\n"));
-			return (8);
-        }
-     } 
-		
-	test.Printf(_L("PASSED\r\n"));
-
-	myTokenTypes.ResetAndDestroy();
-	test.Printf(_L("1.7,Testing filtering by interface and attribute,"));
-	TCTTokenTypeAttribute att = {{gAttribute1}, 1};
-	RArray<TCTTokenTypeAttribute> attArray(sizeof(TCTTokenTypeAttribute), &att,
-										   1);
-	TCTFindTokenTypesByInterfaceAndAttribute findAWithAtt1(a.Array(),
-														   attArray.Array());
-	CCTTokenTypeInfo::ListL(myTokenTypes, findAWithAtt1);
-	if (myTokenTypes.Count() != 1)
-		{
-		CleanupStack::PopAndDestroy(2);
-		test.Printf(_L("FAILED\r\n"));
-		return (9);
-		}
-	_LIT(KMatch, "Test Token Type 6");
-	if (myTokenTypes[0]->Label() != KMatch)
-		{
-		CleanupStack::PopAndDestroy(2);
-		test.Printf(_L("FAILED\r\n"));
-		return (10);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	CleanupStack::PopAndDestroy(2);
-	return KErrNone;
-	};
-
-TInt TokenTypeInfoTestsL()
-	{
-	test.Printf(_L("2.1,Testing token type for tests,"));
-	RCPointerArray<CCTTokenTypeInfo> myTokenTypes;
-	CleanupClosePushL(myTokenTypes);
-	TUid aABndC[] = {{gInterfaceA}, {gInterfaceB}, {gInterfaceC}};
-	TTestArray<TUid> aABndCArray(aABndC, 3);
-	TCTFindTokenTypesByInterface findABAndC(aABndCArray.Array());
-	CCTTokenTypeInfo::ListL(myTokenTypes, findABAndC);
-	if (myTokenTypes.Count() != 1)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (1);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("2.2,Test UID function,"));
-	CCTTokenTypeInfo* info = myTokenTypes[0];	
-	if (info->Type().iUid != gImplementation6)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (1);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("2.3,Test getting an array of interfaces,"));
-	RArray<TUid> interfaces = info->Interfaces();
-	if (interfaces.Count() != 3)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (4);
-		}
-	TUid refInterfaces[] = {{gInterfaceA}, {gInterfaceB}, {gInterfaceC}};
-	for (TInt ii = 0; ii < 3; ii++)
-		{
-		if (interfaces[ii] != refInterfaces[ii])
-			{
-			CleanupStack::PopAndDestroy();
-			test.Printf(_L("FAILED\r\n"));
-			return (5);
-			}
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("2.4,Test getting an array of attributes,"));
-	RArray<TCTTokenTypeAttribute> attributes = info->Attributes();
-	if (attributes.Count() != 2)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (8);
-		}
-	TCTTokenTypeAttribute refAttributes[] =
-		{{{gAttribute2}, 2}, {{gAttribute1}, 1}};
-	for (TInt jj = 0; jj < 2; jj++)
-		{
-		if (attributes[jj].iUID != refAttributes[jj].iUID ||
-			attributes[jj].iVal != refAttributes[jj].iVal)
-			{
-			CleanupStack::PopAndDestroy();
-			test.Printf(_L("FAILED\r\n"));
-			return (9);
-			}
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("2.5,Test getting the label,"));
-	_LIT(KLabel, "Test Token Type 6");
-	if (info->Label() != KLabel)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (10);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("2.6,Test getting the type of the token type,"));
-	TUid impl6 = {gImplementation6};
-	if (info->Type() != impl6)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (11);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	CleanupStack::PopAndDestroy();
-	return KErrNone;
-	}
-
-
-TInt TestTokenTypeL(MCTTokenType* aTokenType, TInt aNum)
-	{
-	test.Printf(_L("3.4.1,Getting token info,"));
-	RCPointerArray<HBufC> tokenInfo;
-	CleanupClosePushL(tokenInfo);
-	TRequestStatus status = KRequestPending;
-	aTokenType->List(tokenInfo, status);
-	// Cancel call is pointelss as it does nothing in the test
-	// plugin. But it won't do any harm to check it doesn't explode.
-	aTokenType->CancelList();
-	User::WaitForRequest(status);
-	if (status.Int() != KErrNone || tokenInfo.Count() != 1)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (100);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("3.4.1,Checking token type name,"));
-	TBuf<20> buf;
-	_LIT(KLabelFormat, "Test Token Type %d");
-	buf.Format(KLabelFormat, aNum);
-	if (aTokenType->Label().Compare(buf))
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (105);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("3.4.2,Checking token type Type UID,"));
-	TUid uid = {gImplementation5 + 5 - aNum};
-	if (aTokenType->Type() != uid)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (105);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("3.4.3,Checking token name,"));
-	_LIT(KFormat, "Test Token %d");
-	buf.Format(KFormat, aNum);
-	if (buf.Compare(*tokenInfo[0]))
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (101);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("3.4.4,Opening token,"));
-	status = KRequestPending;
-	MCTToken* token;
-	aTokenType->OpenToken(*tokenInfo[0], token, status);
-	// Cancel call will fail as token isn't opened asynchronous. Check
-	// that the reference counting still works.
-	aTokenType->CancelOpenToken();
-	User::WaitForRequest(status);
-	if (status.Int() != KErrNone)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (102);
-		}
-	token->Release();
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("3.4.5,Opening token by handle,"));
-	status = KRequestPending;
-	TCTTokenHandle handle(aTokenType->Type(), 1);
-	aTokenType->OpenToken(handle, token, status);
-	User::WaitForRequest(status);
-	if (status.Int() != KErrNone)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (102);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("3.4.6,Checking token's TokenType() function,"));
-	if (&token->TokenType() != aTokenType)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (102);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	_LIT(KVersion, "The Ultimate Version");
-	_LIT(KSerial, "Serial No. 1");
-	_LIT(KManufacturer, "ACME Corporation");
-
-	test.Printf(_L("3.4.6.1,Checking token's Information() function,"));
-	if (token->Information(MCTToken::EVersion) != KVersion ||
-		token->Information(MCTToken::ESerialNo) != KSerial ||
-		token->Information(MCTToken::EManufacturer)  != KManufacturer)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (102);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("3.4.7,Registering for removal notification,"));
-	// This is another test to check that an API doesn't crash. We
-	// call the base NotifyOnRemoval/CancelNotify functions and check
-	// they do nothing! There's no point in creating derived versions
-	// that do something as that would be testing the test plugin, not
-	// the framework.
-	TRequestStatus removalStatus;
-	token->NotifyOnRemoval(removalStatus);
-	token->CancelNotify();
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("3.4.9,Testing cancellation of async interface opening,"));
-	MTestInterface* interface;
-	MCTTokenInterface* temp;
-	TUid intB = {gInterfaceB};
-	token->GetInterface(intB, temp, status);
-	token->CancelGetInterface();
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("3.4.10,Opening an interface,"));
-	status = KRequestPending;
-	TUid intC = {gInterfaceC};
-	token->GetInterface(intC, temp, status);
-	interface = static_cast<MTestInterface*>(temp);
-	// Cancel call is pointelss as it does nothing in the test
-	// plugin. But it won't do any harm to check it doesn't explode.
-	token->CancelGetInterface();
-	CleanupReleasePushL(*interface);
-	token->Release();
-	User::WaitForRequest(status);
-	if (status.Int() != KErrNone)
-		{
-		CleanupStack::PopAndDestroy(2);
-		test.Printf(_L("FAILED\r\n"));
-		return (103);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("3.4.11,Checking interface name,"));
-	if (buf.Compare(interface->Label()))
-		{
-		CleanupStack::PopAndDestroy(2);
-		test.Printf(_L("FAILED\r\n"));
-		return (104);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("3.4.12,Getting an object,"));
-	MTestObject* object = interface->ObjectL();
-	object->Release();
-	test.Printf(_L("PASSED\r\n"));
-
-	CleanupStack::PopAndDestroy(2);
-	return KErrNone;
-	}
-
-TInt TokenTypeTestsL()
-	{
-	test.Printf(_L("3.1,Getting token types for tests,"));
-	RFs fs;
-	RCPointerArray<CCTTokenTypeInfo> myTokenTypes;
-	CleanupClosePushL(myTokenTypes);
-	TUid aABndC[] = {{gInterfaceA}, {gInterfaceB}, {gInterfaceC}};
-	TTestArray<TUid> aABandCArray(aABndC, 3);
-	TCTFindTokenTypesByInterface findABAndC(aABandCArray.Array());
-	CCTTokenTypeInfo::ListL(myTokenTypes, findABAndC);
-	if (myTokenTypes.Count() != 1)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (1);
-		}
-	test.Printf(_L("PASSED\r\n"));
-
-	test.Printf(_L("3.2,Loading token type 6,"));
-	MCTTokenType* token6 = MCTTokenType::NewL(*myTokenTypes[0], fs);
-	if (!token6)
-		{
-		CleanupStack::PopAndDestroy();
-		test.Printf(_L("FAILED\r\n"));
-		return (1);
-		}
-	CleanupReleasePushL(*token6);
-	test.Printf(_L("PASSED\r\n"));
-
-	TInt ret = TestTokenTypeL(token6, 6);
-	if (ret)
-		{
-		CleanupStack::PopAndDestroy(2);
-		return ret;
-		}
-
-	test.Printf(_L("3.3,Loading token type 5,"));
-	TUid UID5 = {gImplementation5};
-	MCTTokenType* token5 = MCTTokenType::NewL(UID5, fs);
-	if (!token5)
-		{
-		CleanupStack::PopAndDestroy(2);
-		test.Printf(_L("FAILED\r\n"));
-		return (2);
-		}
-	CleanupReleasePushL(*token5);
-	test.Printf(_L("PASSED\r\n"));
-
-	ret = TestTokenTypeL(token5, 5);
-	CleanupStack::PopAndDestroy(3);
-
-	return ret;
-	}
-
-TInt MemoryTestL(TInt (*aFnToTest)())
-	{
-	gLogging = EFalse;
-	for (TInt ii = 1; ; ii++)
-		{
-		if (ii % 10)
-			test.Printf(_L("."));
-		else
-			test.Printf(_L("*"));
-		if (!(ii % 50))
-			test.Printf(_L("\r\n"));
-		gSilent = ETrue;
-		__UHEAP_MARK;
-		__UHEAP_FAILNEXT(ii);
-		TRAPD(err,aFnToTest());
-		__UHEAP_RESET;
-		REComSession::FinalClose();
-		__UHEAP_MARKEND;
-		User::Heap().Check();
-		gSilent = EFalse;
-		if (err != KErrNoMemory)
-			{
-			test.Printf(_L("\r\n"));
-			gLogging = ETrue;
-			return err;
-			}
-		}
-	}
-
-void TestsL(void)
-	{
-	CActiveScheduler* as = new(ELeave) CActiveScheduler;
-	CActiveScheduler::Install(as);
-
-	TInt errors = 0;
-	TInt ret;
-	__UHEAP_MARK;
-	ret = TokenTypeInfoListTestsL();
-	REComSession::FinalClose();
-	__UHEAP_MARKEND;
-	if (ret)
-		{
-		test.Printf(_L("1.9,ERROR %d in Info List test,FAILED\r\n"),ret);
-		errors++;
-		}
-	else
-		{
-		test.Printf(_L("1.9,Info List test,PASSED\r\n"),ret);
-		}
-	__UHEAP_MARK;
-	ret = TokenTypeInfoTestsL();
-	REComSession::FinalClose();
-	__UHEAP_MARKEND;
-	if (ret)
-		{
-		test.Printf(_L("2.9,ERROR %d in Info test,FAILED\r\n"),ret);
-		errors++;
-		}
-	else
-		{
-		test.Printf(_L("2.9,Info test,PASSED\r\n"),ret);
-		}
-
-	__UHEAP_MARK;
-	ret = TokenTypeTestsL();
-	REComSession::FinalClose();
-	__UHEAP_MARKEND;
-	if (ret)
-		{
-		test.Printf(_L("3.9,ERROR %d in token test,FAILED\r\n"),ret);
-		errors++;
-		}
-	else
-		{
-		test.Printf(_L("3.9,token test,PASSED\r\n"),ret);
-		}
-
-	ret = MemoryTestL(TokenTypeInfoListTestsL);
-	if (ret)
-		{
-		test.Printf(_L("4.9,ERROR %d in Info List memory test,FAILED\r\n"),ret);
-		errors++;
-		}
-	else
-		{
-		test.Printf(_L("4.9,Info List memory test,PASSED\r\n"),ret);
-		}
-	ret = MemoryTestL(TokenTypeTestsL);
-	if (ret)
-		{
-		test.Printf(_L("5.9,ERROR %d in Token Type memory test,FAILED\r\n"),ret);
-		errors++;
-		}
-	else
-		{
-		test.Printf(_L("5.9,Token Type memory test,PASSED\r\n"),ret);
-		}
-
-	test.Printf(_L("%d tests failed out of 44 hardcoded\r\n"), errors);
-
-
-	if (errors)
-		{
-		test.Printf(_L("%d TESTS FAILED\r\n"),errors);
-		}
-	else
-		{
-		test.Printf(_L("ALL TESTS PASSED\r\n"));
-		}
-
-	delete as;
-	}
-
-GLDEF_C TInt E32Main(void)
-
-	{
-	CTrapCleanup* cleanup;
-	cleanup=CTrapCleanup::New();
-	test.Start(_L("Starting token framework tests\r\n"));		 
-	CTestConsole* con=NULL;
-	TRAPD(ret,con=CTestConsole::NewL(test.Console()));
-	RFs fs;
-	if (gLogging)
-		{
-		User::LeaveIfError(fs.Connect());
-		RFile* file;
-		file=new (ELeave) RFile;
-		TDriveUnit sysDrive (fs.GetSystemDrive());
-		TDriveName driveName(sysDrive.Name());
-		TBuf<64> logFile (driveName);
-		logFile.Append(_L("\\T_CTFrameworkLog.txt"));
-		User::LeaveIfError(file->Replace(fs, logFile, EFileShareAny|EFileWrite));
-		con->SetLogFile(file);
-		}
-	test.SetConsole(con);
-	TRAP(ret,TestsL());
-	if (ret)
-		{
-		test.Printf(_L("Unexpected leave\r\n"));
-		}
-	gLogging=EFalse;
-	test.Close();
-	delete cleanup;
-	return(KErrNone);
-	}
+/*
+* Copyright (c) 2001-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 <e32test.h>
+#include <ct.h>
+#include <f32file.h>
+#include "MTestInterface.h"
+#include <ecom/ecom.h>
+
+RTest test(_L("CT Framework Tests"));
+
+
+
+TBool gLogging=ETrue;
+TBool gSilent=EFalse;
+
+const TInt gInterfaceA = 0x101f4e50;
+const TInt gInterfaceB = 0x101f4e51;
+const TInt gInterfaceC = 0x101f4e52;
+
+const TInt gAttribute1 = 0x101f4e4a;
+const TInt gAttribute2 = 0x101f4e4b;
+
+const TInt gImplementation6 = 0x101f4e4c;
+const TInt gImplementation5 = 0x101f4e4d;
+
+class CTestConsole:public CConsoleBase
+
+	{
+	public:
+		static CTestConsole* NewL(CConsoleBase* aCon);
+		TInt Create(const TDesC16& aTitle,TSize aSize) {return iCon->Create(aTitle,aSize);};
+		void Read(TRequestStatus& aStatus) {iCon->Read(aStatus);};
+		void ReadCancel(void) {iCon->ReadCancel();};
+		void Write(const TDesC16& aString);
+		TPoint CursorPos(void) const {return iCon->CursorPos();};
+		void SetCursorPosAbs(const TPoint& aPos) {iCon->SetCursorPosAbs(aPos);};
+		void SetCursorPosRel(const TPoint& aPos) {iCon->SetCursorPosRel(aPos);};
+		void SetCursorHeight(TInt aHeight) {iCon->SetCursorHeight(aHeight);};
+		void SetTitle(const TDesC16& aTitle) {iCon->SetTitle(aTitle);};
+		void ClearScreen(void) {iCon->ClearScreen();};
+		void ClearToEndOfLine(void) {iCon->ClearToEndOfLine();};
+		TSize ScreenSize(void) const {return iCon->ScreenSize();};
+		TKeyCode KeyCode(void) const {return iCon->KeyCode();};
+		TUint KeyModifiers(void) const {return iCon->KeyModifiers();};
+		~CTestConsole(void);
+		void SetLogFile(RFile* aFile);
+	private:
+		CTestConsole(void);
+		CConsoleBase* iCon;
+		RFile* iFile;
+	};
+
+CTestConsole* CTestConsole::NewL(CConsoleBase* aCon)
+
+	{
+	CTestConsole* self;
+	self=new (ELeave) CTestConsole;
+	self->iCon=aCon;
+	self->iFile=NULL;
+	return self;
+	}
+
+CTestConsole::CTestConsole(void):CConsoleBase()
+
+	{
+	}
+
+CTestConsole::~CTestConsole(void)
+
+	{
+	delete iCon;
+	if (iFile)
+		{
+		iFile->Close();
+		}
+	}
+
+void CTestConsole::Write(const TDesC16& aString)
+
+	{
+	if (gSilent)
+		return;
+	iCon->Write(aString);
+	if ((iFile)&&(gLogging))
+		{
+		TUint8 space[200];
+		TPtr8 ptr(space,200);
+		ptr.Copy(aString);
+		iFile->Write(ptr);
+		}
+	}
+
+void CTestConsole::SetLogFile(RFile* aFile)
+
+	{
+	iFile=aFile;
+	}
+
+template <class T> class TTestArray
+	{
+public:
+	TTestArray(T* aArray, TInt aCount);
+	TArray<T> Array();
+private:
+	static TInt Count(const CBase* aThat);
+	static const TAny* Get(const CBase* aThat, TInt aIndex);
+
+	T* iArray;
+	TInt iCount;
+	};
+
+template <class T> TTestArray<T>::TTestArray(T* aArray, TInt aCount)
+		: iArray(aArray), iCount(aCount)
+	{	
+	}
+
+template <class T> TInt TTestArray<T>::Count(const CBase* aThat)
+	{
+	return reinterpret_cast<const TTestArray*>(aThat)->iCount;
+	}
+
+template <class T> const TAny* TTestArray<T>::Get(const CBase* aThat, TInt aIndex)
+	{
+	return &reinterpret_cast<const TTestArray*>(aThat)->iArray[aIndex];
+	}
+
+template <class T> TArray<T> TTestArray<T>::Array()
+	{
+	return TArray<T>(Count, Get, reinterpret_cast<CBase*>(this));
+	}
+
+/** A filter that includes nothing (as a random easy-to-write test filter */
+class TNoTokenTypes : public MCTTokenTypeFilter
+	{
+ public:
+	/** Always returns EFalse. */
+	virtual TBool Accept(const CCTTokenTypeInfo& aTokenType) const;
+	};
+
+// Accept everything
+TBool TNoTokenTypes::Accept(const CCTTokenTypeInfo&) const
+	{
+	return EFalse;
+	}
+
+class CStopScheduler : public CActive
+	{
+public:
+	void DoCancel() {};
+	void RunL();
+	CStopScheduler();
+	};
+
+void CStopScheduler::RunL()
+	{
+	CActiveScheduler::Stop();
+	};
+
+CStopScheduler::CStopScheduler()
+		: CActive(EPriorityIdle)
+	{
+	CActiveScheduler::Add(this);
+	SetActive();
+	TRequestStatus* r = &iStatus;
+	User::RequestComplete(r, KErrNone);
+	}
+
+TInt TokenTypeInfoListTestsL()
+	{
+	test.Printf(_L("1.1,Testing getting all token types,"));
+	RCPointerArray<CCTTokenTypeInfo> myTokenTypes;
+	CleanupClosePushL(myTokenTypes);
+
+	CCTTokenTypeInfo::ListL(myTokenTypes);
+
+	if (myTokenTypes.Count() < 6)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (1);
+		}
+
+	myTokenTypes.ResetAndDestroy();
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("1.2,Testing user-supplied filter,"));
+	TNoTokenTypes filter;
+	CCTTokenTypeInfo::ListL(myTokenTypes, filter);
+
+	if (myTokenTypes.Count() > 0)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (2);
+		}
+
+	myTokenTypes.ResetAndDestroy();
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("1.3,Testing finding filters matching 1 interface,"));
+	RArray<TUid> a;
+	TUid aa = {gInterfaceA};
+	User::LeaveIfError(a.Append(aa));
+	CleanupClosePushL(a);
+	TCTFindTokenTypesByInterface findA(a.Array());
+	CCTTokenTypeInfo::ListL(myTokenTypes, findA);
+	if (myTokenTypes.Count() != 4)
+		{
+		CleanupStack::PopAndDestroy(2);
+		test.Printf(_L("FAILED\r\n"));
+		return (3);
+		}
+	TInt findAResults[] = {1,4,5,6};
+	TInt flag[] = {1,1,1,1};
+	for (TInt ii = 0; ii < 4; ii++)
+		{
+		TInt count = 0;
+		TInt iii=0;
+		TBuf<20> matchString;
+		_LIT(format, "Test Token Type %d");
+		matchString.Format(format, findAResults[iii]);
+		TBuf<20> idisplay_name= myTokenTypes[ii]->Label();
+        
+        if (matchString.Compare(idisplay_name))
+        	count++;
+        else
+        	{
+        	if(flag[0]==1)
+        		flag[0]=0;	
+        	else
+        		count++;
+        	}
+        matchString.Format(format, findAResults[iii+1]);
+        if (matchString.Compare(idisplay_name))
+        	count++;
+        else
+        	{
+        	if(flag[1]==1)
+        		flag[1]=0;	
+        	else
+        		count++;
+        	}
+        matchString.Format(format, findAResults[iii+2]);
+        if (matchString.Compare(idisplay_name))
+        	count++;
+        else
+        	{
+        	if(flag[2]==1)
+        		flag[2]=0;	
+        	else
+        		count++;
+        	}
+        matchString.Format(format, findAResults[iii+3]);
+        if (matchString.Compare(idisplay_name))
+        	count++;
+        else
+        	{
+        	if(flag[3]==1)
+        		flag[3]=0;	
+        	else
+        		count++;
+        	}
+        if(count==4)
+        	{
+        	CleanupStack::PopAndDestroy(2);
+			test.Printf(_L("FAILED\r\n"));
+			return (4);
+        	}
+       } 
+			
+	myTokenTypes.ResetAndDestroy();
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("1.5,Testing finding filters matching 2 interfaces,"));
+	TUid aAndB[] = {{gInterfaceA}, {gInterfaceB}};
+	TTestArray<TUid> aAndBArray(aAndB, 2);
+	TCTFindTokenTypesByInterface findAAndB(aAndBArray.Array());
+	CCTTokenTypeInfo::ListL(myTokenTypes, findAAndB);
+	if (myTokenTypes.Count() != 2)
+		{
+		CleanupStack::PopAndDestroy(2);
+		test.Printf(_L("FAILED\r\n"));
+		return (5);
+		}
+	TInt findAAndBResults[] = {4,6};
+	TInt flag1[] = {1,1};
+	for (TInt jj = 0; jj < 2; jj++)
+		{
+		TInt count = 0;
+		TInt jjj=0;
+		TBuf<20> matchString;
+		_LIT(format, "Test Token Type %d");
+		matchString.Format(format, findAAndBResults[jjj]);
+		TBuf<20> idisplay_name = myTokenTypes[jj]->Label();
+		if (matchString.Compare(idisplay_name))
+        	count++;
+        else
+        	{
+        	if(flag1[0]==1)
+        		flag1[0]=0;	
+        	else
+        		count++;
+        	}
+        matchString.Format(format, findAAndBResults[jjj+1]);
+        if (matchString.Compare(idisplay_name))
+        	count++;
+        else
+        	{
+        	if(flag1[1]==1)
+        		flag1[1]=0;	
+        	else
+        		count++;
+        	}
+        if(count==2)
+        	{
+        	CleanupStack::PopAndDestroy(2);
+			test.Printf(_L("FAILED\r\n"));
+			return (6);
+        	}
+        }
+		
+	// NOTE No ResetAndDestroy
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("1.6,Testing appending interface infos,"));
+	CCTTokenTypeInfo::ListL(myTokenTypes, findA);
+	if (myTokenTypes.Count() != 6)
+		{
+		CleanupStack::PopAndDestroy(2);
+		test.Printf(_L("FAILED\r\n"));
+		return (7);
+		}
+	TInt flag2[] = {1,1,1,1};
+	for (TInt kk = 0; kk < 4; kk++)
+		{
+		TInt count = 0;
+		TInt kkk=0;
+		TBuf<20> matchString;
+		_LIT(format, "Test Token Type %d");
+		matchString.Format(format, findAResults[kkk]);
+		TBuf<20> idisplay_name = myTokenTypes[kk+2]->Label();
+		if (matchString.Compare(idisplay_name))
+        	count++;
+        else
+        	{
+        	if(flag2[0]==1)
+        		flag2[0]=0;	
+        	else
+        		count++;
+        	}
+        matchString.Format(format, findAResults[kkk+1]);
+        if (matchString.Compare(idisplay_name))
+        	count++;
+        else
+        	{
+        	if(flag2[1]==1)
+        		flag2[1]=0;	
+        	else
+        		count++;
+        	}
+        matchString.Format(format, findAResults[kkk+2]);
+        if (matchString.Compare(idisplay_name))
+        	count++;
+        else
+        	{
+        	if(flag2[2]==1)
+        		flag2[2]=0;	
+        	else
+        		count++;
+        	}
+        matchString.Format(format, findAResults[kkk+3]);
+        if (matchString.Compare(idisplay_name))
+        	count++;
+        else
+        	{
+        	if(flag2[3]==1)
+        		flag2[3]=0;	
+        	else
+        		count++;
+        	}
+        if(count==4)
+        {
+        	CleanupStack::PopAndDestroy(2);
+			test.Printf(_L("FAILED\r\n"));
+			return (8);
+        }
+     } 
+		
+	test.Printf(_L("PASSED\r\n"));
+
+	myTokenTypes.ResetAndDestroy();
+	test.Printf(_L("1.7,Testing filtering by interface and attribute,"));
+	TCTTokenTypeAttribute att = {{gAttribute1}, 1};
+	RArray<TCTTokenTypeAttribute> attArray(sizeof(TCTTokenTypeAttribute), &att,
+										   1);
+	TCTFindTokenTypesByInterfaceAndAttribute findAWithAtt1(a.Array(),
+														   attArray.Array());
+	CCTTokenTypeInfo::ListL(myTokenTypes, findAWithAtt1);
+	if (myTokenTypes.Count() != 1)
+		{
+		CleanupStack::PopAndDestroy(2);
+		test.Printf(_L("FAILED\r\n"));
+		return (9);
+		}
+	_LIT(KMatch, "Test Token Type 6");
+	if (myTokenTypes[0]->Label() != KMatch)
+		{
+		CleanupStack::PopAndDestroy(2);
+		test.Printf(_L("FAILED\r\n"));
+		return (10);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	CleanupStack::PopAndDestroy(2);
+	return KErrNone;
+	};
+
+TInt TokenTypeInfoTestsL()
+	{
+	test.Printf(_L("2.1,Testing token type for tests,"));
+	RCPointerArray<CCTTokenTypeInfo> myTokenTypes;
+	CleanupClosePushL(myTokenTypes);
+	TUid aABndC[] = {{gInterfaceA}, {gInterfaceB}, {gInterfaceC}};
+	TTestArray<TUid> aABndCArray(aABndC, 3);
+	TCTFindTokenTypesByInterface findABAndC(aABndCArray.Array());
+	CCTTokenTypeInfo::ListL(myTokenTypes, findABAndC);
+	if (myTokenTypes.Count() != 1)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (1);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("2.2,Test UID function,"));
+	CCTTokenTypeInfo* info = myTokenTypes[0];	
+	if (info->Type().iUid != gImplementation6)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (1);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("2.3,Test getting an array of interfaces,"));
+	RArray<TUid> interfaces = info->Interfaces();
+	if (interfaces.Count() != 3)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (4);
+		}
+	TUid refInterfaces[] = {{gInterfaceA}, {gInterfaceB}, {gInterfaceC}};
+	for (TInt ii = 0; ii < 3; ii++)
+		{
+		if (interfaces[ii] != refInterfaces[ii])
+			{
+			CleanupStack::PopAndDestroy();
+			test.Printf(_L("FAILED\r\n"));
+			return (5);
+			}
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("2.4,Test getting an array of attributes,"));
+	RArray<TCTTokenTypeAttribute> attributes = info->Attributes();
+	if (attributes.Count() != 2)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (8);
+		}
+	TCTTokenTypeAttribute refAttributes[] =
+		{{{gAttribute2}, 2}, {{gAttribute1}, 1}};
+	for (TInt jj = 0; jj < 2; jj++)
+		{
+		if (attributes[jj].iUID != refAttributes[jj].iUID ||
+			attributes[jj].iVal != refAttributes[jj].iVal)
+			{
+			CleanupStack::PopAndDestroy();
+			test.Printf(_L("FAILED\r\n"));
+			return (9);
+			}
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("2.5,Test getting the label,"));
+	_LIT(KLabel, "Test Token Type 6");
+	if (info->Label() != KLabel)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (10);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("2.6,Test getting the type of the token type,"));
+	TUid impl6 = {gImplementation6};
+	if (info->Type() != impl6)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (11);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	CleanupStack::PopAndDestroy();
+	return KErrNone;
+	}
+
+
+TInt TestTokenTypeL(MCTTokenType* aTokenType, TInt aNum)
+	{
+	test.Printf(_L("3.4.1,Getting token info,"));
+	RCPointerArray<HBufC> tokenInfo;
+	CleanupClosePushL(tokenInfo);
+	TRequestStatus status = KRequestPending;
+	aTokenType->List(tokenInfo, status);
+	// Cancel call is pointelss as it does nothing in the test
+	// plugin. But it won't do any harm to check it doesn't explode.
+	aTokenType->CancelList();
+	User::WaitForRequest(status);
+	if (status.Int() != KErrNone || tokenInfo.Count() != 1)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (100);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("3.4.1,Checking token type name,"));
+	TBuf<20> buf;
+	_LIT(KLabelFormat, "Test Token Type %d");
+	buf.Format(KLabelFormat, aNum);
+	if (aTokenType->Label().Compare(buf))
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (105);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("3.4.2,Checking token type Type UID,"));
+	TUid uid = {gImplementation5 + 5 - aNum};
+	if (aTokenType->Type() != uid)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (105);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("3.4.3,Checking token name,"));
+	_LIT(KFormat, "Test Token %d");
+	buf.Format(KFormat, aNum);
+	if (buf.Compare(*tokenInfo[0]))
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (101);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("3.4.4,Opening token,"));
+	status = KRequestPending;
+	MCTToken* token;
+	aTokenType->OpenToken(*tokenInfo[0], token, status);
+	// Cancel call will fail as token isn't opened asynchronous. Check
+	// that the reference counting still works.
+	aTokenType->CancelOpenToken();
+	User::WaitForRequest(status);
+	if (status.Int() != KErrNone)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (102);
+		}
+	token->Release();
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("3.4.5,Opening token by handle,"));
+	status = KRequestPending;
+	TCTTokenHandle handle(aTokenType->Type(), 1);
+	aTokenType->OpenToken(handle, token, status);
+	User::WaitForRequest(status);
+	if (status.Int() != KErrNone)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (102);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("3.4.6,Checking token's TokenType() function,"));
+	if (&token->TokenType() != aTokenType)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (102);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	_LIT(KVersion, "The Ultimate Version");
+	_LIT(KSerial, "Serial No. 1");
+	_LIT(KManufacturer, "ACME Corporation");
+
+	test.Printf(_L("3.4.6.1,Checking token's Information() function,"));
+	if (token->Information(MCTToken::EVersion) != KVersion ||
+		token->Information(MCTToken::ESerialNo) != KSerial ||
+		token->Information(MCTToken::EManufacturer)  != KManufacturer)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (102);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("3.4.7,Registering for removal notification,"));
+	// This is another test to check that an API doesn't crash. We
+	// call the base NotifyOnRemoval/CancelNotify functions and check
+	// they do nothing! There's no point in creating derived versions
+	// that do something as that would be testing the test plugin, not
+	// the framework.
+	TRequestStatus removalStatus;
+	token->NotifyOnRemoval(removalStatus);
+	token->CancelNotify();
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("3.4.9,Testing cancellation of async interface opening,"));
+	MTestInterface* interface;
+	MCTTokenInterface* temp;
+	TUid intB = {gInterfaceB};
+	token->GetInterface(intB, temp, status);
+	token->CancelGetInterface();
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("3.4.10,Opening an interface,"));
+	status = KRequestPending;
+	TUid intC = {gInterfaceC};
+	token->GetInterface(intC, temp, status);
+	interface = static_cast<MTestInterface*>(temp);
+	// Cancel call is pointelss as it does nothing in the test
+	// plugin. But it won't do any harm to check it doesn't explode.
+	token->CancelGetInterface();
+	CleanupReleasePushL(*interface);
+	token->Release();
+	User::WaitForRequest(status);
+	if (status.Int() != KErrNone)
+		{
+		CleanupStack::PopAndDestroy(2);
+		test.Printf(_L("FAILED\r\n"));
+		return (103);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("3.4.11,Checking interface name,"));
+	if (buf.Compare(interface->Label()))
+		{
+		CleanupStack::PopAndDestroy(2);
+		test.Printf(_L("FAILED\r\n"));
+		return (104);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("3.4.12,Getting an object,"));
+	MTestObject* object = interface->ObjectL();
+	object->Release();
+	test.Printf(_L("PASSED\r\n"));
+
+	CleanupStack::PopAndDestroy(2);
+	return KErrNone;
+	}
+
+TInt TokenTypeTestsL()
+	{
+	test.Printf(_L("3.1,Getting token types for tests,"));
+	RFs fs;
+	RCPointerArray<CCTTokenTypeInfo> myTokenTypes;
+	CleanupClosePushL(myTokenTypes);
+	TUid aABndC[] = {{gInterfaceA}, {gInterfaceB}, {gInterfaceC}};
+	TTestArray<TUid> aABandCArray(aABndC, 3);
+	TCTFindTokenTypesByInterface findABAndC(aABandCArray.Array());
+	CCTTokenTypeInfo::ListL(myTokenTypes, findABAndC);
+	if (myTokenTypes.Count() != 1)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (1);
+		}
+	test.Printf(_L("PASSED\r\n"));
+
+	test.Printf(_L("3.2,Loading token type 6,"));
+	MCTTokenType* token6 = MCTTokenType::NewL(*myTokenTypes[0], fs);
+	if (!token6)
+		{
+		CleanupStack::PopAndDestroy();
+		test.Printf(_L("FAILED\r\n"));
+		return (1);
+		}
+	CleanupReleasePushL(*token6);
+	test.Printf(_L("PASSED\r\n"));
+
+	TInt ret = TestTokenTypeL(token6, 6);
+	if (ret)
+		{
+		CleanupStack::PopAndDestroy(2);
+		return ret;
+		}
+
+	test.Printf(_L("3.3,Loading token type 5,"));
+	TUid UID5 = {gImplementation5};
+	MCTTokenType* token5 = MCTTokenType::NewL(UID5, fs);
+	if (!token5)
+		{
+		CleanupStack::PopAndDestroy(2);
+		test.Printf(_L("FAILED\r\n"));
+		return (2);
+		}
+	CleanupReleasePushL(*token5);
+	test.Printf(_L("PASSED\r\n"));
+
+	ret = TestTokenTypeL(token5, 5);
+	CleanupStack::PopAndDestroy(3);
+
+	return ret;
+	}
+
+TInt MemoryTestL(TInt (*aFnToTest)())
+	{
+	gLogging = EFalse;
+	for (TInt ii = 1; ; ii++)
+		{
+		if (ii % 10)
+			test.Printf(_L("."));
+		else
+			test.Printf(_L("*"));
+		if (!(ii % 50))
+			test.Printf(_L("\r\n"));
+		gSilent = ETrue;
+		__UHEAP_MARK;
+		__UHEAP_FAILNEXT(ii);
+		TRAPD(err,aFnToTest());
+		__UHEAP_RESET;
+		REComSession::FinalClose();
+		__UHEAP_MARKEND;
+		User::Heap().Check();
+		gSilent = EFalse;
+		if (err != KErrNoMemory)
+			{
+			test.Printf(_L("\r\n"));
+			gLogging = ETrue;
+			return err;
+			}
+		}
+	}
+
+void TestsL(void)
+	{
+	CActiveScheduler* as = new(ELeave) CActiveScheduler;
+	CActiveScheduler::Install(as);
+
+	TInt errors = 0;
+	TInt ret;
+	__UHEAP_MARK;
+	ret = TokenTypeInfoListTestsL();
+	REComSession::FinalClose();
+	__UHEAP_MARKEND;
+	if (ret)
+		{
+		test.Printf(_L("1.9,ERROR %d in Info List test,FAILED\r\n"),ret);
+		errors++;
+		}
+	else
+		{
+		test.Printf(_L("1.9,Info List test,PASSED\r\n"),ret);
+		}
+	__UHEAP_MARK;
+	ret = TokenTypeInfoTestsL();
+	REComSession::FinalClose();
+	__UHEAP_MARKEND;
+	if (ret)
+		{
+		test.Printf(_L("2.9,ERROR %d in Info test,FAILED\r\n"),ret);
+		errors++;
+		}
+	else
+		{
+		test.Printf(_L("2.9,Info test,PASSED\r\n"),ret);
+		}
+
+	__UHEAP_MARK;
+	ret = TokenTypeTestsL();
+	REComSession::FinalClose();
+	__UHEAP_MARKEND;
+	if (ret)
+		{
+		test.Printf(_L("3.9,ERROR %d in token test,FAILED\r\n"),ret);
+		errors++;
+		}
+	else
+		{
+		test.Printf(_L("3.9,token test,PASSED\r\n"),ret);
+		}
+
+	ret = MemoryTestL(TokenTypeInfoListTestsL);
+	if (ret)
+		{
+		test.Printf(_L("4.9,ERROR %d in Info List memory test,FAILED\r\n"),ret);
+		errors++;
+		}
+	else
+		{
+		test.Printf(_L("4.9,Info List memory test,PASSED\r\n"),ret);
+		}
+	ret = MemoryTestL(TokenTypeTestsL);
+	if (ret)
+		{
+		test.Printf(_L("5.9,ERROR %d in Token Type memory test,FAILED\r\n"),ret);
+		errors++;
+		}
+	else
+		{
+		test.Printf(_L("5.9,Token Type memory test,PASSED\r\n"),ret);
+		}
+
+	test.Printf(_L("%d tests failed out of 44 hardcoded\r\n"), errors);
+
+
+	if (errors)
+		{
+		test.Printf(_L("%d TESTS FAILED\r\n"),errors);
+		}
+	else
+		{
+		test.Printf(_L("ALL TESTS PASSED\r\n"));
+		}
+
+	delete as;
+	}
+
+GLDEF_C TInt E32Main(void)
+
+	{
+	CTrapCleanup* cleanup;
+	cleanup=CTrapCleanup::New();
+	test.Start(_L(" @SYMTestCaseID:SEC-CRYPTOTOKENS-CTFRAMEWORK-0001 Starting token framework tests\r\n"));		 
+	CTestConsole* con=NULL;
+	TRAPD(ret,con=CTestConsole::NewL(test.Console()));
+	RFs fs;
+	if (gLogging)
+		{
+		User::LeaveIfError(fs.Connect());
+		RFile* file;
+		file=new (ELeave) RFile;
+		TDriveUnit sysDrive (fs.GetSystemDrive());
+		TDriveName driveName(sysDrive.Name());
+		TBuf<64> logFile (driveName);
+		logFile.Append(_L("\\T_CTFrameworkLog.txt"));
+		User::LeaveIfError(file->Replace(fs, logFile, EFileShareAny|EFileWrite));
+		con->SetLogFile(file);
+		}
+	test.SetConsole(con);
+	TRAP(ret,TestsL());
+	if (ret)
+		{
+		test.Printf(_L("Unexpected leave\r\n"));
+		}
+	gLogging=EFalse;
+	test.Close();
+	delete cleanup;
+	return(KErrNone);
+	}