email/pop3andsmtpmtm/smtpservermtm/test/src/T_SMTSSECURESOCKETS.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/smtpservermtm/test/src/T_SMTSSECURESOCKETS.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,364 @@
+// 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 "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:
+// Brief description of test harness:
+// Tests SSL/TLS functionality in SMTS
+// Input files required to run test harness:
+// The following files should be copied to <drive>:\msgtest\smts\scripts
+// t_smtsTlsNotSupported.scr
+// t_smtsTlsTempFail.scr
+// t_smtsTlsOk.scr
+// t_smtsTlsSyntaxError.scr
+// t_smtsTlsNoServices.scr
+// t_smtsTlsRefused.scr
+// t_smtsTlsStopResponding.scr
+// t_smtsTlsNewSession.scr
+// Output files produced by running test harness:
+// <DRIVE>:\msglogs\T_SMTSSECURESOCKETS.<PLATFORM>.<VARIANT>.LOG.txt
+// Description of how to build test harness:
+// cd \messaging\msg\smts\
+// bldmake bldfiles
+// abld test build t_SMTSSECURESOCKETS
+// Description of how to run test harness:
+// The following instructions are the same for all platforms:
+// 2. Build the test utilities:
+// cd \messaging\msg\testutils\group\
+// bldmake bldfiles
+// abld build
+// WINS running instructions:
+// 1. \epoc32\release\wins\<VARIANT>\T_SMTSSECURESOCKETS.exe can be used at the command prompt
+// or executable can be run from Windows Explorer.
+// All other platform running instructions:
+// 1. Copy \epoc32\release\<PLATFORM>\<VARIANT>\T_SMTSSECURESOCKETS.exe onto the other platform
+// 2. Copy \epoc32\release\<PLATFORM>\<VARIANT>\MSVTESTUTILS.DLL into 
+// <DRIVE>:\system\libs on the other platform
+// 3. Copy \epoc32\release\<PLATFORM>\<VARIANT>\EMAILTESTUTILS.DLL into 
+// <DRIVE>:\system\libs on the other platform
+// 4. Copy \epoc32\wins\c\msgtest\smts\scripts\*.scr to
+// <DRIVE>:\msgtest\smts\scripts\
+// Note that this drive should be a CF card as the test files are large
+// 5. Run T_SMTSSECURESOCKETS.exe on the other platform with the CF card
+// 
+//
+
+#include "emailtestutils.h"
+#include "scripttestutils.h"
+#include <cemailaccounts.h>
+
+_LIT(KSmtsTest, "Testing SMTS secure connection with script files");
+_LIT(KSmtsComponent,"SMTS");
+
+// Script Files for the Tests
+_LIT(KTest1ScriptFile,	"scripts\\t_smtsTlsNotSupported.scr");
+_LIT(KTest1Desc,		"Test 1 connects to a server which doesn't support SSLTLS.");
+_LIT(KTest1Result,		"Test 1 should finish with -246 (SMTP TLS Negotiate Failed).");
+
+_LIT(KTest2ScriptFile,	"scripts\\t_smtsTlsTempFail.scr");
+_LIT(KTest2Desc,		"Test 2 connects to a server which supports SSLTLS, but TLS is not available due to temporary reason.");
+_LIT(KTest2Result,		"Test 2 should finish with -185 (SSL TLS Negotiate Failed).");
+
+_LIT(KTest3ScriptFile,	"scripts\\t_smtsTlsOk.scr");
+_LIT(KTest3Desc,		"Test 3 connects to a server which supports SSLTLS.");
+_LIT(KTest3Result,		"Test 3 should complete with no error.");
+
+_LIT(KTest4ScriptFile,	"scripts\\t_smtsTlsSyntaxError.scr");
+_LIT(KTest4Desc,		"Test 4 connects to a server which supports SSLTLS, but returns an Error.");
+_LIT(KTest4Result,		"Test 4 should finish with -185 (SSL TLS Negotiate Failed).");
+
+_LIT(KTest5ScriptFile,	"scripts\\t_smtsTlsNoServices.scr");
+_LIT(KTest5Desc,		"Test 5 connects to a server which supports SSLTLS, starts TLS, but the server returns no supported services.");
+_LIT(KTest5Result,		"Test 5 should finish with -185 (SSL TLS Negotiate Failed).");
+
+_LIT(KTest6ScriptFile,	"scripts\\t_smtsTlsRefused.scr");
+_LIT(KTest6Desc,		"Test 6 connects to a server which supports SSLTLS, but then refuses connection, due to lack of security");
+_LIT(KTest6Result,		"Test 6 should finish with -244 (SMTP Login Refused).");
+
+_LIT(KTest8ScriptFile,	"scripts\\t_smtsTlsNewSession.scr");
+_LIT(KTest8Desc,		"Test 8 - After TLS handshake, the server tries to start new session, by returning STARTTLS");
+_LIT(KTest8Result,		"Test 8 should complete with no error, as MTM ignores this command.");
+
+RTest test(KSmtsTest);
+
+LOCAL_D CTrapCleanup* theCleanup;
+LOCAL_D CEmailTestUtils* testUtils; 
+LOCAL_D TMsvId smtpService;
+LOCAL_D CBaseServerMtm* serverMtm;
+LOCAL_D TInt testError;
+
+
+// Class to hold the data required for a Test
+class TTestData
+	{
+	public:
+		TInt		iTestNumber;
+		TBuf<50>	iTestFile;
+		TBuf<200>	iTestDescription;
+		TBuf<200>	iTestResult;
+	};
+
+
+LOCAL_C TInt TestSendingMessagesL()
+	{
+	testError = 0;
+
+	CTestActive* testActive = new (ELeave) CTestActive();
+	CleanupStack::PushL(testActive);
+
+	CMsvEntrySelection* sendSel = new(ELeave) CMsvEntrySelection();
+	CleanupStack::PushL(sendSel);
+
+	testUtils->iServerEntry->SetEntry(KMsvGlobalOutBoxIndexEntryId);
+	User::LeaveIfError(testUtils->iServerEntry->GetChildren(*sendSel));
+	TInt count=sendSel->Count();
+	if (!count)
+		{
+		testUtils->WriteComment(_L("\t No messages to send in the outbox"));
+		CleanupStack::PopAndDestroy(2); //testActive, sendsel
+		testError = KErrNotFound;
+		}
+	else
+		{
+
+		serverMtm->CopyFromLocalL(*sendSel,smtpService, testActive->iStatus);
+
+		testActive->StartL();
+		CActiveScheduler::Start();
+ 		TImSmtpProgress temp;	
+		TPckgC<TImSmtpProgress> paramPack(temp);
+
+		const TDesC8& progBuf =serverMtm->Progress();
+		paramPack.Set(progBuf);
+		TImSmtpProgress progress=paramPack();	
+		CleanupStack::PopAndDestroy(2); //testActive, sendsel
+		testError = progress.Error();
+		}
+
+	return testError;
+	}
+
+LOCAL_C void ClosedownL()
+	{
+	testUtils->TestHarnessCompleted();
+	CleanupStack::PopAndDestroy(2);  //testUtils, ischeduler
+	}
+
+LOCAL_C void ResetSettingsL(TBool aSecureSocket)
+	{
+	_LIT(KSmtpServer, "smtp.demon.co.uk");
+	_LIT(KSmtpEmailAlias, "SMTP STARTTLS");
+	_LIT(KSmtpEmailAddress, "<a@b>");
+
+	// Overwrite the setings with test code one.  Don't want the default settings.
+	CImSmtpSettings* settings = new(ELeave) CImSmtpSettings();
+	CleanupStack::PushL(settings);
+	
+	CEmailAccounts* accounts = CEmailAccounts::NewLC();
+	
+	TSmtpAccount smtpAccountId;
+	accounts->GetSmtpAccountL(smtpService,smtpAccountId); 
+	accounts->LoadSmtpSettingsL(smtpAccountId, *settings);
+
+	settings->SetServerAddressL(KSmtpServer);
+	settings->SetEmailAliasL(KSmtpEmailAlias);
+	settings->SetEmailAddressL(KSmtpEmailAddress);
+	settings->SetReplyToAddressL(KSmtpEmailAddress);
+	settings->SetBodyEncoding(EMsgOutboxMIME);
+	settings->SetReceiptAddressL(KSmtpEmailAddress);
+	settings->SetSecureSockets(aSecureSocket);
+	settings->SetPort(25);
+	
+	accounts->SaveSmtpSettingsL(smtpAccountId, *settings);
+
+	CleanupStack::PopAndDestroy(2, settings); //settings, store/accounts
+	}
+
+LOCAL_C void InitL()
+	{
+	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
+	CleanupStack::PushL(scheduler);
+	CActiveScheduler::Install( scheduler );
+
+	testUtils = CEmailTestUtils::NewLC(test);
+	testUtils->WriteComment(KSmtsTest);
+
+	testUtils->CleanMessageFolderL();
+	testUtils->ClearEmailAccountsL();
+	
+	testUtils->GoClientSideL();
+ 	
+	smtpService = testUtils->CreateSmtpServiceL();
+	ResetSettingsL(ETrue);
+	CleanupStack::PopAndDestroy(testUtils);
+	testUtils = CEmailTestUtils::NewLC(test, ETuGoServerSide);
+	testUtils->InstantiateSmtpServerMtmL();
+	serverMtm=testUtils->iSmtpServerMtm;
+	testUtils->WriteComment(_L("Smtp server created"));
+	}
+
+LOCAL_C void CreateMsgToSendL()
+// Create a message to send & place it in the outbox
+	{
+	TParse scriptFile;
+	_LIT(KSmtsRfcFile, "RFC822\\rfc82201.txt");
+	testUtils->ResolveFile(KSmtsComponent, KSmtsRfcFile, scriptFile);
+	testUtils->CreateMessageL(scriptFile.FullName(), smtpService, KMsvGlobalOutBoxIndexEntryId);
+	testUtils->WriteComment(_L(" Message created in the outbox"));
+	testUtils->WriteComment(_L("\nPerforming Tests\n"));
+	}
+
+
+LOCAL_C void RunTestL(TTestData& aTestData)
+	{
+	// Add a blank line to the Log file before the new Test
+	_LIT(KBlankLine, "");
+	testUtils->WriteComment(KBlankLine);
+
+	TParse scriptFile;
+	testUtils->ResolveFile(KSmtsComponent, aTestData.iTestFile, scriptFile);
+	testUtils->CopyScriptFileL(scriptFile.FullName(), _L("25"));
+	testUtils->TestStart(aTestData.iTestNumber);
+	testUtils->WriteComment(aTestData.iTestDescription);
+	testUtils->WriteComment(aTestData.iTestResult);
+	
+	// Run the Test & check the error
+	TestSendingMessagesL();
+	}
+
+
+LOCAL_C void RunAllTestsL()
+	{
+	
+	//	Create a Message to Send
+	CreateMsgToSendL();
+
+	//-------------------------------
+	//	Test 1 - TLS Not Supported
+	//-------------------------------
+	TTestData testData;
+	testData.iTestNumber = 1;
+	testData.iTestFile = KTest1ScriptFile;
+	testData.iTestDescription = KTest1Desc;
+	testData.iTestResult = KTest1Result;
+	RunTestL(testData);
+	testError=(testError==-246)? 0 : testError;
+	testUtils->TestFinish(testData.iTestNumber, testError);
+
+	//-----------------------------------------------------------------
+	//	Test 2 - TLS Not Available due to Temp Reason (ie 454 responce)
+	//-----------------------------------------------------------------
+	testData.iTestNumber = 2;
+	testData.iTestFile = KTest2ScriptFile;
+	testData.iTestDescription = KTest2Desc;
+	testData.iTestResult = KTest2Result;
+	RunTestL(testData);
+	testError=(testError==-185)? 0 : testError;
+	testUtils->TestFinish(testData.iTestNumber, testError);
+
+	//------------------------------------------------------
+	//	Test 3 - TLS Supported & Msg Sent (ie 220 responce)
+	//------------------------------------------------------
+	testData.iTestNumber = 3;
+	testData.iTestFile = KTest3ScriptFile;
+	testData.iTestDescription = KTest3Desc;
+	testData.iTestResult = KTest3Result;
+	RunTestL(testData);
+	testError=(testError==0)? 0 : testError;
+	testUtils->TestFinish(testData.iTestNumber, testError);
+
+	//	Create a Message to Send, as the previous one was sent by Test 3
+	CreateMsgToSendL();
+
+	//---------------------------------------------
+	//	Test 4 - TLS Syntax Error (ie 501 responce)
+	//---------------------------------------------
+	testData.iTestNumber = 4;
+	testData.iTestFile = KTest4ScriptFile;
+	testData.iTestDescription = KTest4Desc;
+	testData.iTestResult = KTest4Result;
+	RunTestL(testData);
+	testError=(testError==-185)? 0 : testError;
+	testUtils->TestFinish(testData.iTestNumber, testError);
+
+	//--------------------------------------------------------------------------------------
+	//	Test 5 - No Supported Services (After Handshake, Server sends no Supported Services)
+	//--------------------------------------------------------------------------------------
+	testData.iTestNumber = 5;
+	testData.iTestFile = KTest5ScriptFile;
+	testData.iTestDescription = KTest5Desc;
+	testData.iTestResult = KTest5Result;
+	RunTestL(testData);
+	testError=(testError==-185)? 0 : testError;
+	testUtils->TestFinish(testData.iTestNumber, testError);
+
+	//----------------------------------------
+	//	Test 6 - TLS Refusal (ie 554 responce)
+	//----------------------------------------
+	testData.iTestNumber = 6;
+	testData.iTestFile = KTest6ScriptFile;
+	testData.iTestDescription = KTest6Desc;
+	testData.iTestResult = KTest6Result;
+	RunTestL(testData);
+	testError=(testError==-244)? 0 : testError;
+	testUtils->TestFinish(testData.iTestNumber, testError);
+
+	//----------------------------------------
+	//	Test 7 - Server Stops Responding
+	//----------------------------------------
+/*	testData.iTestNumber = 7;
+	testData.iTestFile = KTest7ScriptFile;
+	testData.iTestDescription = KTest7Desc;
+	testData.iTestResult = KTest7Result;
+	RunTestL(testData);*/
+
+	//--------------------------------------------------------------------------
+	//	Test 8 - Session Already Active (Server sends STARTTLS after handshake)
+	//--------------------------------------------------------------------------
+	testData.iTestNumber = 8;
+	testData.iTestFile = KTest8ScriptFile;
+	testData.iTestDescription = KTest8Desc;
+	testData.iTestResult = KTest8Result;
+	RunTestL(testData);
+	testError=(testError==0)? 0 : testError;
+	testUtils->TestFinish(testData.iTestNumber, testError);
+	}
+
+
+LOCAL_C void doMainL()
+	{
+	InitL();
+	testUtils->iServerEntry->SetEntry(smtpService);
+
+	// Set the Setting to use Secure Sockets & Run the Tests
+	_LIT(KSecurityOn, "------Set Security On------");
+	testUtils->WriteComment(KSecurityOn);
+	RunAllTestsL();
+
+	// End of the Tests
+	ClosedownL();
+	}
+
+
+GLDEF_C TInt E32Main()
+	{	
+	__UHEAP_MARK;
+	test.Start(_L("T_SMTSSECURESOCKETS Test SMTP server MTM secure connection"));
+	theCleanup=CTrapCleanup::New();
+	TRAPD(ret,doMainL());		
+	test(ret==KErrNone);
+	delete theCleanup;	
+	test.End();
+	test.Close();
+	__UHEAP_MARKEND;
+	User::Heap().Check();
+	return(KErrNone);
+	}