cryptoservices/certificateandkeymgmt/tcertstore/t_testcertfordeletable.cpp
changeset 8 35751d3474b7
parent 0 2c201484c85f
--- a/cryptoservices/certificateandkeymgmt/tcertstore/t_testcertfordeletable.cpp	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/certificateandkeymgmt/tcertstore/t_testcertfordeletable.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -1,592 +1,592 @@
-/*
-* Copyright (c) 2004-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 "t_testcertfordeletable.h"
-#include "t_certstoredefs.h"
-#include "t_input.h"
-#include "t_certstoreout.h"
-
-#include "t_WritableCSDummies.h"
-
-
-CTestAction* CTestCertForDeletable::NewL(RFs& aFs,
-								   CConsoleBase& aConsole, 
-								   Output& aOut, 
-								   const TTestActionSpec& aTestActionSpec)
-	{
-	CTestCertForDeletable* self = new(ELeave) CTestCertForDeletable(aFs, aConsole, aOut);
-	CleanupStack::PushL(self);
-	self->ConstructL(aTestActionSpec);
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-CTestCertForDeletable::~CTestCertForDeletable()
-	{
-	delete iCertificate;
-	delete iCertificateURL;
-	delete iCertificateContent;
-	delete iCertificateLabel;
-	}
-
-void CTestCertForDeletable::TestSerializationL(	MCTToken& aToken,
-												TKeyIdentifier* aIssuerKeyId,
-												TKeyIdentifier* aSubjectKeyId, 
-												const TInt aCertificateId,
-												const TDesC8* aIssuerHash )
-	{
-	CCTCertInfo* cert = CCTCertInfo::NewLC( *iCertificateLabel,	// const TDesC& 
-											iCertificateFormat,	// TCertificateFormat
-											iOwnerType, 		// TCertificateOwnerType
-											999, 				// TInt aSize | aCert.Length()
-											aSubjectKeyId,		// const TKeyIdentifier*
-											aIssuerKeyId,		// const TKeyIdentifier* 
-											aToken,	 			// MCTToken&
-											aCertificateId,		// TInt aCertificateId
-											iDeletable,			// TBool
-											aIssuerHash );		// const TDesC8* aIssuerHash = NULL	
-																
-													// cert -> stack
-	RFs fs;
-	User::LeaveIfError(fs.Connect());
-	CleanupClosePushL(fs);							// . fs -> stack
-
-	// this is a name of the file that will be opened as 
-	// a stream to test externalize/internalize
-	TDriveUnit sysDrive (fs.GetSystemDrive());
-	TBuf<24> fileName (sysDrive.Name());
-	fileName.Append(_L("\\certinfo.dat"));
-
-	RFileWriteStream write_stream;
-	User::LeaveIfError( write_stream.Replace(fs, fileName, EFileWrite) );
-	CleanupClosePushL(write_stream);				// . . write_stream -> stack
-
-	cert->ExternalizeL(write_stream);						
-	CleanupStack::PopAndDestroy();					// . . write_stream <- pop
-		
-	// now internalize back from stream
-	RFileReadStream read_stream;
-	User::LeaveIfError( read_stream.Open(fs, fileName, EFileRead) );
-	CleanupClosePushL(read_stream);					// . . read_stream -> stack
-
-	CCTCertInfo* cert_read =
-					CCTCertInfo::NewLC(read_stream, aToken); // does InternalizeL()
-													// . . . cert_read -> stack
-	// log certinfo params just internalized
-	iOut.writeString(_L("Cert attributes after internalize:"));
-	iOut.writeNewLine();
-	WriteFormat( cert_read->CertificateFormat() );
-	iOut.writeString(_L("\tiDeletable  = "));
-	iDeletable ? iOut.writeString(KTrue) : iOut.writeString(KFalse);
-	iOut.writeNewLine();
-	iOut.writeNewLine();
-			
-	// set result
-	iResultGood = ETrue; 
-	// check deletable flag is persistent
-	if ( cert_read->IsDeletable() != iDeletable )
-		{
-		iResultGood = EFalse; 
-		}
-	// check format is persistent
-	if ( cert_read->CertificateFormat() != iCertificateFormat )
-		{
-		iResultGood = EFalse; 
-		}			
-	
-	// cleanup
-	CleanupStack::PopAndDestroy(cert_read);			// . . . cert_read <- pop
-	CleanupStack::PopAndDestroy();					// . . read_stream <- pop
-	CleanupStack::PopAndDestroy(&fs); 				// . fs <- pop
-	CleanupStack::PopAndDestroy(cert);				// initial certinfo <- pop
-	}
-
-void CTestCertForDeletable::PerformAction(TRequestStatus& aStatus)
-	{
-// 	COMMON PART
-	MCTWritableCertStore& ustore = 
-			UnifiedCertStore().WritableCertStore(iStoreIndex);
-	MCTToken& token = ustore.Token();
-
-	TKeyIdentifier* issuerKeyId = NULL;
-	TKeyIdentifier* subjectKeyId = NULL;
-
-	if (iOwnerType != ECACertificate)
-		{
-		issuerKeyId = & iIssuerKeyId;
-		subjectKeyId = & iSubjectKeyId;
-		}
-
-	const TInt KCertificateId = 0x00000213;
-	_LIT8(KSomeHash, "\x70\xe4\xf4\x54\x5f\x8e\xe6\xf2\xbd\x4e\x76\x2b\x8d\xa1\x83\xd8\xe0\x5d\x4a\x7d");
-
-	// create some certinfo object
-	ASSERT(iCertificateLabel);
-		
-	switch (iState)
-		{
-		case ETestSerialization:
-			{
-			iOut.writeString(_L("Checking serialization for a certificate..."));
-			iOut.writeNewLine();			
-
-			TRAPD( err, TestSerializationL( token, issuerKeyId, subjectKeyId,
-												 KCertificateId, &KSomeHash) );
-
-			TRequestStatus* status = &aStatus;
-			if (err != KErrNone )
-				{
-				// TestSerializationL() did leave
-				iResult = EFalse;
-				iResultGood = EFalse;
-				User::RequestComplete(status, err);
-				}
-			else
-				{
-				// TestSerializationL() passed ok
-				iResult = ETrue;
-				User::RequestComplete(status, aStatus.Int());
-				}					
-			// set next state
-			iState = EFinished;
-			}
-			break;
-		
-			
-		case ETestNewCSClasswDeletable:			// check mctwritablecertstore
-			{
-			iOut.writeString(_L("Testing MCTWritableCertStore::Add() w deletable..."));
-			iOut.writeNewLine();
-
-			// create a writablestore supporting new Add()
-			TNewCSClasswDeletable storeNew;
-			
-			// call new Add()
-			storeNew.Add( *iCertificateLabel, 
-						  iCertificateFormat, 
-						  iOwnerType,
-						  subjectKeyId, 
-						  issuerKeyId, 
-						  *iCertificateContent,	// this is probably unset 
-						  iDeletable,
-						  aStatus);
-						  
-			iResultGood = ETrue; 						  						
-			iState = EFinished;
-			}
-			break;
-
-
-		case ETestOldCSClasswoDeletable:		// check mctwritablecertstore
-			{
-
-			iOut.writeString(_L("Testing new MCTWritableCertStore::Add() on old class..."));
-			iOut.writeNewLine();
- 
-			// create a writablestore that does not have new Add()
-			TOldCSClasswoDeletable storeOld;
-			
-			// call new Add(), expect to get KErrNotSupported
-			storeOld.Add( *iCertificateLabel, 
-						  iCertificateFormat, 
-						  iOwnerType,
-						  subjectKeyId, 
-						  issuerKeyId, 
-						  *iCertificateContent,	// this is probably unset 
-						  iDeletable,
-						  aStatus);
-			iResultGood = ETrue; 						  						
-			iState = EFinished;
-			
-			TRequestStatus* status = &aStatus;
-			User::RequestComplete(status, aStatus.Int());
-			}
-			break;
-
-
-		case EFinished:
-			{
-			
-			if (aStatus == KErrNone)
-				{
-				iResult = ETrue;
-				}
-			else
-			 	if (aStatus == iExpectedResult)
-					{
-					iResult = ETrue;
-					iResultGood = ETrue;
-					}
-				else
-					{
-					iResult = EFalse;
-					iResultGood = ETrue;
-					}
-
-            if (aStatus != KErrNoMemory)
-                {
-                iFinished = ETrue;
-                }
-            
-			TRequestStatus* status = &aStatus;
-			User::RequestComplete(status, aStatus.Int());
-			}
-			break;
-
-		default:
-			break;
-		
-		} 	// switch ()
-
-	}  // CTestCertForDeletable::PerformAction()
-
-void CTestCertForDeletable::PerformCancel()
-	{
-	iState = EFinished;
-	MCTWritableCertStore& store = UnifiedCertStore().WritableCertStore(iStoreIndex);
-	store.CancelAdd();
-	}
-
-void CTestCertForDeletable::AfterOOMFailure()
-	{
-	}
-
-void CTestCertForDeletable::Reset()
-	{
-	iState = EFinished;
-	}
-
-void CTestCertForDeletable::DoReportAction()
-	{
-	iOut.writeString(_L("\tLabel = "));
-	iOut.writeString(*iCertificateLabel);
-	iOut.writeNewLine();
-	iOut.writeString(_L("\tOwner type = "));
-	WriteOwnerType();
-	WriteFormat(iCertificateFormat);
-	
-	iOut.writeString(_L("\tSubjectKeyId:  "));
-	iOut.writeOctetString(iSubjectKeyId);
-	iOut.writeNewLine();
-
-	iOut.writeString(_L("\tiDeletable  = "));
-	iDeletable ? iOut.writeString(KTrue) : iOut.writeString(KFalse);
-	iOut.writeNewLine();
-	iOut.writeNewLine();
-	}
-
-void CTestCertForDeletable::WriteFormat(TCertificateFormat aFormat)
-	{
-	iOut.writeString(_L("\tFormat = "));
-	switch (aFormat)
-		{
-		case EX509Certificate:
-			iOut.writeString(_L("X.509\n"));
-			break;
-			
-		case EWTLSCertificate:
-			iOut.writeString(_L("WTLS\n"));
-			break;
-			
-		case EX968Certificate:
-			iOut.writeString(_L("X968\n"));
-			break;
-			
-		case EX509CertificateUrl:
-			iOut.writeString(_L("X.509 URL\n"));
-			break;
-			
-		case EWTLSCertificateUrl:
-			iOut.writeString(_L("WTLS URL\n"));
-			break;
-			
-		case EX968CertificateUrl:
-			iOut.writeString(_L("X968 URL\n"));
-			break;
-			
-		default:
-			iOut.writeString(_L("Unknown format\n"));
-			break;
-		}
-	}
-
-void CTestCertForDeletable::WriteOwnerType()
-	{
-	switch (iOwnerType)
-		{
-		case ECACertificate:
-			iOut.writeString(_L("CA\n"));
-			break;
-			
-		case EUserCertificate:
-			iOut.writeString(_L("User"));
-			break;
-			
-		case EPeerCertificate:
-			iOut.writeString(_L("Peer"));
-			break;
-
-		default:
-			iOut.writeString(_L("Unknown"));
-			break;
-		}
-	}
-
-CTestCertForDeletable::CTestCertForDeletable(RFs& aFs, CConsoleBase& aConsole,
-								 Output& aOut)
-: CCertStoreTestAction(aFs, aConsole, aOut), iState(EFinished)
-	{
-	}
-
-void CTestCertForDeletable::ConstructL(const TTestActionSpec& aTestActionSpec)
-	{
-	CCertStoreTestAction::ConstructL(aTestActionSpec);
-
-	SetCertFormatL(Input::ParseElement(aTestActionSpec.iActionBody, KCertFormatStart));
-	SetCertOwnerTypeL(Input::ParseElement(aTestActionSpec.iActionBody, KCertOwnerTypeStart));
-	SetCertLabelL(Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart));
-	SetKeyId(iIssuerKeyId, Input::ParseElement(aTestActionSpec.iActionBody, KIssuerKeyStart));
-	SetKeyId(iSubjectKeyId, Input::ParseElement(aTestActionSpec.iActionBody, KSubjectKeyStart));
-	SetStoreToUse(Input::ParseElement(aTestActionSpec.iActionBody, KStoreToUseStart));
-	SetDeletable(Input::ParseElement(aTestActionSpec.iActionBody, KDeletableStart));
-	SetSubActionL(Input::ParseElement(aTestActionSpec.iActionBody, KSubActionStart));
-
-	// Setting the expected result
-	HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
-	TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
-	Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
-	CleanupStack::PopAndDestroy(result);
-	}
-
-void CTestCertForDeletable::SetKeyId(TKeyIdentifier& aKeyIdentifier, const TDesC8& aKeyInfo)
-	{
-	TInt size = aKeyInfo.Length();
-	for (TInt i = 0; i < size; i += 2)
-		{
-		TInt a = (aKeyInfo[i+1] >= 'a') ? (aKeyInfo[i+1] - 'a' + 10) : (aKeyInfo[i+1] - '0');
-		TInt b = (aKeyInfo[i] >= 'a') ? (aKeyInfo[i] - 'a' + 10) : (aKeyInfo[i] - '0');
-		aKeyIdentifier.Append(a  + b * 16);
-		}
-	}
-
-void CTestCertForDeletable::SetCertFormatL(const TDesC8& aFormat)
-	{
-	if (aFormat == KX509)
-		{
-		iCertificateFormat = EX509Certificate;
-		}
-	else if (aFormat == KWTLS)
-		{
-		iCertificateFormat = EWTLSCertificate;
-		}
-	else if (aFormat == KX968)
-		{
-		iCertificateFormat = EX968Certificate;
-		}
-	else if (aFormat == KX509URL)
-		{
-		iCertificateFormat = EX509CertificateUrl;
-		}
-	else if (aFormat == KWTLSURL)
-		{
-		iCertificateFormat = EWTLSCertificateUrl;
-		}
-	else if (aFormat == KX968URL)
-		{
-		iCertificateFormat = EX968CertificateUrl;
-		}	
-	else if (aFormat == KUnknown)
-		{
-		iCertificateFormat = EUnknownCertificate;
-		}
-	else
-		{
-		iOut.write(_L("Unrecognized cert format: "));
-		iOut.writeString(aFormat);
-		iOut.writeNewLine();		   
-		User::Leave(KErrArgument);
-		}
-	}
-
-void CTestCertForDeletable::SetCertOwnerTypeL(const TDesC8& aOwnerType)
-	{
-	if (aOwnerType == KCACert)
-		{
-		iOwnerType = ECACertificate;
-		}
-	else if (aOwnerType == KUserCert)
-		{
-		iOwnerType = EUserCertificate;
-		}
-	else if (aOwnerType == KPeerCert)
-		{
-		iOwnerType = EPeerCertificate;
-		}
-	else if (aOwnerType == KUnknown)
-		{
-		// set dummy bogus owner type
-		iOwnerType = static_cast<TCertificateOwnerType>(EPeerCertificate + 1);
-		}
-	else
-		{
-		iOut.write(_L("Unknown cert owner type: "));
-		iOut.writeString(aOwnerType);
-		iOut.writeNewLine();		   
-		User::Leave(KErrArgument);
-		}
-	}
-
-void CTestCertForDeletable::SetSubActionL(const TDesC8& aStringVal)
-	{
-	if (aStringVal == KTestSerialization)
-		{
-		iState = ETestSerialization;
-		}
-	else if (aStringVal == KTestNewCSClasswDeletable)
-		{
-		iState = ETestNewCSClasswDeletable;
-		}
-	else if (aStringVal == KTestOldCSClasswoDeletable)
-		{
-		iState = ETestOldCSClasswoDeletable;
-		}
-
-	else
-		{
-		iOut.write(_L("Unknown subaction type: "));
-		iOut.writeString(aStringVal);
-		iOut.writeNewLine();		   
-		User::Leave(KErrArgument);
-		}
-	}
-
-
-void CTestCertForDeletable::SetCertLabelL(const TDesC8& aLabel)
-	{
-	delete iCertificateLabel;
-	iCertificateLabel = NULL;
-	iCertificateLabel = HBufC::NewL(aLabel.Length());
-	TPtr ptr = iCertificateLabel->Des();
-	ptr.Copy(aLabel);
-	}
-	
-
-
-void CTestCertForDeletable::SetStoreToUse(const TDesC8& aStoreToUse)
-	{
-	TLex8 lex(aStoreToUse);
-	lex.Val(iStoreIndex);
-	}
-	
-void CTestCertForDeletable::SetDeletable(const TDesC8& aStringVal)
-	{
-	TLex8 lex(aStringVal);
-	lex.Val(iDeletable);
-	}
-
-void CTestCertForDeletable::SetCertificateContentL(const TDesC8& aFileName)
-	{
-	TFileName fileName;
-	fileName.Copy(aFileName);
-	RFs fs; 
-	User::LeaveIfError(fs.Connect());
-	CleanupClosePushL(fs);
-	__ASSERT_DEBUG(!iCertificateContent, User::Panic(_L("CTestCertForDeletable"), 1));
-	TRAPD(err, iCertificateContent = Input::ReadFileL(fileName, fs));
-	if (err != KErrNone)
-		{
-		iConsole.Printf(_L("Error reading file : "));
-		iConsole.Printf(fileName);
-		iConsole.Printf(_L("\n"));
-		User::Leave(err);
-		}
-	CleanupStack::PopAndDestroy();	// fs
-	}
-
-void CTestCertForDeletable::ConstructCertL(const TDesC8& aCert)
-	{
-	TFileName filename;
-	filename.Copy(aCert);
-	RFs fs; 
-	User::LeaveIfError(fs.Connect());
-	CleanupClosePushL(fs);
-	HBufC8* certBuf = 0;
-	TRAPD(err, certBuf = Input::ReadFileL(filename, fs));
-	if (err != KErrNone)
-		{
-		iConsole.Printf(_L("Error reading file : "));
-		iConsole.Printf(filename);
-		iConsole.Printf(_L("\n"));
-		User::Leave(err);
-		}
-	CleanupStack::PushL(certBuf);
-	switch (iCertificateFormat)
-		{
-		case EX509Certificate:
-			iCertificate = CX509Certificate::NewL(*certBuf);
-			break;
-			
-		case EWTLSCertificate:
-			iCertificate = CWTLSCertificate::NewL(*certBuf);
-			break;
-			
-		default:
-			// Unknown format - do nothing
-			break;
-		}
-	CleanupStack::PopAndDestroy(2); // fs and certBuf
-	}
-
-void CTestCertForDeletable::DoCheckResult(TInt aError)
-	{
-	if (iFinished)
-		{
-		if (iResult && !iResultGood)
-			{
-			iConsole.Write(_L("\ttestcertfordeletable failed\n"));
-			iOut.writeString(_L("\ttestcertfordeletable failed"));
-			iOut.writeNewLine();
-			iOut.writeNewLine();
-			}
-		else if (iResult)
-			{
-			iConsole.Write(_L("\ttestcertfordeletable passed ok\n"));
-			iOut.writeString(_L("\ttestcertfordeletable passed ok"));
-			iOut.writeNewLine();
-			iOut.writeNewLine();
-			}
-		else 
-			{
-			iConsole.Write(_L("\tcertinfo couldn't be tested\n"));
-			iOut.writeString(_L("\tcertinfo couldn't be tested"));
-			iOut.writeNewLine();
-			iOut.writeString(_L("\t"));
-			iOut.writeError(aError);
-			if (aError == KErrBadName)
-				{
-				iOut.writeString(_L("   - Check that the label is unique"));
-				}
-			if (aError == KErrAccessDenied)
-				{
-				iOut.writeString(_L("   - Can't open filestream. Access denied."));
-				}
-			iOut.writeNewLine();
-			iOut.writeNewLine();
-			}
-		}	
-	}
+/*
+* Copyright (c) 2004-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 "t_testcertfordeletable.h"
+#include "t_certstoredefs.h"
+#include "t_input.h"
+#include "t_certstoreout.h"
+
+#include "t_WritableCSDummies.h"
+
+
+CTestAction* CTestCertForDeletable::NewL(RFs& aFs,
+								   CConsoleBase& aConsole, 
+								   Output& aOut, 
+								   const TTestActionSpec& aTestActionSpec)
+	{
+	CTestCertForDeletable* self = new(ELeave) CTestCertForDeletable(aFs, aConsole, aOut);
+	CleanupStack::PushL(self);
+	self->ConstructL(aTestActionSpec);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CTestCertForDeletable::~CTestCertForDeletable()
+	{
+	delete iCertificate;
+	delete iCertificateURL;
+	delete iCertificateContent;
+	delete iCertificateLabel;
+	}
+
+void CTestCertForDeletable::TestSerializationL(	MCTToken& aToken,
+												TKeyIdentifier* aIssuerKeyId,
+												TKeyIdentifier* aSubjectKeyId, 
+												const TInt aCertificateId,
+												const TDesC8* aIssuerHash )
+	{
+	CCTCertInfo* cert = CCTCertInfo::NewLC( *iCertificateLabel,	// const TDesC& 
+											iCertificateFormat,	// TCertificateFormat
+											iOwnerType, 		// TCertificateOwnerType
+											999, 				// TInt aSize | aCert.Length()
+											aSubjectKeyId,		// const TKeyIdentifier*
+											aIssuerKeyId,		// const TKeyIdentifier* 
+											aToken,	 			// MCTToken&
+											aCertificateId,		// TInt aCertificateId
+											iDeletable,			// TBool
+											aIssuerHash );		// const TDesC8* aIssuerHash = NULL	
+																
+													// cert -> stack
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);							// . fs -> stack
+
+	// this is a name of the file that will be opened as 
+	// a stream to test externalize/internalize
+	TDriveUnit sysDrive (fs.GetSystemDrive());
+	TBuf<24> fileName (sysDrive.Name());
+	fileName.Append(_L("\\certinfo.dat"));
+
+	RFileWriteStream write_stream;
+	User::LeaveIfError( write_stream.Replace(fs, fileName, EFileWrite) );
+	CleanupClosePushL(write_stream);				// . . write_stream -> stack
+
+	cert->ExternalizeL(write_stream);						
+	CleanupStack::PopAndDestroy();					// . . write_stream <- pop
+		
+	// now internalize back from stream
+	RFileReadStream read_stream;
+	User::LeaveIfError( read_stream.Open(fs, fileName, EFileRead) );
+	CleanupClosePushL(read_stream);					// . . read_stream -> stack
+
+	CCTCertInfo* cert_read =
+					CCTCertInfo::NewLC(read_stream, aToken); // does InternalizeL()
+													// . . . cert_read -> stack
+	// log certinfo params just internalized
+	iOut.writeString(_L("Cert attributes after internalize:"));
+	iOut.writeNewLine();
+	WriteFormat( cert_read->CertificateFormat() );
+	iOut.writeString(_L("\tiDeletable  = "));
+	iDeletable ? iOut.writeString(KTrue) : iOut.writeString(KFalse);
+	iOut.writeNewLine();
+	iOut.writeNewLine();
+			
+	// set result
+	iResultGood = ETrue; 
+	// check deletable flag is persistent
+	if ( cert_read->IsDeletable() != iDeletable )
+		{
+		iResultGood = EFalse; 
+		}
+	// check format is persistent
+	if ( cert_read->CertificateFormat() != iCertificateFormat )
+		{
+		iResultGood = EFalse; 
+		}			
+	
+	// cleanup
+	CleanupStack::PopAndDestroy(cert_read);			// . . . cert_read <- pop
+	CleanupStack::PopAndDestroy();					// . . read_stream <- pop
+	CleanupStack::PopAndDestroy(&fs); 				// . fs <- pop
+	CleanupStack::PopAndDestroy(cert);				// initial certinfo <- pop
+	}
+
+void CTestCertForDeletable::PerformAction(TRequestStatus& aStatus)
+	{
+// 	COMMON PART
+	MCTWritableCertStore& ustore = 
+			UnifiedCertStore().WritableCertStore(iStoreIndex);
+	MCTToken& token = ustore.Token();
+
+	TKeyIdentifier* issuerKeyId = NULL;
+	TKeyIdentifier* subjectKeyId = NULL;
+
+	if (iOwnerType != ECACertificate)
+		{
+		issuerKeyId = & iIssuerKeyId;
+		subjectKeyId = & iSubjectKeyId;
+		}
+
+	const TInt KCertificateId = 0x00000213;
+	_LIT8(KSomeHash, "\x70\xe4\xf4\x54\x5f\x8e\xe6\xf2\xbd\x4e\x76\x2b\x8d\xa1\x83\xd8\xe0\x5d\x4a\x7d");
+
+	// create some certinfo object
+	ASSERT(iCertificateLabel);
+		
+	switch (iState)
+		{
+		case ETestSerialization:
+			{
+			iOut.writeString(_L("Checking serialization for a certificate..."));
+			iOut.writeNewLine();			
+
+			TRAPD( err, TestSerializationL( token, issuerKeyId, subjectKeyId,
+												 KCertificateId, &KSomeHash) );
+
+			TRequestStatus* status = &aStatus;
+			if (err != KErrNone )
+				{
+				// TestSerializationL() did leave
+				iResult = EFalse;
+				iResultGood = EFalse;
+				User::RequestComplete(status, err);
+				}
+			else
+				{
+				// TestSerializationL() passed ok
+				iResult = ETrue;
+				User::RequestComplete(status, aStatus.Int());
+				}					
+			// set next state
+			iState = EFinished;
+			}
+			break;
+		
+			
+		case ETestNewCSClasswDeletable:			// check mctwritablecertstore
+			{
+			iOut.writeString(_L("Testing MCTWritableCertStore::Add() w deletable..."));
+			iOut.writeNewLine();
+
+			// create a writablestore supporting new Add()
+			TNewCSClasswDeletable storeNew;
+			
+			// call new Add()
+			storeNew.Add( *iCertificateLabel, 
+						  iCertificateFormat, 
+						  iOwnerType,
+						  subjectKeyId, 
+						  issuerKeyId, 
+						  *iCertificateContent,	// this is probably unset 
+						  iDeletable,
+						  aStatus);
+						  
+			iResultGood = ETrue; 						  						
+			iState = EFinished;
+			}
+			break;
+
+
+		case ETestOldCSClasswoDeletable:		// check mctwritablecertstore
+			{
+
+			iOut.writeString(_L("Testing new MCTWritableCertStore::Add() on old class..."));
+			iOut.writeNewLine();
+ 
+			// create a writablestore that does not have new Add()
+			TOldCSClasswoDeletable storeOld;
+			
+			// call new Add(), expect to get KErrNotSupported
+			storeOld.Add( *iCertificateLabel, 
+						  iCertificateFormat, 
+						  iOwnerType,
+						  subjectKeyId, 
+						  issuerKeyId, 
+						  *iCertificateContent,	// this is probably unset 
+						  iDeletable,
+						  aStatus);
+			iResultGood = ETrue; 						  						
+			iState = EFinished;
+			
+			TRequestStatus* status = &aStatus;
+			User::RequestComplete(status, aStatus.Int());
+			}
+			break;
+
+
+		case EFinished:
+			{
+			
+			if (aStatus == KErrNone)
+				{
+				iResult = ETrue;
+				}
+			else
+			 	if (aStatus == iExpectedResult)
+					{
+					iResult = ETrue;
+					iResultGood = ETrue;
+					}
+				else
+					{
+					iResult = EFalse;
+					iResultGood = ETrue;
+					}
+
+            if (aStatus != KErrNoMemory)
+                {
+                iFinished = ETrue;
+                }
+            
+			TRequestStatus* status = &aStatus;
+			User::RequestComplete(status, aStatus.Int());
+			}
+			break;
+
+		default:
+			break;
+		
+		} 	// switch ()
+
+	}  // CTestCertForDeletable::PerformAction()
+
+void CTestCertForDeletable::PerformCancel()
+	{
+	iState = EFinished;
+	MCTWritableCertStore& store = UnifiedCertStore().WritableCertStore(iStoreIndex);
+	store.CancelAdd();
+	}
+
+void CTestCertForDeletable::AfterOOMFailure()
+	{
+	}
+
+void CTestCertForDeletable::Reset()
+	{
+	iState = EFinished;
+	}
+
+void CTestCertForDeletable::DoReportAction()
+	{
+	iOut.writeString(_L("\tLabel = "));
+	iOut.writeString(*iCertificateLabel);
+	iOut.writeNewLine();
+	iOut.writeString(_L("\tOwner type = "));
+	WriteOwnerType();
+	WriteFormat(iCertificateFormat);
+	
+	iOut.writeString(_L("\tSubjectKeyId:  "));
+	iOut.writeOctetString(iSubjectKeyId);
+	iOut.writeNewLine();
+
+	iOut.writeString(_L("\tiDeletable  = "));
+	iDeletable ? iOut.writeString(KTrue) : iOut.writeString(KFalse);
+	iOut.writeNewLine();
+	iOut.writeNewLine();
+	}
+
+void CTestCertForDeletable::WriteFormat(TCertificateFormat aFormat)
+	{
+	iOut.writeString(_L("\tFormat = "));
+	switch (aFormat)
+		{
+		case EX509Certificate:
+			iOut.writeString(_L("X.509\n"));
+			break;
+			
+		case EWTLSCertificate:
+			iOut.writeString(_L("WTLS\n"));
+			break;
+			
+		case EX968Certificate:
+			iOut.writeString(_L("X968\n"));
+			break;
+			
+		case EX509CertificateUrl:
+			iOut.writeString(_L("X.509 URL\n"));
+			break;
+			
+		case EWTLSCertificateUrl:
+			iOut.writeString(_L("WTLS URL\n"));
+			break;
+			
+		case EX968CertificateUrl:
+			iOut.writeString(_L("X968 URL\n"));
+			break;
+			
+		default:
+			iOut.writeString(_L("Unknown format\n"));
+			break;
+		}
+	}
+
+void CTestCertForDeletable::WriteOwnerType()
+	{
+	switch (iOwnerType)
+		{
+		case ECACertificate:
+			iOut.writeString(_L("CA\n"));
+			break;
+			
+		case EUserCertificate:
+			iOut.writeString(_L("User"));
+			break;
+			
+		case EPeerCertificate:
+			iOut.writeString(_L("Peer"));
+			break;
+
+		default:
+			iOut.writeString(_L("Unknown"));
+			break;
+		}
+	}
+
+CTestCertForDeletable::CTestCertForDeletable(RFs& aFs, CConsoleBase& aConsole,
+								 Output& aOut)
+: CCertStoreTestAction(aFs, aConsole, aOut), iState(EFinished)
+	{
+	}
+
+void CTestCertForDeletable::ConstructL(const TTestActionSpec& aTestActionSpec)
+	{
+	CCertStoreTestAction::ConstructL(aTestActionSpec);
+
+	SetCertFormatL(Input::ParseElement(aTestActionSpec.iActionBody, KCertFormatStart));
+	SetCertOwnerTypeL(Input::ParseElement(aTestActionSpec.iActionBody, KCertOwnerTypeStart));
+	SetCertLabelL(Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart));
+	SetKeyId(iIssuerKeyId, Input::ParseElement(aTestActionSpec.iActionBody, KIssuerKeyStart));
+	SetKeyId(iSubjectKeyId, Input::ParseElement(aTestActionSpec.iActionBody, KSubjectKeyStart));
+	SetStoreToUse(Input::ParseElement(aTestActionSpec.iActionBody, KStoreToUseStart));
+	SetDeletable(Input::ParseElement(aTestActionSpec.iActionBody, KDeletableStart));
+	SetSubActionL(Input::ParseElement(aTestActionSpec.iActionBody, KSubActionStart));
+
+	// Setting the expected result
+	HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
+	TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
+	Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
+	CleanupStack::PopAndDestroy(result);
+	}
+
+void CTestCertForDeletable::SetKeyId(TKeyIdentifier& aKeyIdentifier, const TDesC8& aKeyInfo)
+	{
+	TInt size = aKeyInfo.Length();
+	for (TInt i = 0; i < size; i += 2)
+		{
+		TInt a = (aKeyInfo[i+1] >= 'a') ? (aKeyInfo[i+1] - 'a' + 10) : (aKeyInfo[i+1] - '0');
+		TInt b = (aKeyInfo[i] >= 'a') ? (aKeyInfo[i] - 'a' + 10) : (aKeyInfo[i] - '0');
+		aKeyIdentifier.Append(a  + b * 16);
+		}
+	}
+
+void CTestCertForDeletable::SetCertFormatL(const TDesC8& aFormat)
+	{
+	if (aFormat == KX509)
+		{
+		iCertificateFormat = EX509Certificate;
+		}
+	else if (aFormat == KWTLS)
+		{
+		iCertificateFormat = EWTLSCertificate;
+		}
+	else if (aFormat == KX968)
+		{
+		iCertificateFormat = EX968Certificate;
+		}
+	else if (aFormat == KX509URL)
+		{
+		iCertificateFormat = EX509CertificateUrl;
+		}
+	else if (aFormat == KWTLSURL)
+		{
+		iCertificateFormat = EWTLSCertificateUrl;
+		}
+	else if (aFormat == KX968URL)
+		{
+		iCertificateFormat = EX968CertificateUrl;
+		}	
+	else if (aFormat == KUnknown)
+		{
+		iCertificateFormat = EUnknownCertificate;
+		}
+	else
+		{
+		iOut.write(_L("Unrecognized cert format: "));
+		iOut.writeString(aFormat);
+		iOut.writeNewLine();		   
+		User::Leave(KErrArgument);
+		}
+	}
+
+void CTestCertForDeletable::SetCertOwnerTypeL(const TDesC8& aOwnerType)
+	{
+	if (aOwnerType == KCACert)
+		{
+		iOwnerType = ECACertificate;
+		}
+	else if (aOwnerType == KUserCert)
+		{
+		iOwnerType = EUserCertificate;
+		}
+	else if (aOwnerType == KPeerCert)
+		{
+		iOwnerType = EPeerCertificate;
+		}
+	else if (aOwnerType == KUnknown)
+		{
+		// set dummy bogus owner type
+		iOwnerType = static_cast<TCertificateOwnerType>(EPeerCertificate + 1);
+		}
+	else
+		{
+		iOut.write(_L("Unknown cert owner type: "));
+		iOut.writeString(aOwnerType);
+		iOut.writeNewLine();		   
+		User::Leave(KErrArgument);
+		}
+	}
+
+void CTestCertForDeletable::SetSubActionL(const TDesC8& aStringVal)
+	{
+	if (aStringVal == KTestSerialization)
+		{
+		iState = ETestSerialization;
+		}
+	else if (aStringVal == KTestNewCSClasswDeletable)
+		{
+		iState = ETestNewCSClasswDeletable;
+		}
+	else if (aStringVal == KTestOldCSClasswoDeletable)
+		{
+		iState = ETestOldCSClasswoDeletable;
+		}
+
+	else
+		{
+		iOut.write(_L("Unknown subaction type: "));
+		iOut.writeString(aStringVal);
+		iOut.writeNewLine();		   
+		User::Leave(KErrArgument);
+		}
+	}
+
+
+void CTestCertForDeletable::SetCertLabelL(const TDesC8& aLabel)
+	{
+	delete iCertificateLabel;
+	iCertificateLabel = NULL;
+	iCertificateLabel = HBufC::NewL(aLabel.Length());
+	TPtr ptr = iCertificateLabel->Des();
+	ptr.Copy(aLabel);
+	}
+	
+
+
+void CTestCertForDeletable::SetStoreToUse(const TDesC8& aStoreToUse)
+	{
+	TLex8 lex(aStoreToUse);
+	lex.Val(iStoreIndex);
+	}
+	
+void CTestCertForDeletable::SetDeletable(const TDesC8& aStringVal)
+	{
+	TLex8 lex(aStringVal);
+	lex.Val(iDeletable);
+	}
+
+void CTestCertForDeletable::SetCertificateContentL(const TDesC8& aFileName)
+	{
+	TFileName fileName;
+	fileName.Copy(aFileName);
+	RFs fs; 
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+	__ASSERT_DEBUG(!iCertificateContent, User::Panic(_L("CTestCertForDeletable"), 1));
+	TRAPD(err, iCertificateContent = Input::ReadFileL(fileName, fs));
+	if (err != KErrNone)
+		{
+		iConsole.Printf(_L("Error reading file : "));
+		iConsole.Printf(fileName);
+		iConsole.Printf(_L("\n"));
+		User::Leave(err);
+		}
+	CleanupStack::PopAndDestroy();	// fs
+	}
+
+void CTestCertForDeletable::ConstructCertL(const TDesC8& aCert)
+	{
+	TFileName filename;
+	filename.Copy(aCert);
+	RFs fs; 
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+	HBufC8* certBuf = 0;
+	TRAPD(err, certBuf = Input::ReadFileL(filename, fs));
+	if (err != KErrNone)
+		{
+		iConsole.Printf(_L("Error reading file : "));
+		iConsole.Printf(filename);
+		iConsole.Printf(_L("\n"));
+		User::Leave(err);
+		}
+	CleanupStack::PushL(certBuf);
+	switch (iCertificateFormat)
+		{
+		case EX509Certificate:
+			iCertificate = CX509Certificate::NewL(*certBuf);
+			break;
+			
+		case EWTLSCertificate:
+			iCertificate = CWTLSCertificate::NewL(*certBuf);
+			break;
+			
+		default:
+			// Unknown format - do nothing
+			break;
+		}
+	CleanupStack::PopAndDestroy(2); // fs and certBuf
+	}
+
+void CTestCertForDeletable::DoCheckResult(TInt aError)
+	{
+	if (iFinished)
+		{
+		if (iResult && !iResultGood)
+			{
+			iConsole.Write(_L("\ttestcertfordeletable failed\n"));
+			iOut.writeString(_L("\ttestcertfordeletable failed"));
+			iOut.writeNewLine();
+			iOut.writeNewLine();
+			}
+		else if (iResult)
+			{
+			iConsole.Write(_L("\ttestcertfordeletable passed ok\n"));
+			iOut.writeString(_L("\ttestcertfordeletable passed ok"));
+			iOut.writeNewLine();
+			iOut.writeNewLine();
+			}
+		else 
+			{
+			iConsole.Write(_L("\tcertinfo couldn't be tested\n"));
+			iOut.writeString(_L("\tcertinfo couldn't be tested"));
+			iOut.writeNewLine();
+			iOut.writeString(_L("\t"));
+			iOut.writeError(aError);
+			if (aError == KErrBadName)
+				{
+				iOut.writeString(_L("   - Check that the label is unique"));
+				}
+			if (aError == KErrAccessDenied)
+				{
+				iOut.writeString(_L("   - Can't open filestream. Access denied."));
+				}
+			iOut.writeNewLine();
+			iOut.writeNewLine();
+			}
+		}	
+	}