os/security/cryptomgmtlibs/cryptotokenfw/tframework/t_ctframework.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200 (2014-06-10)
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /*
     2 * Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of the License "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description: 
    15 *
    16 */
    17 
    18 
    19 #include <e32test.h>
    20 #include <ct.h>
    21 #include <f32file.h>
    22 #include "MTestInterface.h"
    23 #include <ecom/ecom.h>
    24 
    25 RTest test(_L("CT Framework Tests"));
    26 
    27 
    28 
    29 TBool gLogging=ETrue;
    30 TBool gSilent=EFalse;
    31 
    32 const TInt gInterfaceA = 0x101f4e50;
    33 const TInt gInterfaceB = 0x101f4e51;
    34 const TInt gInterfaceC = 0x101f4e52;
    35 
    36 const TInt gAttribute1 = 0x101f4e4a;
    37 const TInt gAttribute2 = 0x101f4e4b;
    38 
    39 const TInt gImplementation6 = 0x101f4e4c;
    40 const TInt gImplementation5 = 0x101f4e4d;
    41 
    42 class CTestConsole:public CConsoleBase
    43 
    44 	{
    45 	public:
    46 		static CTestConsole* NewL(CConsoleBase* aCon);
    47 		TInt Create(const TDesC16& aTitle,TSize aSize) {return iCon->Create(aTitle,aSize);};
    48 		void Read(TRequestStatus& aStatus) {iCon->Read(aStatus);};
    49 		void ReadCancel(void) {iCon->ReadCancel();};
    50 		void Write(const TDesC16& aString);
    51 		TPoint CursorPos(void) const {return iCon->CursorPos();};
    52 		void SetCursorPosAbs(const TPoint& aPos) {iCon->SetCursorPosAbs(aPos);};
    53 		void SetCursorPosRel(const TPoint& aPos) {iCon->SetCursorPosRel(aPos);};
    54 		void SetCursorHeight(TInt aHeight) {iCon->SetCursorHeight(aHeight);};
    55 		void SetTitle(const TDesC16& aTitle) {iCon->SetTitle(aTitle);};
    56 		void ClearScreen(void) {iCon->ClearScreen();};
    57 		void ClearToEndOfLine(void) {iCon->ClearToEndOfLine();};
    58 		TSize ScreenSize(void) const {return iCon->ScreenSize();};
    59 		TKeyCode KeyCode(void) const {return iCon->KeyCode();};
    60 		TUint KeyModifiers(void) const {return iCon->KeyModifiers();};
    61 		~CTestConsole(void);
    62 		void SetLogFile(RFile* aFile);
    63 	private:
    64 		CTestConsole(void);
    65 		CConsoleBase* iCon;
    66 		RFile* iFile;
    67 	};
    68 
    69 CTestConsole* CTestConsole::NewL(CConsoleBase* aCon)
    70 
    71 	{
    72 	CTestConsole* self;
    73 	self=new (ELeave) CTestConsole;
    74 	self->iCon=aCon;
    75 	self->iFile=NULL;
    76 	return self;
    77 	}
    78 
    79 CTestConsole::CTestConsole(void):CConsoleBase()
    80 
    81 	{
    82 	}
    83 
    84 CTestConsole::~CTestConsole(void)
    85 
    86 	{
    87 	delete iCon;
    88 	if (iFile)
    89 		{
    90 		iFile->Close();
    91 		}
    92 	}
    93 
    94 void CTestConsole::Write(const TDesC16& aString)
    95 
    96 	{
    97 	if (gSilent)
    98 		return;
    99 	iCon->Write(aString);
   100 	if ((iFile)&&(gLogging))
   101 		{
   102 		TUint8 space[200];
   103 		TPtr8 ptr(space,200);
   104 		ptr.Copy(aString);
   105 		iFile->Write(ptr);
   106 		}
   107 	}
   108 
   109 void CTestConsole::SetLogFile(RFile* aFile)
   110 
   111 	{
   112 	iFile=aFile;
   113 	}
   114 
   115 template <class T> class TTestArray
   116 	{
   117 public:
   118 	TTestArray(T* aArray, TInt aCount);
   119 	TArray<T> Array();
   120 private:
   121 	static TInt Count(const CBase* aThat);
   122 	static const TAny* Get(const CBase* aThat, TInt aIndex);
   123 
   124 	T* iArray;
   125 	TInt iCount;
   126 	};
   127 
   128 template <class T> TTestArray<T>::TTestArray(T* aArray, TInt aCount)
   129 		: iArray(aArray), iCount(aCount)
   130 	{	
   131 	}
   132 
   133 template <class T> TInt TTestArray<T>::Count(const CBase* aThat)
   134 	{
   135 	return reinterpret_cast<const TTestArray*>(aThat)->iCount;
   136 	}
   137 
   138 template <class T> const TAny* TTestArray<T>::Get(const CBase* aThat, TInt aIndex)
   139 	{
   140 	return &reinterpret_cast<const TTestArray*>(aThat)->iArray[aIndex];
   141 	}
   142 
   143 template <class T> TArray<T> TTestArray<T>::Array()
   144 	{
   145 	return TArray<T>(Count, Get, reinterpret_cast<CBase*>(this));
   146 	}
   147 
   148 /** A filter that includes nothing (as a random easy-to-write test filter */
   149 class TNoTokenTypes : public MCTTokenTypeFilter
   150 	{
   151  public:
   152 	/** Always returns EFalse. */
   153 	virtual TBool Accept(const CCTTokenTypeInfo& aTokenType) const;
   154 	};
   155 
   156 // Accept everything
   157 TBool TNoTokenTypes::Accept(const CCTTokenTypeInfo&) const
   158 	{
   159 	return EFalse;
   160 	}
   161 
   162 class CStopScheduler : public CActive
   163 	{
   164 public:
   165 	void DoCancel() {};
   166 	void RunL();
   167 	CStopScheduler();
   168 	};
   169 
   170 void CStopScheduler::RunL()
   171 	{
   172 	CActiveScheduler::Stop();
   173 	};
   174 
   175 CStopScheduler::CStopScheduler()
   176 		: CActive(EPriorityIdle)
   177 	{
   178 	CActiveScheduler::Add(this);
   179 	SetActive();
   180 	TRequestStatus* r = &iStatus;
   181 	User::RequestComplete(r, KErrNone);
   182 	}
   183 
   184 TInt TokenTypeInfoListTestsL()
   185 	{
   186 	test.Printf(_L("1.1,Testing getting all token types,"));
   187 	RCPointerArray<CCTTokenTypeInfo> myTokenTypes;
   188 	CleanupClosePushL(myTokenTypes);
   189 
   190 	CCTTokenTypeInfo::ListL(myTokenTypes);
   191 
   192 	if (myTokenTypes.Count() < 6)
   193 		{
   194 		CleanupStack::PopAndDestroy();
   195 		test.Printf(_L("FAILED\r\n"));
   196 		return (1);
   197 		}
   198 
   199 	myTokenTypes.ResetAndDestroy();
   200 	test.Printf(_L("PASSED\r\n"));
   201 
   202 	test.Printf(_L("1.2,Testing user-supplied filter,"));
   203 	TNoTokenTypes filter;
   204 	CCTTokenTypeInfo::ListL(myTokenTypes, filter);
   205 
   206 	if (myTokenTypes.Count() > 0)
   207 		{
   208 		CleanupStack::PopAndDestroy();
   209 		test.Printf(_L("FAILED\r\n"));
   210 		return (2);
   211 		}
   212 
   213 	myTokenTypes.ResetAndDestroy();
   214 	test.Printf(_L("PASSED\r\n"));
   215 
   216 	test.Printf(_L("1.3,Testing finding filters matching 1 interface,"));
   217 	RArray<TUid> a;
   218 	TUid aa = {gInterfaceA};
   219 	User::LeaveIfError(a.Append(aa));
   220 	CleanupClosePushL(a);
   221 	TCTFindTokenTypesByInterface findA(a.Array());
   222 	CCTTokenTypeInfo::ListL(myTokenTypes, findA);
   223 	if (myTokenTypes.Count() != 4)
   224 		{
   225 		CleanupStack::PopAndDestroy(2);
   226 		test.Printf(_L("FAILED\r\n"));
   227 		return (3);
   228 		}
   229 	TInt findAResults[] = {1,4,5,6};
   230 	TInt flag[] = {1,1,1,1};
   231 	for (TInt ii = 0; ii < 4; ii++)
   232 		{
   233 		TInt count = 0;
   234 		TInt iii=0;
   235 		TBuf<20> matchString;
   236 		_LIT(format, "Test Token Type %d");
   237 		matchString.Format(format, findAResults[iii]);
   238 		TBuf<20> idisplay_name= myTokenTypes[ii]->Label();
   239         
   240         if (matchString.Compare(idisplay_name))
   241         	count++;
   242         else
   243         	{
   244         	if(flag[0]==1)
   245         		flag[0]=0;	
   246         	else
   247         		count++;
   248         	}
   249         matchString.Format(format, findAResults[iii+1]);
   250         if (matchString.Compare(idisplay_name))
   251         	count++;
   252         else
   253         	{
   254         	if(flag[1]==1)
   255         		flag[1]=0;	
   256         	else
   257         		count++;
   258         	}
   259         matchString.Format(format, findAResults[iii+2]);
   260         if (matchString.Compare(idisplay_name))
   261         	count++;
   262         else
   263         	{
   264         	if(flag[2]==1)
   265         		flag[2]=0;	
   266         	else
   267         		count++;
   268         	}
   269         matchString.Format(format, findAResults[iii+3]);
   270         if (matchString.Compare(idisplay_name))
   271         	count++;
   272         else
   273         	{
   274         	if(flag[3]==1)
   275         		flag[3]=0;	
   276         	else
   277         		count++;
   278         	}
   279         if(count==4)
   280         	{
   281         	CleanupStack::PopAndDestroy(2);
   282 			test.Printf(_L("FAILED\r\n"));
   283 			return (4);
   284         	}
   285        } 
   286 			
   287 	myTokenTypes.ResetAndDestroy();
   288 	test.Printf(_L("PASSED\r\n"));
   289 
   290 	test.Printf(_L("1.5,Testing finding filters matching 2 interfaces,"));
   291 	TUid aAndB[] = {{gInterfaceA}, {gInterfaceB}};
   292 	TTestArray<TUid> aAndBArray(aAndB, 2);
   293 	TCTFindTokenTypesByInterface findAAndB(aAndBArray.Array());
   294 	CCTTokenTypeInfo::ListL(myTokenTypes, findAAndB);
   295 	if (myTokenTypes.Count() != 2)
   296 		{
   297 		CleanupStack::PopAndDestroy(2);
   298 		test.Printf(_L("FAILED\r\n"));
   299 		return (5);
   300 		}
   301 	TInt findAAndBResults[] = {4,6};
   302 	TInt flag1[] = {1,1};
   303 	for (TInt jj = 0; jj < 2; jj++)
   304 		{
   305 		TInt count = 0;
   306 		TInt jjj=0;
   307 		TBuf<20> matchString;
   308 		_LIT(format, "Test Token Type %d");
   309 		matchString.Format(format, findAAndBResults[jjj]);
   310 		TBuf<20> idisplay_name = myTokenTypes[jj]->Label();
   311 		if (matchString.Compare(idisplay_name))
   312         	count++;
   313         else
   314         	{
   315         	if(flag1[0]==1)
   316         		flag1[0]=0;	
   317         	else
   318         		count++;
   319         	}
   320         matchString.Format(format, findAAndBResults[jjj+1]);
   321         if (matchString.Compare(idisplay_name))
   322         	count++;
   323         else
   324         	{
   325         	if(flag1[1]==1)
   326         		flag1[1]=0;	
   327         	else
   328         		count++;
   329         	}
   330         if(count==2)
   331         	{
   332         	CleanupStack::PopAndDestroy(2);
   333 			test.Printf(_L("FAILED\r\n"));
   334 			return (6);
   335         	}
   336         }
   337 		
   338 	// NOTE No ResetAndDestroy
   339 	test.Printf(_L("PASSED\r\n"));
   340 
   341 	test.Printf(_L("1.6,Testing appending interface infos,"));
   342 	CCTTokenTypeInfo::ListL(myTokenTypes, findA);
   343 	if (myTokenTypes.Count() != 6)
   344 		{
   345 		CleanupStack::PopAndDestroy(2);
   346 		test.Printf(_L("FAILED\r\n"));
   347 		return (7);
   348 		}
   349 	TInt flag2[] = {1,1,1,1};
   350 	for (TInt kk = 0; kk < 4; kk++)
   351 		{
   352 		TInt count = 0;
   353 		TInt kkk=0;
   354 		TBuf<20> matchString;
   355 		_LIT(format, "Test Token Type %d");
   356 		matchString.Format(format, findAResults[kkk]);
   357 		TBuf<20> idisplay_name = myTokenTypes[kk+2]->Label();
   358 		if (matchString.Compare(idisplay_name))
   359         	count++;
   360         else
   361         	{
   362         	if(flag2[0]==1)
   363         		flag2[0]=0;	
   364         	else
   365         		count++;
   366         	}
   367         matchString.Format(format, findAResults[kkk+1]);
   368         if (matchString.Compare(idisplay_name))
   369         	count++;
   370         else
   371         	{
   372         	if(flag2[1]==1)
   373         		flag2[1]=0;	
   374         	else
   375         		count++;
   376         	}
   377         matchString.Format(format, findAResults[kkk+2]);
   378         if (matchString.Compare(idisplay_name))
   379         	count++;
   380         else
   381         	{
   382         	if(flag2[2]==1)
   383         		flag2[2]=0;	
   384         	else
   385         		count++;
   386         	}
   387         matchString.Format(format, findAResults[kkk+3]);
   388         if (matchString.Compare(idisplay_name))
   389         	count++;
   390         else
   391         	{
   392         	if(flag2[3]==1)
   393         		flag2[3]=0;	
   394         	else
   395         		count++;
   396         	}
   397         if(count==4)
   398         {
   399         	CleanupStack::PopAndDestroy(2);
   400 			test.Printf(_L("FAILED\r\n"));
   401 			return (8);
   402         }
   403      } 
   404 		
   405 	test.Printf(_L("PASSED\r\n"));
   406 
   407 	myTokenTypes.ResetAndDestroy();
   408 	test.Printf(_L("1.7,Testing filtering by interface and attribute,"));
   409 	TCTTokenTypeAttribute att = {{gAttribute1}, 1};
   410 	RArray<TCTTokenTypeAttribute> attArray(sizeof(TCTTokenTypeAttribute), &att,
   411 										   1);
   412 	TCTFindTokenTypesByInterfaceAndAttribute findAWithAtt1(a.Array(),
   413 														   attArray.Array());
   414 	CCTTokenTypeInfo::ListL(myTokenTypes, findAWithAtt1);
   415 	if (myTokenTypes.Count() != 1)
   416 		{
   417 		CleanupStack::PopAndDestroy(2);
   418 		test.Printf(_L("FAILED\r\n"));
   419 		return (9);
   420 		}
   421 	_LIT(KMatch, "Test Token Type 6");
   422 	if (myTokenTypes[0]->Label() != KMatch)
   423 		{
   424 		CleanupStack::PopAndDestroy(2);
   425 		test.Printf(_L("FAILED\r\n"));
   426 		return (10);
   427 		}
   428 	test.Printf(_L("PASSED\r\n"));
   429 
   430 	CleanupStack::PopAndDestroy(2);
   431 	return KErrNone;
   432 	};
   433 
   434 TInt TokenTypeInfoTestsL()
   435 	{
   436 	test.Printf(_L("2.1,Testing token type for tests,"));
   437 	RCPointerArray<CCTTokenTypeInfo> myTokenTypes;
   438 	CleanupClosePushL(myTokenTypes);
   439 	TUid aABndC[] = {{gInterfaceA}, {gInterfaceB}, {gInterfaceC}};
   440 	TTestArray<TUid> aABndCArray(aABndC, 3);
   441 	TCTFindTokenTypesByInterface findABAndC(aABndCArray.Array());
   442 	CCTTokenTypeInfo::ListL(myTokenTypes, findABAndC);
   443 	if (myTokenTypes.Count() != 1)
   444 		{
   445 		CleanupStack::PopAndDestroy();
   446 		test.Printf(_L("FAILED\r\n"));
   447 		return (1);
   448 		}
   449 	test.Printf(_L("PASSED\r\n"));
   450 
   451 	test.Printf(_L("2.2,Test UID function,"));
   452 	CCTTokenTypeInfo* info = myTokenTypes[0];	
   453 	if (info->Type().iUid != gImplementation6)
   454 		{
   455 		CleanupStack::PopAndDestroy();
   456 		test.Printf(_L("FAILED\r\n"));
   457 		return (1);
   458 		}
   459 	test.Printf(_L("PASSED\r\n"));
   460 
   461 	test.Printf(_L("2.3,Test getting an array of interfaces,"));
   462 	RArray<TUid> interfaces = info->Interfaces();
   463 	if (interfaces.Count() != 3)
   464 		{
   465 		CleanupStack::PopAndDestroy();
   466 		test.Printf(_L("FAILED\r\n"));
   467 		return (4);
   468 		}
   469 	TUid refInterfaces[] = {{gInterfaceA}, {gInterfaceB}, {gInterfaceC}};
   470 	for (TInt ii = 0; ii < 3; ii++)
   471 		{
   472 		if (interfaces[ii] != refInterfaces[ii])
   473 			{
   474 			CleanupStack::PopAndDestroy();
   475 			test.Printf(_L("FAILED\r\n"));
   476 			return (5);
   477 			}
   478 		}
   479 	test.Printf(_L("PASSED\r\n"));
   480 
   481 	test.Printf(_L("2.4,Test getting an array of attributes,"));
   482 	RArray<TCTTokenTypeAttribute> attributes = info->Attributes();
   483 	if (attributes.Count() != 2)
   484 		{
   485 		CleanupStack::PopAndDestroy();
   486 		test.Printf(_L("FAILED\r\n"));
   487 		return (8);
   488 		}
   489 	TCTTokenTypeAttribute refAttributes[] =
   490 		{{{gAttribute2}, 2}, {{gAttribute1}, 1}};
   491 	for (TInt jj = 0; jj < 2; jj++)
   492 		{
   493 		if (attributes[jj].iUID != refAttributes[jj].iUID ||
   494 			attributes[jj].iVal != refAttributes[jj].iVal)
   495 			{
   496 			CleanupStack::PopAndDestroy();
   497 			test.Printf(_L("FAILED\r\n"));
   498 			return (9);
   499 			}
   500 		}
   501 	test.Printf(_L("PASSED\r\n"));
   502 
   503 	test.Printf(_L("2.5,Test getting the label,"));
   504 	_LIT(KLabel, "Test Token Type 6");
   505 	if (info->Label() != KLabel)
   506 		{
   507 		CleanupStack::PopAndDestroy();
   508 		test.Printf(_L("FAILED\r\n"));
   509 		return (10);
   510 		}
   511 	test.Printf(_L("PASSED\r\n"));
   512 
   513 	test.Printf(_L("2.6,Test getting the type of the token type,"));
   514 	TUid impl6 = {gImplementation6};
   515 	if (info->Type() != impl6)
   516 		{
   517 		CleanupStack::PopAndDestroy();
   518 		test.Printf(_L("FAILED\r\n"));
   519 		return (11);
   520 		}
   521 	test.Printf(_L("PASSED\r\n"));
   522 
   523 	CleanupStack::PopAndDestroy();
   524 	return KErrNone;
   525 	}
   526 
   527 
   528 TInt TestTokenTypeL(MCTTokenType* aTokenType, TInt aNum)
   529 	{
   530 	test.Printf(_L("3.4.1,Getting token info,"));
   531 	RCPointerArray<HBufC> tokenInfo;
   532 	CleanupClosePushL(tokenInfo);
   533 	TRequestStatus status = KRequestPending;
   534 	aTokenType->List(tokenInfo, status);
   535 	// Cancel call is pointelss as it does nothing in the test
   536 	// plugin. But it won't do any harm to check it doesn't explode.
   537 	aTokenType->CancelList();
   538 	User::WaitForRequest(status);
   539 	if (status.Int() != KErrNone || tokenInfo.Count() != 1)
   540 		{
   541 		CleanupStack::PopAndDestroy();
   542 		test.Printf(_L("FAILED\r\n"));
   543 		return (100);
   544 		}
   545 	test.Printf(_L("PASSED\r\n"));
   546 
   547 	test.Printf(_L("3.4.1,Checking token type name,"));
   548 	TBuf<20> buf;
   549 	_LIT(KLabelFormat, "Test Token Type %d");
   550 	buf.Format(KLabelFormat, aNum);
   551 	if (aTokenType->Label().Compare(buf))
   552 		{
   553 		CleanupStack::PopAndDestroy();
   554 		test.Printf(_L("FAILED\r\n"));
   555 		return (105);
   556 		}
   557 	test.Printf(_L("PASSED\r\n"));
   558 
   559 	test.Printf(_L("3.4.2,Checking token type Type UID,"));
   560 	TUid uid = {gImplementation5 + 5 - aNum};
   561 	if (aTokenType->Type() != uid)
   562 		{
   563 		CleanupStack::PopAndDestroy();
   564 		test.Printf(_L("FAILED\r\n"));
   565 		return (105);
   566 		}
   567 	test.Printf(_L("PASSED\r\n"));
   568 
   569 	test.Printf(_L("3.4.3,Checking token name,"));
   570 	_LIT(KFormat, "Test Token %d");
   571 	buf.Format(KFormat, aNum);
   572 	if (buf.Compare(*tokenInfo[0]))
   573 		{
   574 		CleanupStack::PopAndDestroy();
   575 		test.Printf(_L("FAILED\r\n"));
   576 		return (101);
   577 		}
   578 	test.Printf(_L("PASSED\r\n"));
   579 
   580 	test.Printf(_L("3.4.4,Opening token,"));
   581 	status = KRequestPending;
   582 	MCTToken* token;
   583 	aTokenType->OpenToken(*tokenInfo[0], token, status);
   584 	// Cancel call will fail as token isn't opened asynchronous. Check
   585 	// that the reference counting still works.
   586 	aTokenType->CancelOpenToken();
   587 	User::WaitForRequest(status);
   588 	if (status.Int() != KErrNone)
   589 		{
   590 		CleanupStack::PopAndDestroy();
   591 		test.Printf(_L("FAILED\r\n"));
   592 		return (102);
   593 		}
   594 	token->Release();
   595 	test.Printf(_L("PASSED\r\n"));
   596 
   597 	test.Printf(_L("3.4.5,Opening token by handle,"));
   598 	status = KRequestPending;
   599 	TCTTokenHandle handle(aTokenType->Type(), 1);
   600 	aTokenType->OpenToken(handle, token, status);
   601 	User::WaitForRequest(status);
   602 	if (status.Int() != KErrNone)
   603 		{
   604 		CleanupStack::PopAndDestroy();
   605 		test.Printf(_L("FAILED\r\n"));
   606 		return (102);
   607 		}
   608 	test.Printf(_L("PASSED\r\n"));
   609 
   610 	test.Printf(_L("3.4.6,Checking token's TokenType() function,"));
   611 	if (&token->TokenType() != aTokenType)
   612 		{
   613 		CleanupStack::PopAndDestroy();
   614 		test.Printf(_L("FAILED\r\n"));
   615 		return (102);
   616 		}
   617 	test.Printf(_L("PASSED\r\n"));
   618 
   619 	_LIT(KVersion, "The Ultimate Version");
   620 	_LIT(KSerial, "Serial No. 1");
   621 	_LIT(KManufacturer, "ACME Corporation");
   622 
   623 	test.Printf(_L("3.4.6.1,Checking token's Information() function,"));
   624 	if (token->Information(MCTToken::EVersion) != KVersion ||
   625 		token->Information(MCTToken::ESerialNo) != KSerial ||
   626 		token->Information(MCTToken::EManufacturer)  != KManufacturer)
   627 		{
   628 		CleanupStack::PopAndDestroy();
   629 		test.Printf(_L("FAILED\r\n"));
   630 		return (102);
   631 		}
   632 	test.Printf(_L("PASSED\r\n"));
   633 
   634 	test.Printf(_L("3.4.7,Registering for removal notification,"));
   635 	// This is another test to check that an API doesn't crash. We
   636 	// call the base NotifyOnRemoval/CancelNotify functions and check
   637 	// they do nothing! There's no point in creating derived versions
   638 	// that do something as that would be testing the test plugin, not
   639 	// the framework.
   640 	TRequestStatus removalStatus;
   641 	token->NotifyOnRemoval(removalStatus);
   642 	token->CancelNotify();
   643 	test.Printf(_L("PASSED\r\n"));
   644 
   645 	test.Printf(_L("3.4.9,Testing cancellation of async interface opening,"));
   646 	MTestInterface* interface;
   647 	MCTTokenInterface* temp;
   648 	TUid intB = {gInterfaceB};
   649 	token->GetInterface(intB, temp, status);
   650 	token->CancelGetInterface();
   651 	test.Printf(_L("PASSED\r\n"));
   652 
   653 	test.Printf(_L("3.4.10,Opening an interface,"));
   654 	status = KRequestPending;
   655 	TUid intC = {gInterfaceC};
   656 	token->GetInterface(intC, temp, status);
   657 	interface = static_cast<MTestInterface*>(temp);
   658 	// Cancel call is pointelss as it does nothing in the test
   659 	// plugin. But it won't do any harm to check it doesn't explode.
   660 	token->CancelGetInterface();
   661 	CleanupReleasePushL(*interface);
   662 	token->Release();
   663 	User::WaitForRequest(status);
   664 	if (status.Int() != KErrNone)
   665 		{
   666 		CleanupStack::PopAndDestroy(2);
   667 		test.Printf(_L("FAILED\r\n"));
   668 		return (103);
   669 		}
   670 	test.Printf(_L("PASSED\r\n"));
   671 
   672 	test.Printf(_L("3.4.11,Checking interface name,"));
   673 	if (buf.Compare(interface->Label()))
   674 		{
   675 		CleanupStack::PopAndDestroy(2);
   676 		test.Printf(_L("FAILED\r\n"));
   677 		return (104);
   678 		}
   679 	test.Printf(_L("PASSED\r\n"));
   680 
   681 	test.Printf(_L("3.4.12,Getting an object,"));
   682 	MTestObject* object = interface->ObjectL();
   683 	object->Release();
   684 	test.Printf(_L("PASSED\r\n"));
   685 
   686 	CleanupStack::PopAndDestroy(2);
   687 	return KErrNone;
   688 	}
   689 
   690 TInt TokenTypeTestsL()
   691 	{
   692 	test.Printf(_L("3.1,Getting token types for tests,"));
   693 	RFs fs;
   694 	RCPointerArray<CCTTokenTypeInfo> myTokenTypes;
   695 	CleanupClosePushL(myTokenTypes);
   696 	TUid aABndC[] = {{gInterfaceA}, {gInterfaceB}, {gInterfaceC}};
   697 	TTestArray<TUid> aABandCArray(aABndC, 3);
   698 	TCTFindTokenTypesByInterface findABAndC(aABandCArray.Array());
   699 	CCTTokenTypeInfo::ListL(myTokenTypes, findABAndC);
   700 	if (myTokenTypes.Count() != 1)
   701 		{
   702 		CleanupStack::PopAndDestroy();
   703 		test.Printf(_L("FAILED\r\n"));
   704 		return (1);
   705 		}
   706 	test.Printf(_L("PASSED\r\n"));
   707 
   708 	test.Printf(_L("3.2,Loading token type 6,"));
   709 	MCTTokenType* token6 = MCTTokenType::NewL(*myTokenTypes[0], fs);
   710 	if (!token6)
   711 		{
   712 		CleanupStack::PopAndDestroy();
   713 		test.Printf(_L("FAILED\r\n"));
   714 		return (1);
   715 		}
   716 	CleanupReleasePushL(*token6);
   717 	test.Printf(_L("PASSED\r\n"));
   718 
   719 	TInt ret = TestTokenTypeL(token6, 6);
   720 	if (ret)
   721 		{
   722 		CleanupStack::PopAndDestroy(2);
   723 		return ret;
   724 		}
   725 
   726 	test.Printf(_L("3.3,Loading token type 5,"));
   727 	TUid UID5 = {gImplementation5};
   728 	MCTTokenType* token5 = MCTTokenType::NewL(UID5, fs);
   729 	if (!token5)
   730 		{
   731 		CleanupStack::PopAndDestroy(2);
   732 		test.Printf(_L("FAILED\r\n"));
   733 		return (2);
   734 		}
   735 	CleanupReleasePushL(*token5);
   736 	test.Printf(_L("PASSED\r\n"));
   737 
   738 	ret = TestTokenTypeL(token5, 5);
   739 	CleanupStack::PopAndDestroy(3);
   740 
   741 	return ret;
   742 	}
   743 
   744 TInt MemoryTestL(TInt (*aFnToTest)())
   745 	{
   746 	gLogging = EFalse;
   747 	for (TInt ii = 1; ; ii++)
   748 		{
   749 		if (ii % 10)
   750 			test.Printf(_L("."));
   751 		else
   752 			test.Printf(_L("*"));
   753 		if (!(ii % 50))
   754 			test.Printf(_L("\r\n"));
   755 		gSilent = ETrue;
   756 		__UHEAP_MARK;
   757 		__UHEAP_FAILNEXT(ii);
   758 		TRAPD(err,aFnToTest());
   759 		__UHEAP_RESET;
   760 		REComSession::FinalClose();
   761 		__UHEAP_MARKEND;
   762 		User::Heap().Check();
   763 		gSilent = EFalse;
   764 		if (err != KErrNoMemory)
   765 			{
   766 			test.Printf(_L("\r\n"));
   767 			gLogging = ETrue;
   768 			return err;
   769 			}
   770 		}
   771 	}
   772 
   773 void TestsL(void)
   774 	{
   775 	CActiveScheduler* as = new(ELeave) CActiveScheduler;
   776 	CActiveScheduler::Install(as);
   777 
   778 	TInt errors = 0;
   779 	TInt ret;
   780 	__UHEAP_MARK;
   781 	ret = TokenTypeInfoListTestsL();
   782 	REComSession::FinalClose();
   783 	__UHEAP_MARKEND;
   784 	if (ret)
   785 		{
   786 		test.Printf(_L("1.9,ERROR %d in Info List test,FAILED\r\n"),ret);
   787 		errors++;
   788 		}
   789 	else
   790 		{
   791 		test.Printf(_L("1.9,Info List test,PASSED\r\n"),ret);
   792 		}
   793 	__UHEAP_MARK;
   794 	ret = TokenTypeInfoTestsL();
   795 	REComSession::FinalClose();
   796 	__UHEAP_MARKEND;
   797 	if (ret)
   798 		{
   799 		test.Printf(_L("2.9,ERROR %d in Info test,FAILED\r\n"),ret);
   800 		errors++;
   801 		}
   802 	else
   803 		{
   804 		test.Printf(_L("2.9,Info test,PASSED\r\n"),ret);
   805 		}
   806 
   807 	__UHEAP_MARK;
   808 	ret = TokenTypeTestsL();
   809 	REComSession::FinalClose();
   810 	__UHEAP_MARKEND;
   811 	if (ret)
   812 		{
   813 		test.Printf(_L("3.9,ERROR %d in token test,FAILED\r\n"),ret);
   814 		errors++;
   815 		}
   816 	else
   817 		{
   818 		test.Printf(_L("3.9,token test,PASSED\r\n"),ret);
   819 		}
   820 
   821 	ret = MemoryTestL(TokenTypeInfoListTestsL);
   822 	if (ret)
   823 		{
   824 		test.Printf(_L("4.9,ERROR %d in Info List memory test,FAILED\r\n"),ret);
   825 		errors++;
   826 		}
   827 	else
   828 		{
   829 		test.Printf(_L("4.9,Info List memory test,PASSED\r\n"),ret);
   830 		}
   831 	ret = MemoryTestL(TokenTypeTestsL);
   832 	if (ret)
   833 		{
   834 		test.Printf(_L("5.9,ERROR %d in Token Type memory test,FAILED\r\n"),ret);
   835 		errors++;
   836 		}
   837 	else
   838 		{
   839 		test.Printf(_L("5.9,Token Type memory test,PASSED\r\n"),ret);
   840 		}
   841 
   842 	test.Printf(_L("%d tests failed out of 44 hardcoded\r\n"), errors);
   843 
   844 
   845 	if (errors)
   846 		{
   847 		test.Printf(_L("%d TESTS FAILED\r\n"),errors);
   848 		}
   849 	else
   850 		{
   851 		test.Printf(_L("ALL TESTS PASSED\r\n"));
   852 		}
   853 
   854 	delete as;
   855 	}
   856 
   857 GLDEF_C TInt E32Main(void)
   858 
   859 	{
   860 	CTrapCleanup* cleanup;
   861 	cleanup=CTrapCleanup::New();
   862 	test.Start(_L(" @SYMTestCaseID:SEC-CRYPTOTOKENS-CTFRAMEWORK-0001 Starting token framework tests\r\n"));		 
   863 	CTestConsole* con=NULL;
   864 	TRAPD(ret,con=CTestConsole::NewL(test.Console()));
   865 	RFs fs;
   866 	if (gLogging)
   867 		{
   868 		User::LeaveIfError(fs.Connect());
   869 		RFile* file;
   870 		file=new (ELeave) RFile;
   871 		TDriveUnit sysDrive (fs.GetSystemDrive());
   872 		TDriveName driveName(sysDrive.Name());
   873 		TBuf<64> logFile (driveName);
   874 		logFile.Append(_L("\\T_CTFrameworkLog.txt"));
   875 		User::LeaveIfError(file->Replace(fs, logFile, EFileShareAny|EFileWrite));
   876 		con->SetLogFile(file);
   877 		}
   878 	test.SetConsole(con);
   879 	TRAP(ret,TestsL());
   880 	if (ret)
   881 		{
   882 		test.Printf(_L("Unexpected leave\r\n"));
   883 		}
   884 	gLogging=EFalse;
   885 	test.Close();
   886 	delete cleanup;
   887 	return(KErrNone);
   888 	}