messagingappbase/smsmtm/test/src/T_smut.cpp
changeset 25 84d9eb65b26f
parent 23 238255e8b033
child 27 e4592d119491
child 37 518b245aa84c
child 79 2981cb3aa489
equal deleted inserted replaced
23:238255e8b033 25:84d9eb65b26f
     1 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include "T_smut.h"
       
    17 #include <smss.rsg>
       
    18 #include <etelmm.h>
       
    19 #include <smutset.h>
       
    20 #include <csmsaccount.h>
       
    21 
       
    22 #include <csmsemailfields.h>
       
    23 
       
    24 #include <csmsgetdetdescinterface.h>
       
    25 
       
    26 
       
    27 const TUid KUidMsvSmsEmailFieldsStream	= {0x10204C9D};
       
    28 
       
    29 GLDEF_C TInt E32Main()
       
    30 	{	
       
    31 	__UHEAP_MARK;
       
    32 	test.Start(_L("Setup"));
       
    33 	theCleanup = CTrapCleanup::New();
       
    34 	TRAPD(ret,doMainL());		
       
    35 	test(ret==KErrNone);
       
    36 	delete theCleanup;	
       
    37 	test.Console()->SetPos(0, 13);
       
    38 	test.End();
       
    39 	test.Close();
       
    40 	__UHEAP_MARKEND;
       
    41 	return(KErrNone);
       
    42 	}
       
    43 
       
    44 LOCAL_C void doMainL()
       
    45 	{
       
    46 	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
       
    47 	CleanupStack::PushL(scheduler);
       
    48 	CActiveScheduler::Install(scheduler);
       
    49 
       
    50 	CSmsTestUtils* smsTest = CSmsTestUtils::NewL(test);
       
    51 	CleanupStack::PushL(smsTest);
       
    52 	TInt nextTest = 0;
       
    53 	
       
    54 	CSmutTest* SmcmTest = CSmutTest::NewLC(*smsTest, KNullDesC, nextTest);
       
    55 
       
    56 	SmcmTest->StartL();
       
    57 
       
    58 	CleanupStack::PopAndDestroy(3, scheduler);
       
    59 	}
       
    60 
       
    61 CSmutTest::CSmutTest(CSmsTestUtils& aSmsTest, const TDesC& aScriptFile, TInt& aNextTest)
       
    62 : CSmsTestBase(aSmsTest, aScriptFile, aNextTest)
       
    63 	{
       
    64 	}
       
    65 
       
    66 void CSmutTest::RunAutoL()
       
    67 	{
       
    68 	iNextTest = 0;
       
    69 	
       
    70 	// Testing TMsvSmsEntry
       
    71 	iSmsTest.TestStart(++iNextTest, _L("TMsvSmsEntry"));
       
    72 	TestSmsEntryL();
       
    73 	iSmsTest.TestFinish(iNextTest);
       
    74 
       
    75 
       
    76 	// Testing settings (CSmsSettings)
       
    77 	iSmsTest.TestStart(++iNextTest, _L("CSmsSettings"));  
       
    78 	TestSettingsL();
       
    79 	iSmsTest.TestFinish(iNextTest);
       
    80 
       
    81 	// Testing number class (CSmsNumber)
       
    82 	iSmsTest.TestStart(++iNextTest, _L("CSmsNumber"));  
       
    83 	TestNumberL();
       
    84 	iSmsTest.TestFinish(iNextTest);
       
    85 	
       
    86 	// Testing email fields class (CSmsEmailFields)
       
    87 	iSmsTest.TestStart(++iNextTest, _L("CSmsEmailFields"));  
       
    88 	TestEmailFieldsL();
       
    89 	iSmsTest.TestFinish(iNextTest);
       
    90 
       
    91 	// Testing with header (CSmsHeader)
       
    92 	iSmsTest.TestStart(++iNextTest, _L("CSmsHeader"));
       
    93 	TestHeaderL();
       
    94 	iSmsTest.TestFinish(iNextTest);
       
    95 
       
    96 	// Testing with utility class (TSmsUtilities)
       
    97 	iSmsTest.TestStart(++iNextTest, _L("TSmsUtilities"));
       
    98 	TestSmsUtilitiesL();
       
    99 
       
   100 	// Testing with ECOM Plugin class (CSmsGetDetDescInterface)
       
   101 	iSmsTest.TestStart(++iNextTest, _L("CSmsGetDetDescInterface"));
       
   102 	TestSmsUtilitiesBL();
       
   103 
       
   104 	iSmsTest.TestFinish(iNextTest);
       
   105 
       
   106 	iSmsTest.TestStart(++iNextTest, _L("EMS Extensions"));
       
   107 	TestSmsEmsExtensionsL();
       
   108 
       
   109 	iSmsTest.TestFinish(iNextTest);
       
   110 
       
   111 	}
       
   112 
       
   113 CSmutTest::~CSmutTest()
       
   114 	{
       
   115 	delete iSmsHeader;
       
   116 	delete iRichText;
       
   117 	delete iParaLayer;
       
   118 	delete iCharLayer;
       
   119 	delete iDBSession;
       
   120 	
       
   121 	}
       
   122 
       
   123 void CSmutTest::ConstructL()
       
   124 	{
       
   125 	iSmsTest.SetLogToFile();
       
   126 
       
   127 	iSelection = new (ELeave) CMsvEntrySelection();
       
   128 	iTimer = CTestTimer::NewL();
       
   129 
       
   130 	iParaLayer =CParaFormatLayer::NewL();
       
   131 	iCharLayer = CCharFormatLayer::NewL();
       
   132 	iRichText = CRichText::NewL(iParaLayer, iCharLayer, CEditableText::EFlatStorage,256);
       
   133 	iDBSession = CMDBSession::NewL(CMDBSession::LatestVersion());	
       
   134 
       
   135 	CActiveScheduler::Add(this);
       
   136 	}
       
   137 
       
   138 CSmutTest* CSmutTest::NewLC(CSmsTestUtils& aSmsTest, const TDesC& aScriptFile, TInt& aNextTest)
       
   139 	{
       
   140 	CSmutTest* self = new (ELeave) CSmutTest(aSmsTest, aScriptFile, aNextTest);
       
   141 	CleanupStack::PushL(self);
       
   142 
       
   143 	self->ConstructL();
       
   144 
       
   145 	return self;
       
   146 	}
       
   147 
       
   148 void CSmutTest::ShowMenuL()
       
   149 	{
       
   150 	iSmsTest.ResetMenu();
       
   151 
       
   152 	iSmsTest.AppendToMenuL(_L("Start"));
       
   153 	iSmsTest.AppendToMenuL(_L("Sms Utilities"));
       
   154 	iSmsTest.AppendToMenuL(_L("Sms Settings"));
       
   155 
       
   156 	TInt result = iSmsTest.DisplayMenu(_L("SMS Client MTM Test"));
       
   157 
       
   158 	if (result <= 0)
       
   159 		return;
       
   160 
       
   161 	switch (result)
       
   162 		{
       
   163 		case 1:
       
   164 			RunAutoL();
       
   165 			break;
       
   166 		case 2:
       
   167 			TestSmsUtilitiesL();
       
   168 			break;
       
   169 		case 3:
       
   170 			TestSettingsL();
       
   171 			break;
       
   172 		default:
       
   173 			User::Leave(KErrArgument);
       
   174 			break;
       
   175 		}
       
   176 
       
   177 	if (!iSmsTest.RunAuto())
       
   178 		{
       
   179 		iSmsTest.Printf(_L("Press any key to continue...\n"));
       
   180 		iSmsTest.Test().Getch();
       
   181 		}
       
   182 
       
   183 	ShowMenuL();
       
   184 	}
       
   185 
       
   186 void CSmutTest::TestSettingsL()
       
   187 	{
       
   188 	iSmsTest.Printf(_L("Testing Create Settings...\n"));
       
   189 
       
   190 	iSmsTest.SetEntryL(iSmsTest.iSmsServiceId);
       
   191 
       
   192 // First we test all the features of the class CSmsSettings
       
   193 // We give them different values and compare if it works
       
   194 
       
   195 	CSmsSettings* settings = CSmsSettings::NewL();
       
   196 	CleanupStack::PushL(settings);
       
   197 	iSmsTest(CompareSettings(*settings, *settings));
       
   198 	TestSettingsMembersL(*settings);
       
   199 	TestMessageSettingsMembersL(*settings);
       
   200 
       
   201 // Lets copy the values to a different instance
       
   202 	CSmsSettings* smsSettings=CSmsSettings::NewL();
       
   203 	CleanupStack::PushL(smsSettings);
       
   204 	smsSettings->CopyL(*settings);
       
   205 	iSmsTest(CompareSettings(*smsSettings, *settings));
       
   206 	CleanupStack::PopAndDestroy(smsSettings);
       
   207 	smsSettings = NULL;
       
   208 	iSmsTest.Printf(_L("Test CSmsSettings::CopyL() passed\n"));
       
   209 
       
   210 
       
   211 //	Lets create a sms service in the file system with these values
       
   212 	TestStoreRestoreSettingsL(*settings);
       
   213 
       
   214 // Lets make the previous test again; Lets give a settings instance some
       
   215 // values, store it, restore it and see that the values are still the same
       
   216 	CSmsSettings* set2=CSmsSettings::NewL();
       
   217 	CleanupStack::PushL(set2);
       
   218 	set2->AddServiceCenterL(_L("Radiolinja0"),_L("+358508771010"));
       
   219 	set2->AddServiceCenterL(_L("Radiolinja1"),_L("+358508771010"));
       
   220 	set2->AddServiceCenterL(_L("Radiolinja2"),_L("+358508771010"));
       
   221 	set2->AddServiceCenterL(_L("Radiolinja3"),_L("+358508771010"));
       
   222 	set2->AddServiceCenterL(_L("Radiolinja4"),_L("+358508771010"));
       
   223 	set2->SetDefaultServiceCenter(1);
       
   224 	iSmsTest(set2->DefaultServiceCenter()==1);
       
   225 // Validity Period	
       
   226 	set2->SetValidityPeriod(ESmsVPSixHours);
       
   227 	iSmsTest(set2->ValidityPeriod().Int()==ESmsVPSixHours);
       
   228 // Reply Quoted
       
   229 	set2->SetReplyQuoted(EFalse);
       
   230 	iSmsTest(!set2->ReplyQuoted());
       
   231 // Reject Duplicate 
       
   232 	set2->SetRejectDuplicate(ETrue);
       
   233 	iSmsTest(set2->RejectDuplicate());
       
   234 // Delivery Method
       
   235 	set2->SetDelivery(ESmsDeliveryUponRequest);
       
   236 	iSmsTest(set2->Delivery()==ESmsDeliveryUponRequest);
       
   237 // Delivery Report
       
   238 	set2->SetDeliveryReport(ETrue);
       
   239 	iSmsTest(set2->DeliveryReport());
       
   240 // Reply Path
       
   241 	set2->SetReplyPath(EFalse);
       
   242 	iSmsTest(!set2->ReplyPath());
       
   243 // Message Conversion
       
   244 	set2->SetMessageConversion(ESmsConvPIDNone);
       
   245 	iSmsTest(set2->MessageConversion()==ESmsConvPIDNone);
       
   246 // Can Concatenate
       
   247 	set2->SetCanConcatenate(ETrue);
       
   248 	iSmsTest(set2->CanConcatenate());
       
   249 // Character Set
       
   250 	set2->SetCharacterSet(TSmsDataCodingScheme::ESmsAlphabet8Bit);
       
   251 	iSmsTest(set2->CharacterSet()==TSmsDataCodingScheme::ESmsAlphabet8Bit);
       
   252 // Validity period format
       
   253 	set2->SetValidityPeriodFormat(TSmsFirstOctet::ESmsVPFSemiOctet);
       
   254 	iSmsTest(set2->ValidityPeriodFormat()==TSmsFirstOctet::ESmsVPFSemiOctet);
       
   255 // Status Report Handling
       
   256 	set2->SetStatusReportHandling(CSmsSettings::EMoveReportToInboxVisible);
       
   257 	iSmsTest(set2->StatusReportHandling()==CSmsSettings::EMoveReportToInboxVisible);
       
   258 // Special Message Handling
       
   259 	set2->SetSpecialMessageHandling(CSmsSettings::EMoveReportToInboxVisible);
       
   260 	iSmsTest(set2->SpecialMessageHandling()==CSmsSettings::EMoveReportToInboxVisible);
       
   261 
       
   262 	TestStoreRestoreSettingsL(*set2);
       
   263 
       
   264 	set2->SetClass2Folder(123);
       
   265 	TestStoreRestoreSettingsL(*set2);
       
   266 
       
   267 	CleanupStack::PopAndDestroy(set2);
       
   268 
       
   269 	iSmsTest.iServiceSettings->CopyL(*settings);  // Lets copy the current setting to the service settings
       
   270 
       
   271 	iSmsTest(CompareSettings(*iSmsTest.iServiceSettings, *settings));
       
   272 
       
   273 	iSmsTest.Printf(_L("CSmsSettings::CopyL() 2\n"));
       
   274 
       
   275 	CleanupStack::PopAndDestroy(settings);
       
   276 
       
   277 	iSmsTest.Printf(_L("Test Create Settings Passed\n"));
       
   278 
       
   279 	TestSettingsStoreToCommDbL();
       
   280 
       
   281 	iSmsTest.Printf(_L("TestSettingsStoreToCommDbL Passed\n"));
       
   282 
       
   283 	}
       
   284 
       
   285 
       
   286 TBool CSmutTest::CompareSettingsFiles(
       
   287 	RFs& aFs, const TDesC& aCompare1, const TDesC& aCompare2
       
   288 	)
       
   289 	{
       
   290 	TBool identical = ETrue;
       
   291 
       
   292 	RFileReadStream stream1;
       
   293 	RFileReadStream stream2;
       
   294 
       
   295 	// Open each stream for binary read.
       
   296 	stream1.Open(aFs, aCompare1, EFileStream | EFileRead);
       
   297 	stream2.Open(aFs, aCompare2, EFileStream | EFileRead);
       
   298 
       
   299 	TInt ret1 = KErrNone;
       
   300 	TInt ret2 = KErrNone;
       
   301 	TBool finished = EFalse;
       
   302 	TUint8 byte1 = 0;
       
   303 	TUint8 byte2 = 0;
       
   304 
       
   305 	while (!finished)
       
   306 		{
       
   307 		TRAP(ret1, byte1 = stream1.ReadUint8L());
       
   308 		TRAP(ret2, byte2 = stream2.ReadUint8L());
       
   309 
       
   310 		if (byte1 != byte2 || ret1 == KErrEof || ret2 == KErrEof)
       
   311 			{
       
   312 			// Either file data or lengths differ.
       
   313 			if ((byte1 != byte2) || (ret1 != ret2))
       
   314 				identical = EFalse;
       
   315 			finished = ETrue;
       
   316 			}
       
   317 		}
       
   318 
       
   319 	stream1.Close();
       
   320 	stream2.Close();
       
   321 
       
   322 	return identical;
       
   323 	}
       
   324 
       
   325 void CSmutTest::TestStoreRestoreSettingsL(const CSmsSettings& aSettings)
       
   326 	{
       
   327 	StoreSettingsL(aSettings);
       
   328 
       
   329 // Lets read the service and see it the values are still ok
       
   330 	CSmsSettings* set1=CSmsSettings::NewL();
       
   331 	CleanupStack::PushL(set1);
       
   332 
       
   333 	RestoreSettingsL(*set1);
       
   334 
       
   335 	iSmsTest(CompareSettings(*set1, aSettings));
       
   336 
       
   337 	CleanupStack::PopAndDestroy(set1);
       
   338 	}
       
   339 
       
   340 void CSmutTest::TestSettingsMembersL(CSmsSettings& aSettings)
       
   341 	{
       
   342 // Status Report Handling (what should be done to report messages)
       
   343 	aSettings.SetStatusReportHandling(CSmsSettings::EMoveReportToInboxInvisible);
       
   344 	iSmsTest(aSettings.StatusReportHandling()==CSmsSettings::EMoveReportToInboxInvisible);
       
   345 	aSettings.SetStatusReportHandling(CSmsSettings::EMoveReportToInboxVisible);
       
   346 	iSmsTest(aSettings.StatusReportHandling()==CSmsSettings::EMoveReportToInboxVisible);
       
   347 	aSettings.SetStatusReportHandling(CSmsSettings::EDiscardReport);
       
   348 	iSmsTest(aSettings.StatusReportHandling()==CSmsSettings::EDiscardReport);
       
   349 	aSettings.SetStatusReportHandling(CSmsSettings::EMoveReportToInboxInvisibleAndMatch);
       
   350 	iSmsTest(aSettings.StatusReportHandling()==CSmsSettings::EMoveReportToInboxInvisibleAndMatch);
       
   351 	aSettings.SetStatusReportHandling(CSmsSettings::EMoveReportToInboxVisibleAndMatch);
       
   352 	iSmsTest(aSettings.StatusReportHandling()==CSmsSettings::EMoveReportToInboxVisibleAndMatch);
       
   353 	aSettings.SetStatusReportHandling(CSmsSettings::EDiscardReportAndMatch);
       
   354 	iSmsTest(aSettings.StatusReportHandling()==CSmsSettings::EDiscardReportAndMatch);
       
   355 	iSmsTest.Printf(_L("Test Status Report Handling Passed\n"));
       
   356 
       
   357 // SC handling
       
   358 	aSettings.AddServiceCenterL(_L("Radiolinja0"),_L("+358508771010"));
       
   359 	aSettings.AddServiceCenterL(_L("Radiolinja1"),_L("+358508771010"));
       
   360 	aSettings.AddServiceCenterL(_L("Radiolinja2"),_L("+358508771010"));
       
   361 	aSettings.AddServiceCenterL(_L("Radiolinja3"),_L("+358508771010"));
       
   362 	aSettings.AddServiceCenterL(_L("Radiolinja4"),_L("+358508771010"));
       
   363 	iSmsTest(aSettings.GetServiceCenter(0).Name()==_L("Radiolinja0"));
       
   364 	aSettings.RemoveServiceCenter(aSettings.ServiceCenterCount()-3);
       
   365 	aSettings.RemoveServiceCenter(aSettings.ServiceCenterCount()-2);
       
   366 	iSmsTest(aSettings.GetServiceCenter(1).Name()==_L("Radiolinja1"));
       
   367 	iSmsTest(aSettings.GetServiceCenter(2).Name()==_L("Radiolinja4"));
       
   368 	iSmsTest(aSettings.GetServiceCenter(2).Address()==_L("+358508771010"));
       
   369 	aSettings.RemoveServiceCenter(aSettings.ServiceCenterCount()-1);
       
   370 	aSettings.RemoveServiceCenter(aSettings.ServiceCenterCount()-1);
       
   371 	aSettings.RemoveServiceCenter(aSettings.ServiceCenterCount()-1);
       
   372 //	aSettings.RemoveServiceCenter(aSettings.ServiceCenterCount()-1); // this would be -1
       
   373 	aSettings.AddServiceCenterL(_L("Radiolinja0"),_L("+358508771010"));
       
   374 	aSettings.AddServiceCenterL(_L("Radiolinja1"),_L("+358508771010"));
       
   375 	aSettings.AddServiceCenterL(_L("Radiolinja2"),_L("+358508771010"));
       
   376 	aSettings.SetDefaultServiceCenter(1);
       
   377 	iSmsTest(aSettings.DefaultServiceCenter()==1);
       
   378 	aSettings.SetDefaultServiceCenter(2);
       
   379 	iSmsTest(aSettings.DefaultServiceCenter()==2);
       
   380 	iSmsTest.Printf(_L("Test Default SC Passed\n"));
       
   381 
       
   382 // Special Message Handling (what should be done to special messages)
       
   383 	aSettings.SetSpecialMessageHandling(CSmsSettings::EMoveReportToInboxInvisible);
       
   384 	iSmsTest(aSettings.SpecialMessageHandling()==CSmsSettings::EMoveReportToInboxInvisible);
       
   385 	aSettings.SetSpecialMessageHandling(CSmsSettings::EMoveReportToInboxVisible);
       
   386 	iSmsTest(aSettings.SpecialMessageHandling()==CSmsSettings::EMoveReportToInboxVisible);
       
   387 	aSettings.SetSpecialMessageHandling(CSmsSettings::EDiscardReport);
       
   388 	iSmsTest(aSettings.SpecialMessageHandling()==CSmsSettings::EDiscardReport);
       
   389 	aSettings.SetSpecialMessageHandling(CSmsSettings::EMoveReportToInboxInvisibleAndMatch);
       
   390 	iSmsTest(aSettings.SpecialMessageHandling()==CSmsSettings::EMoveReportToInboxInvisibleAndMatch);
       
   391 	aSettings.SetSpecialMessageHandling(CSmsSettings::EMoveReportToInboxVisibleAndMatch);
       
   392 	iSmsTest(aSettings.SpecialMessageHandling()==CSmsSettings::EMoveReportToInboxVisibleAndMatch);
       
   393 	aSettings.SetSpecialMessageHandling(CSmsSettings::EDiscardReportAndMatch);
       
   394 	iSmsTest(aSettings.SpecialMessageHandling()==CSmsSettings::EDiscardReportAndMatch);
       
   395 	iSmsTest.Printf(_L("Test Special Message Handling Passed\n"));
       
   396 
       
   397 //CommDbAction
       
   398 	aSettings.SetCommDbAction(CSmsSettings::ENone);
       
   399 	iSmsTest(aSettings.CommDbAction() == CSmsSettings::ENone);
       
   400 	aSettings.SetCommDbAction(CSmsSettings::EStoreToCommDb);
       
   401 	iSmsTest(aSettings.CommDbAction() == CSmsSettings::EStoreToCommDb);
       
   402 	iSmsTest.Printf(_L("Test CommDb Action Passed\n"));
       
   403 
       
   404 //SmsBearerAction
       
   405 	aSettings.SetSmsBearerAction(CSmsSettings::ENone);
       
   406 	iSmsTest(aSettings.SmsBearerAction() == CSmsSettings::ENone);
       
   407 	aSettings.SetSmsBearerAction(CSmsSettings::EStoreToCommDb);
       
   408 	iSmsTest(aSettings.SmsBearerAction() == CSmsSettings::EStoreToCommDb);
       
   409 	iSmsTest.Printf(_L("Test SMS Bearer Action Passed\n"));
       
   410 
       
   411 //SmsBearer
       
   412 	aSettings.SetSmsBearer(CSmsSettings::ESmsBearerPacketOnly);
       
   413 	iSmsTest(aSettings.SmsBearer() == CSmsSettings::ESmsBearerPacketOnly);
       
   414 	aSettings.SetSmsBearer(CSmsSettings::ESmsBearerPacketOnly);
       
   415 	iSmsTest(aSettings.SmsBearer() == CSmsSettings::ESmsBearerPacketOnly);
       
   416 	aSettings.SetSmsBearer(CSmsSettings::ESmsBearerCircuitOnly);
       
   417 	iSmsTest(aSettings.SmsBearer() == CSmsSettings::ESmsBearerCircuitOnly);
       
   418 	aSettings.SetSmsBearer(CSmsSettings::ESmsBearerPacketPreferred);
       
   419 	iSmsTest(aSettings.SmsBearer() == CSmsSettings::ESmsBearerPacketPreferred);
       
   420 	aSettings.SetSmsBearer(CSmsSettings::ESmsBearerCircuitPreferred);
       
   421 	iSmsTest(aSettings.SmsBearer() == CSmsSettings::ESmsBearerCircuitPreferred);
       
   422 	iSmsTest.Printf(_L("Test SMS Bearer Passed\n"));
       
   423 
       
   424 // Reply Quoted
       
   425 	aSettings.SetReplyQuoted(EFalse);
       
   426 	iSmsTest(!aSettings.ReplyQuoted());
       
   427 	aSettings.SetReplyQuoted(ETrue);
       
   428 	iSmsTest(aSettings.ReplyQuoted());
       
   429 	iSmsTest.Printf(_L("Test Reply Quoted Passed\n"));
       
   430 
       
   431 // Delivery Method
       
   432 	aSettings.SetDelivery(ESmsDeliveryUponRequest);
       
   433 	iSmsTest(aSettings.Delivery()==ESmsDeliveryUponRequest);
       
   434 	aSettings.SetDelivery(ESmsDeliveryScheduled);
       
   435 	iSmsTest(aSettings.Delivery()==ESmsDeliveryScheduled);
       
   436 	aSettings.SetDelivery(ESmsDeliveryImmediately);
       
   437 	iSmsTest(aSettings.Delivery()==ESmsDeliveryImmediately);
       
   438 	iSmsTest.Printf(_L("Test Delivery Passed\n"));
       
   439 
       
   440 // Class2Folder
       
   441 	iSmsTest(aSettings.Class2Folder() == KMsvGlobalInBoxIndexEntryId);
       
   442 	aSettings.SetClass2Folder(1);
       
   443 	iSmsTest(aSettings.Class2Folder() == 1);
       
   444 	iSmsTest.Printf(_L("Test Class2Folder Passed\n"));	
       
   445 
       
   446 // Description length
       
   447 	iSmsTest(aSettings.DescriptionLength() == KSmsDescriptionLength);
       
   448 	aSettings.SetDescriptionLength(100);
       
   449 	iSmsTest(aSettings.DescriptionLength() == 100);
       
   450 	iSmsTest.Printf(_L("Test DescriptionLength Passed\n"));	
       
   451 	}
       
   452 
       
   453 void CSmutTest::TestMessageSettingsMembersL(CSmsMessageSettings& aSettings)
       
   454 	{
       
   455 
       
   456 // Reject Duplicate 
       
   457 	aSettings.SetRejectDuplicate(ETrue);
       
   458 	iSmsTest(aSettings.RejectDuplicate());
       
   459 	aSettings.SetRejectDuplicate(EFalse);
       
   460 	iSmsTest(!aSettings.RejectDuplicate());
       
   461 	iSmsTest.Printf(_L("Test Reject Duplicate Passed\n"));
       
   462 
       
   463 // Delivery Report
       
   464 	aSettings.SetDeliveryReport(ETrue);
       
   465 	iSmsTest(aSettings.DeliveryReport());
       
   466 	aSettings.SetDeliveryReport(EFalse);
       
   467 	iSmsTest(!aSettings.DeliveryReport());
       
   468 	iSmsTest.Printf(_L("Test Delivery Report Passed\n"));
       
   469 
       
   470 // Reply Path
       
   471 	aSettings.SetReplyPath(EFalse);
       
   472 	iSmsTest(aSettings.ReplyPath()==EFalse);
       
   473 	aSettings.SetReplyPath(ETrue);
       
   474 	iSmsTest(aSettings.ReplyPath());
       
   475 	iSmsTest.Printf(_L("Test Reply Path Passed\n"));
       
   476 
       
   477 // Validity period format
       
   478 	aSettings.SetValidityPeriodFormat(TSmsFirstOctet::ESmsVPFNone);
       
   479 	iSmsTest(aSettings.ValidityPeriodFormat()==TSmsFirstOctet::ESmsVPFNone);
       
   480 	aSettings.SetValidityPeriodFormat(TSmsFirstOctet::ESmsVPFEnhanced);
       
   481 	iSmsTest(aSettings.ValidityPeriodFormat()==TSmsFirstOctet::ESmsVPFEnhanced);
       
   482 	aSettings.SetValidityPeriodFormat(TSmsFirstOctet::ESmsVPFInteger);
       
   483 	iSmsTest(aSettings.ValidityPeriodFormat()==TSmsFirstOctet::ESmsVPFInteger);
       
   484 	aSettings.SetValidityPeriodFormat(TSmsFirstOctet::ESmsVPFSemiOctet);
       
   485 	iSmsTest(aSettings.ValidityPeriodFormat()==TSmsFirstOctet::ESmsVPFSemiOctet);
       
   486 	iSmsTest.Printf(_L("Test Validity Period Format Passed\n"));
       
   487 
       
   488 // Message Conversion (following conversions are supported)
       
   489 	aSettings.SetMessageConversion(ESmsConvFax);
       
   490 	iSmsTest(aSettings.MessageConversion()==ESmsConvFax);
       
   491 	aSettings.SetMessageConversion(ESmsConvX400);
       
   492 	iSmsTest(aSettings.MessageConversion()==ESmsConvX400);
       
   493 	aSettings.SetMessageConversion(ESmsConvPaging);
       
   494 	iSmsTest(aSettings.MessageConversion()==ESmsConvPaging);
       
   495 	aSettings.SetMessageConversion(ESmsConvMail);
       
   496 	iSmsTest(aSettings.MessageConversion()==ESmsConvMail);
       
   497 	aSettings.SetMessageConversion(ESmsConvErmes);
       
   498 	iSmsTest(aSettings.MessageConversion()==ESmsConvErmes);
       
   499 	aSettings.SetMessageConversion(ESmsConvSpeech);
       
   500 	iSmsTest(aSettings.MessageConversion()==ESmsConvSpeech);
       
   501 	aSettings.SetMessageConversion(ESmsConvPIDNone);
       
   502 	iSmsTest(aSettings.MessageConversion()==ESmsConvPIDNone);
       
   503 	iSmsTest.Printf(_L("Test Message Conversion Passed\n"));
       
   504 
       
   505 // Validity Period	
       
   506 	aSettings.SetValidityPeriod(ESmsVPHour);
       
   507 	iSmsTest(aSettings.ValidityPeriod().Int()==ESmsVPHour);
       
   508 	aSettings.SetValidityPeriod(ESmsVPSixHours);
       
   509 	iSmsTest(aSettings.ValidityPeriod().Int()==ESmsVPSixHours);
       
   510 	aSettings.SetValidityPeriod(ESmsVP24Hours);
       
   511 	iSmsTest(aSettings.ValidityPeriod().Int()==ESmsVP24Hours);
       
   512 	aSettings.SetValidityPeriod(ESmsVPMaximum);
       
   513 	iSmsTest(aSettings.ValidityPeriod().Int()==ESmsVPMaximum);
       
   514 	aSettings.SetValidityPeriod(ESmsVPWeek);
       
   515 	iSmsTest(aSettings.ValidityPeriod().Int()==ESmsVPWeek);
       
   516 	iSmsTest.Printf(_L("Test Validity Period Passed\n"));
       
   517 
       
   518 // Can Concatenate (write messages with more than 160 characters)
       
   519 	aSettings.SetCanConcatenate(ETrue);
       
   520 	iSmsTest(aSettings.CanConcatenate());
       
   521 	aSettings.SetCanConcatenate(EFalse);
       
   522 	iSmsTest(aSettings.CanConcatenate()==EFalse);
       
   523 	iSmsTest.Printf(_L("Test Can Concatenate Passed\n"));
       
   524 
       
   525 // Character Set (following character sets are supported)
       
   526 	aSettings.SetCharacterSet(TSmsDataCodingScheme::ESmsAlphabet7Bit);
       
   527 	iSmsTest(aSettings.CharacterSet()==TSmsDataCodingScheme::ESmsAlphabet7Bit);
       
   528 	aSettings.SetCharacterSet(TSmsDataCodingScheme::ESmsAlphabetUCS2);
       
   529 	iSmsTest(aSettings.CharacterSet()==TSmsDataCodingScheme::ESmsAlphabetUCS2);
       
   530 	aSettings.SetCharacterSet(TSmsDataCodingScheme::ESmsAlphabet8Bit);
       
   531 	iSmsTest(aSettings.CharacterSet()==TSmsDataCodingScheme::ESmsAlphabet8Bit);
       
   532 	iSmsTest.Printf(_L("Test Character Set Passed\n"));
       
   533 	}
       
   534 
       
   535 TBool CSmutTest::CompareSettings(const CSmsSettings& aLeft, const CSmsSettings& aRight, TBool aTestSC)
       
   536 	{
       
   537 	TCompare compare(CompareMessageSettings(aLeft, aRight));
       
   538 
       
   539 	compare(aLeft.CommDbAction() == aRight.CommDbAction());
       
   540 	compare(aLeft.SmsBearerAction() == aRight.SmsBearerAction());
       
   541 	compare(aLeft.SmsBearer() == aRight.SmsBearer());
       
   542 	compare(aLeft.Delivery() == aRight.Delivery());
       
   543 	compare(CompareBools(aLeft.ReplyQuoted(), aRight.ReplyQuoted()));
       
   544 	compare(aLeft.SpecialMessageHandling() == aRight.SpecialMessageHandling());
       
   545 	compare(aLeft.StatusReportHandling() == aRight.StatusReportHandling());
       
   546 
       
   547 	if (aTestSC)
       
   548 		{
       
   549 		compare(aLeft.DefaultServiceCenter() == aRight.DefaultServiceCenter());
       
   550 		compare(aLeft.ServiceCenterCount() == aRight.ServiceCenterCount());
       
   551 
       
   552 		TInt count = aLeft.ServiceCenterCount();
       
   553 
       
   554 		while (count--)
       
   555 			{
       
   556 			compare(CompareServiceCenters(aLeft.GetServiceCenter(count), aRight.GetServiceCenter(count)));
       
   557 			}
       
   558 		}		
       
   559 
       
   560 	compare(aLeft.Class2Folder() == aRight.Class2Folder());
       
   561 	compare(aLeft.DescriptionLength() == aRight.DescriptionLength());
       
   562 
       
   563 	return compare;
       
   564 	}
       
   565 
       
   566 TBool CSmutTest::CompareMessageSettings(const CSmsMessageSettings& aLeft, const CSmsMessageSettings& aRight)
       
   567 	{
       
   568 	TCompare compare(CompareBools(aLeft.CanConcatenate(), aRight.CanConcatenate()));
       
   569 	compare(aLeft.CharacterSet() == aRight.CharacterSet());
       
   570 	compare(CompareBools(aLeft.DeliveryReport(), aRight.DeliveryReport()));
       
   571 	compare(aLeft.MessageConversion() == aRight.MessageConversion());
       
   572 	compare(CompareBools(aLeft.RejectDuplicate(), aRight.RejectDuplicate()));
       
   573 	compare(CompareBools(aLeft.ReplyPath(), aRight.ReplyPath()));
       
   574 	compare(aLeft.ValidityPeriod() == aRight.ValidityPeriod());
       
   575 	compare(aLeft.ValidityPeriodFormat() == aRight.ValidityPeriodFormat());
       
   576 	return compare;
       
   577 	}
       
   578 
       
   579 void CSmutTest::TestSettingsRestoreDefectL()
       
   580 	{
       
   581 	//Test fix for defects EDNAALR-4KTKTD (CSmsSettings::RestoreL() should leave if stream not present)
       
   582 	//and EDNAALR-4KTKLP (CSmsSettings::InternalizeL() causes memory leak)
       
   583 
       
   584 	CSmsSettings* settings = CSmsSettings::NewL();
       
   585 	CleanupStack::PushL(settings);
       
   586 
       
   587 	//Test defect fix for EDNAALR-4KTKTD (CSmsSettings::RestoreL() should leave if stream not present)
       
   588 	const TMsvId id = iSmsTest.CreateDummyMessageToSendL();
       
   589 	Session().CleanupEntryPushL(id);
       
   590 	iSmsTest.SetEntryL(id);
       
   591 
       
   592 	iSmsTest.Printf(_L("TestSettingsRestoreDefectL Created dummy message\n"));
       
   593 
       
   594 	TRAPD(err, RestoreSettingsL(*settings));
       
   595 
       
   596 	iSmsTest.Printf(_L("TestSettingsRestoreDefectL RestoreL 1 with error %d\n"), err);
       
   597 	iSmsTest.Printf(_L("Expected %d\n"), KErrNotFound);
       
   598 	iSmsTest(err == KErrNotFound);
       
   599 
       
   600 	//Test defect fix for EDNAALR-4KTKLP (CSmsSettings::InternalizeL() causes memory leak)
       
   601 //	iSmsTest.SetEntryL(id);
       
   602 	StoreSettingsL(*settings);
       
   603 
       
   604 	iSmsTest.Printf(_L("TestSettingsRestoreDefectL StoreL 1\n"));
       
   605 
       
   606 	settings->AddServiceCenterL(_L("Unknown"), _L("447785016005"));
       
   607 
       
   608 	RestoreSettingsL(*settings);
       
   609 
       
   610 	Session().CleanupEntryPop();
       
   611 	Session().RemoveEntry(id);
       
   612 
       
   613 	CleanupStack::PopAndDestroy(settings);
       
   614 	iSmsTest.Printf(_L("TestSettingsRestoreDefectL RestoreL 2\n"));
       
   615 	}
       
   616 
       
   617 
       
   618 void CSmutTest::TestSettingsStoreToCommDbL()
       
   619 	{
       
   620 	iSmsTest.Test().Next(_L("Storing CSmsSettings to CommDb\n"));
       
   621 	iSmsTest.Printf(_L("Test Store Settings to CommDb\n"));
       
   622 
       
   623 	CSmsSettings* settings1 = CSmsSettings::NewL();
       
   624 	CleanupStack::PushL(settings1);
       
   625 
       
   626 	CSmsSettings* settings2 = CSmsSettings::NewL();
       
   627 	CleanupStack::PushL(settings2);
       
   628 
       
   629 	iSmsTest(CompareSettings(*settings1, *settings2));
       
   630 
       
   631 	settings1->SetCommDbAction(CSmsSettings::EStoreToCommDb);
       
   632 	settings1->AddServiceCenterL(_L("Vodafone"), _L("+447785016005"));
       
   633 	settings1->SetDeliveryReport(ETrue);
       
   634 	settings1->SetValidityPeriod(1000);
       
   635 
       
   636 	iSmsTest.SetEntryL(iSmsTest.iSmsServiceId);
       
   637 
       
   638 	StoreSettingsL(*settings1);
       
   639 	iSmsTest.Printf(_L("\tNew Settings...\n"));
       
   640 	iSmsTest(CompareSettingsAndCommDbL(*settings1));
       
   641 
       
   642 	settings1->GetServiceCenter(settings1->DefaultServiceCenter()).SetAddressL(_L("+3854354433"));
       
   643 
       
   644 	StoreSettingsL(*settings1);
       
   645 	iSmsTest.Printf(_L("\tSC Address Changed...\n"));
       
   646 	iSmsTest(CompareSettingsAndCommDbL(*settings1));
       
   647 	
       
   648 	settings1->SetDeliveryReport(EFalse);
       
   649 
       
   650 	StoreSettingsL(*settings1);
       
   651 	iSmsTest.Printf(_L("\tDelivery Report Changed...\n"));
       
   652 	iSmsTest(CompareSettingsAndCommDbL(*settings1));
       
   653 
       
   654 	settings1->SetValidityPeriod(2000);
       
   655 
       
   656 	StoreSettingsL(*settings1);
       
   657 	iSmsTest.Printf(_L("\tValidity Period Changed...\n"));
       
   658 	iSmsTest(CompareSettingsAndCommDbL(*settings1));
       
   659 
       
   660 	settings1->GetServiceCenter(settings1->DefaultServiceCenter()).SetAddressL(_L("+48996655888"));
       
   661 	settings1->SetDeliveryReport(ETrue);
       
   662 	settings1->SetValidityPeriod(3000);
       
   663 
       
   664 	StoreSettingsL(*settings1);
       
   665 	iSmsTest.Printf(_L("\tAll Settings Changed...\n"));
       
   666 	iSmsTest(CompareSettingsAndCommDbL(*settings1));
       
   667 
       
   668 	settings1->AddServiceCenterL(_L("Radio"), _L("+385669988"));
       
   669 	settings1->SetDefaultServiceCenter(settings1->ServiceCenterCount()-1);
       
   670 
       
   671 	StoreSettingsL(*settings1);
       
   672 	iSmsTest.Printf(_L("\tDefaultSC Changed...\n"));
       
   673 	iSmsTest(CompareSettingsAndCommDbL(*settings1));
       
   674 
       
   675 	settings1->SetCommDbAction(CSmsSettings::ENone);
       
   676 	settings1->GetServiceCenter(settings1->DefaultServiceCenter()).SetAddressL(_L("+123456789"));
       
   677 	settings1->SetDeliveryReport(EFalse);
       
   678 	settings1->SetValidityPeriod(4000);
       
   679 
       
   680 	iSmsTest.Printf(_L("\tTesting Setting Different from CommDb...\n"));
       
   681 	iSmsTest(!CompareSettingsAndCommDbL(*settings1));
       
   682 
       
   683 	TInt count = settings1->ServiceCenterCount();
       
   684 
       
   685 	while (count--)
       
   686 		{
       
   687 		settings1->RemoveServiceCenter(count);
       
   688 		}
       
   689 
       
   690 	iSmsTest.Printf(_L("\tTesting Setting Different from CommDb...\n"));
       
   691 	iSmsTest(!CompareSettingsAndCommDbL(*settings1));
       
   692 
       
   693 	iSmsTest.Printf(_L("\tRestore settings from store...\n"));
       
   694 	RestoreSettingsL(*settings2);
       
   695 	iSmsTest(CompareSettingsAndCommDbL(*settings2));
       
   696 
       
   697 //Test SMS Bearer
       
   698 
       
   699 	iSmsTest.Printf(_L("\tTest Store SMS Bearer...\n"));
       
   700 
       
   701 //Test 1
       
   702 
       
   703 	settings1->SetSmsBearerAction(CSmsSettings::EStoreToCommDb);
       
   704 	settings1->SetSmsBearer(CSmsSettings::ESmsBearerPacketOnly);
       
   705 
       
   706 	StoreSettingsL(*settings1);
       
   707 	iSmsTest(CompareSettingsAndSmsBearerL(*settings1));
       
   708 	
       
   709 //Test 2
       
   710 
       
   711 	settings1->SetSmsBearer(CSmsSettings::ESmsBearerCircuitOnly);
       
   712 	iSmsTest(!CompareSettingsAndSmsBearerL(*settings1));
       
   713 
       
   714 //Test 3
       
   715 
       
   716 	StoreSettingsL(*settings1);
       
   717 	iSmsTest(CompareSettingsAndSmsBearerL(*settings1));
       
   718 
       
   719 	RestoreSettingsL(*settings2);
       
   720 	iSmsTest(CompareSettingsAndSmsBearerL(*settings2));
       
   721 
       
   722 //Test 4
       
   723 
       
   724 	settings1->SetSmsBearerAction(CSmsSettings::ENone);
       
   725 	StoreSettingsL(*settings1);
       
   726 	iSmsTest(CompareSettingsAndSmsBearerL(*settings1));
       
   727 
       
   728 //Test 5
       
   729 
       
   730 	settings1->SetSmsBearer(CSmsSettings::ESmsBearerCircuitPreferred);
       
   731 	iSmsTest(!CompareSettingsAndSmsBearerL(*settings1));
       
   732 	StoreSettingsL(*settings1);
       
   733 	iSmsTest(!CompareSettingsAndSmsBearerL(*settings1));
       
   734 
       
   735 	CleanupStack::PopAndDestroy(2); //settings1, settings2
       
   736 	}
       
   737 
       
   738 TBool CSmutTest::CompareSettingsAndCommDbL(const CSmsSettings& aSettings) const
       
   739 	{
       
   740 	TCompare compare = ETrue;
       
   741 	TBuf<256> scAddress;
       
   742 	CMDBRecordSet<CCDGlobalSettingsRecord> globalSettingsRecord(KCDTIdGlobalSettingsRecord);
       
   743 	TRAPD(err, globalSettingsRecord.LoadL(*iDBSession));
       
   744 	if(err != KErrNone)
       
   745 		{
       
   746 		User::Leave(KErrNotFound);	
       
   747 		}
       
   748 	CCDModemBearerRecord *modemBearerRecord = static_cast<CCDModemBearerRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord));
       
   749 	CleanupStack::PushL(modemBearerRecord);
       
   750 	modemBearerRecord->SetRecordId(((CCDGlobalSettingsRecord*)globalSettingsRecord.iRecords[0])->iModemForPhoneServicesAndSMS); 
       
   751 	modemBearerRecord->LoadL(*iDBSession);
       
   752 	scAddress = modemBearerRecord->iMessageCentreNumber;
       
   753 
       
   754 	if (aSettings.DefaultServiceCenter() < 0 || !aSettings.ServiceCenterCount())
       
   755 		{
       
   756 		compare(!scAddress.Length());
       
   757 		}
       
   758 	else
       
   759 		{
       
   760 		compare(scAddress == aSettings.GetServiceCenter(aSettings.DefaultServiceCenter()).Address());
       
   761 		}
       
   762 	
       
   763 	TUint32 valPeriod = 0;
       
   764 	valPeriod = modemBearerRecord->iMessageValidityPeriod;
       
   765 	compare(valPeriod == (TUint32) aSettings.ValidityPeriod().Int());
       
   766 	
       
   767 	TBool delReport = EFalse;
       
   768 	delReport = modemBearerRecord->iMessageDeliveryReport;
       
   769 	compare(delReport ? aSettings.DeliveryReport() : !aSettings.DeliveryReport());
       
   770 
       
   771 	CleanupStack::PopAndDestroy(modemBearerRecord);	
       
   772 
       
   773 	return compare;
       
   774 	}
       
   775 
       
   776 TBool CSmutTest::CompareSettingsAndSmsBearerL(const CSmsSettings& aSettings) const
       
   777 	{
       
   778 	CMDBRecordSet<CCDGlobalSettingsRecord> globalSettingsRecord(KCDTIdGlobalSettingsRecord);
       
   779 	globalSettingsRecord.LoadL(*iDBSession);
       
   780 	TUint32 smsBearer = ((CCDGlobalSettingsRecord*)globalSettingsRecord.iRecords[0])->iSMSBearer;		
       
   781 	TCompare compare(smsBearer == (TUint32) aSettings.SmsBearer());
       
   782 	return compare;
       
   783 	}
       
   784 
       
   785 void CSmutTest::StoreNumberL(const CSmsNumber& aNumber, TUid aStreamId)
       
   786 	{
       
   787 	CMsvStore* store = iSmsTest.EditStoreL(); // lets edit the entry
       
   788 	CleanupStack::PushL(store);
       
   789 
       
   790 	RMsvWriteStream out;
       
   791 	out.AssignLC(*store, aStreamId);		// file stream id ok?
       
   792 	aNumber.ExternalizeL(out);				// lets extrenalise the instance
       
   793 	out.CommitL();
       
   794 	store->CommitL();
       
   795 
       
   796 	CleanupStack::PopAndDestroy(2, store);
       
   797 	}
       
   798 
       
   799 void CSmutTest::RestoreNumberL(CSmsNumber& rNumber, TUid aStreamId)
       
   800 	{
       
   801 	CMsvStore* store = iSmsTest.ReadStoreL(); // prepare the store for reading
       
   802 	CleanupStack::PushL(store);
       
   803 
       
   804 	RMsvReadStream in;
       
   805 	in.OpenLC(*store, aStreamId);		// lets open the store for 
       
   806 	rNumber.InternalizeL(in);				// internalising the address/name
       
   807 
       
   808 	CleanupStack::PopAndDestroy(2, store);
       
   809 	}
       
   810 
       
   811 void CSmutTest::StoreHeaderL(const CSmsHeader& aHeader)
       
   812 	{
       
   813 	CMsvStore* store = iSmsTest.EditStoreL();
       
   814 	CleanupStack::PushL(store);
       
   815 
       
   816 	aHeader.StoreL(*store);
       
   817 	store->CommitL();
       
   818 
       
   819 	CleanupStack::PopAndDestroy(store);
       
   820 	}
       
   821 
       
   822 void CSmutTest::RestoreHeaderL(CSmsHeader& aHeader)
       
   823 	{
       
   824 	CMsvStore* store = iSmsTest.ReadStoreL();
       
   825 	CleanupStack::PushL(store);
       
   826 
       
   827 	aHeader.RestoreL(*store);
       
   828 
       
   829 	CleanupStack::PopAndDestroy(store);
       
   830 	}
       
   831 
       
   832 void CSmutTest::StoreSettingsL(const CSmsSettings& aSettings)
       
   833 	{
       
   834 	CSmsAccount* account = CSmsAccount::NewLC();
       
   835 	account->SaveSettingsL(aSettings);
       
   836 	CleanupStack::PopAndDestroy(account);    
       
   837 	}
       
   838 
       
   839 void CSmutTest::RestoreSettingsL(CSmsSettings& aSettings)
       
   840 	{
       
   841 	CSmsAccount* account = CSmsAccount::NewLC();
       
   842 	account->LoadSettingsL(aSettings);
       
   843 	CleanupStack::PopAndDestroy(account);    
       
   844 	}
       
   845 
       
   846 TBool CSmutTest::CompareServiceCenters(const CSmsServiceCenter& aLeft, const CSmsServiceCenter& aRight)
       
   847 	{
       
   848 	TCompare compare(aLeft.Name() == aRight.Name());
       
   849 	compare(aLeft.Address() == aRight.Address());
       
   850 	return compare;	
       
   851 	}
       
   852 
       
   853 TBool CSmutTest::CompareNumbers(const CSmsNumber& aLeft, const CSmsNumber& aRight)
       
   854 	{
       
   855 	TCompare compare(aLeft.Name() == aRight.Name());
       
   856 	compare(aLeft.Address() == aRight.Address());
       
   857 	compare(aLeft.LogId() == aRight.LogId());
       
   858 	compare(aLeft.AckStatus(ESmsAckTypeDelivery) == aRight.AckStatus(ESmsAckTypeDelivery));	
       
   859 	return compare;
       
   860 	}
       
   861 
       
   862 void CSmutTest::TestNumberL()
       
   863 	{
       
   864 	iSmsTest.Test().Next(_L("Testing CSmsNumber"));
       
   865 	iSmsTest.Printf(_L("Preparing test CSmsNumber"));
       
   866 
       
   867 	TMsvId id=iSmsTest.CreateDummyMessageToSendL();
       
   868 	Session().CleanupEntryPushL(id);
       
   869 	iSmsTest.SetEntryL(id);
       
   870 
       
   871 	CSmsNumber* number0=CSmsNumber::NewL();  
       
   872 	CleanupStack::PushL(number0);
       
   873 
       
   874 	CSmsNumber* number=CSmsNumber::NewL();  // create the instance
       
   875 	CleanupStack::PushL(number);
       
   876 
       
   877 	// Testing the features of CSmsNumber
       
   878 	// The max length for a name is 256 characters
       
   879 	// The max length for a number is 20 characters
       
   880 
       
   881 // Lets take an ordinary number, test it, then store and restore it
       
   882 // and see if the values are still ok.
       
   883 
       
   884 	number->SetNameL(_L("Radiolinja1"));	
       
   885 	number->SetAddressL(_L("+358508771010")); 
       
   886 	number->SetLogId(123456789);	
       
   887 	number->SetAckStatus(ESmsAckTypeDelivery, CSmsNumber::EAckSuccessful);
       
   888 
       
   889 	iSmsTest(number->Name()==_L("Radiolinja1")); // name ok?
       
   890 	iSmsTest(number->Address()==_L("+358508771010")); // number ok?
       
   891 	iSmsTest(number->LogId() == 123456789);
       
   892 	iSmsTest(number->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
       
   893 
       
   894 	StoreNumberL(*number);
       
   895 	RestoreNumberL(*number0);
       
   896 	iSmsTest(CompareNumbers(*number0, *number));
       
   897 	
       
   898 // Lets try the max length of the telephone address, store and
       
   899 // restore it and see if it works
       
   900 
       
   901 	number->SetNameL(_L("Whatsthemaximumlengthforthis?Whatsthemaximumlengthforthis?Whatsthemaximumlengthforthis?"));
       
   902 	number->SetAddressL(_L("+0123456789012345678"));
       
   903 	number->SetLogId(987654321);	
       
   904 	number->SetAckStatus(ESmsAckTypeDelivery, CSmsNumber::EAckError);
       
   905 
       
   906 	iSmsTest(number->Name()==_L("Whatsthemaximumlengthforthis?Whatsthemaximumlengthforthis?Whatsthemaximumlengthforthis?"));
       
   907 	iSmsTest(number->Address()==_L("+0123456789012345678"));
       
   908 	iSmsTest(number->LogId() == 987654321);
       
   909 	iSmsTest(number->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
       
   910 
       
   911 	StoreNumberL(*number);
       
   912 	RestoreNumberL(*number0);
       
   913 	iSmsTest(CompareNumbers(*number, *number0));
       
   914 
       
   915 // Lets use special Scandinavian letters both in the name and
       
   916 // address, store and restore and see if they are ok
       
   917 	number->SetNameL(_L("ÖÄÅåöä"));
       
   918 	number->SetAddressL(_L("åäöÅÄÖ"));
       
   919 	number->SetLogId(123456789);	
       
   920 	number->SetAckStatus(ESmsAckTypeDelivery, CSmsNumber::EAckSuccessful);
       
   921 
       
   922 	iSmsTest(number->Name()==_L("ÖÄÅåöä"));
       
   923 	iSmsTest(number->Address()==_L("åäöÅÄÖ"));
       
   924 	iSmsTest(number->LogId() == 123456789);
       
   925 	iSmsTest(number->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
       
   926 
       
   927 	StoreNumberL(*number);
       
   928 	RestoreNumberL(*number0);
       
   929 	iSmsTest(CompareNumbers(*number, *number0));
       
   930 
       
   931 //  Lets try if both the number and the name can be empty,
       
   932 //	store and restore it and see if they still match
       
   933 	number->SetNameL(_L(""));
       
   934 	number->SetAddressL(_L(""));
       
   935 	number->SetLogId(987654321);	
       
   936 	number->SetAckStatus(ESmsAckTypeDelivery, CSmsNumber::EAckError);
       
   937 
       
   938 	iSmsTest(number->Name()==_L(""));
       
   939 	iSmsTest(number->Address()==_L(""));
       
   940 	iSmsTest(number->LogId() == 987654321);
       
   941 	iSmsTest(number->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckError);
       
   942 
       
   943 	StoreNumberL(*number);
       
   944 	RestoreNumberL(*number0);
       
   945 	iSmsTest(CompareNumbers(*number, *number0));
       
   946 
       
   947 //  Lets try [alt+255] as both the name and number, store and	
       
   948 //  restore it and see if it works
       
   949 	number->SetNameL(_L(" ")); //alt+255
       
   950 	number->SetAddressL(_L(" "));
       
   951 	number->SetLogId(123456789);	
       
   952 	number->SetAckStatus(ESmsAckTypeDelivery, CSmsNumber::EAckSuccessful);
       
   953 
       
   954 	iSmsTest(number->Name()==_L(" "));
       
   955 	iSmsTest(number->Address()==_L(" "));
       
   956 	iSmsTest(number->LogId() == 123456789);
       
   957 	iSmsTest(number->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EAckSuccessful);
       
   958 
       
   959 	StoreNumberL(*number);
       
   960 	RestoreNumberL(*number0);
       
   961 	iSmsTest(CompareNumbers(*number, *number0));
       
   962 
       
   963 // Test CSmsNumber::CopyL()
       
   964 
       
   965 	number->SetNameL(_L("DavidCuando"));	
       
   966 	number->SetAddressL(_L("+447747065627")); 
       
   967 	number->SetLogId(118888);	
       
   968 	number->SetAckStatus(ESmsAckTypeDelivery, CSmsNumber::EPendingAck);
       
   969 
       
   970 	iSmsTest(number->Name()==_L("DavidCuando")); 
       
   971 	iSmsTest(number->Address()==_L("+447747065627")); 
       
   972 	iSmsTest(number->LogId() == 118888);
       
   973 	iSmsTest(number->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
       
   974 
       
   975 	number0->CopyL(*number);
       
   976 	iSmsTest(CompareNumbers(*number0, *number));
       
   977 
       
   978 	CleanupStack::PopAndDestroy(2, number0);
       
   979 
       
   980 // Test NewL(CSmsNumber&)
       
   981 
       
   982 	number=CSmsNumber::NewL();  // create the instance
       
   983 	CleanupStack::PushL(number);
       
   984 
       
   985 	number->SetNameL(_L("DavidCuando"));	
       
   986 	number->SetAddressL(_L("+447747065627")); 
       
   987 	number->SetLogId(118888);	
       
   988 	number->SetAckStatus(ESmsAckTypeDelivery, CSmsNumber::EPendingAck);
       
   989 
       
   990 	iSmsTest(number->Name()==_L("DavidCuando")); 
       
   991 	iSmsTest(number->Address()==_L("+447747065627")); 
       
   992 	iSmsTest(number->LogId() == 118888);
       
   993 	iSmsTest(number->AckStatus(ESmsAckTypeDelivery) == CSmsNumber::EPendingAck);
       
   994 
       
   995 	number0=CSmsNumber::NewL(*number);  
       
   996 	CleanupStack::PushL(number0);
       
   997 
       
   998 	iSmsTest(CompareNumbers(*number0, *number));
       
   999 	CleanupStack::PopAndDestroy(2, number);
       
  1000 
       
  1001 	//Test for defect EDNMOHN-4LDDK8
       
  1002 	number=CSmsNumber::NewL();  // create the instance
       
  1003 	CleanupStack::PushL(number);
       
  1004 
       
  1005 	StoreNumberL(*number);
       
  1006 	RestoreNumberL(*number);
       
  1007 
       
  1008 	number->SetAddressL(_L("+4477676545"));
       
  1009 	//End Test for defect  EDNMOHN-4LDDK8
       
  1010 
       
  1011 	CleanupStack::PopAndDestroy(number);
       
  1012 
       
  1013 	Session().CleanupEntryPop();
       
  1014 	Session().RemoveEntry(id);
       
  1015 	}
       
  1016 	
       
  1017 void CSmutTest::StoreEmailFieldsL(const CSmsEmailFields& aEmailFields)
       
  1018 	{
       
  1019 	CMsvStore* store = iSmsTest.EditStoreL(); 
       
  1020 	CleanupStack::PushL(store);
       
  1021 
       
  1022 	aEmailFields.StoreL(*store);
       
  1023 	store->CommitL();
       
  1024 
       
  1025 	CleanupStack::PopAndDestroy(store);
       
  1026 	}
       
  1027 
       
  1028 void CSmutTest::RestoreEmailFieldsL(CSmsEmailFields& aEmailFields)
       
  1029 	{
       
  1030 	CMsvStore* store = iSmsTest.ReadStoreL(); // prepare the store for reading
       
  1031 	CleanupStack::PushL(store);
       
  1032 	
       
  1033 	aEmailFields.RestoreL(*store);
       
  1034 
       
  1035 	CleanupStack::PopAndDestroy(store);
       
  1036 	}
       
  1037 	
       
  1038 TBool CSmutTest::CompareEmailFields(const CSmsEmailFields& aFields1, const CSmsEmailFields& aFields2)
       
  1039 	{
       
  1040 	TBool same = CompareEmailFieldsAddresses(aFields1.Addresses(), aFields2.Addresses());
       
  1041 	if( same )
       
  1042 		same = (aFields2.Subject().Compare(aFields1.Subject()) == 0);
       
  1043 	if( same )
       
  1044 		same = (!aFields2.HasAddress()&&!aFields1.HasAddress() || aFields2.HasAddress()&&aFields1.HasAddress());
       
  1045 	if( same )
       
  1046 		same = (aFields2.Length() == aFields1.Length());
       
  1047 	return same;
       
  1048 	}
       
  1049 	
       
  1050 TBool CSmutTest::CompareEmailFieldsAddresses(const MDesCArray& aAddresses1, const MDesCArray& aAddresses2)
       
  1051 	{
       
  1052 	TBool same = (aAddresses1.MdcaCount() == aAddresses2.MdcaCount());
       
  1053 	if( same )
       
  1054 		{
       
  1055 		TInt count = aAddresses1.MdcaCount();
       
  1056 		while( same && count-- > 0)
       
  1057 			{
       
  1058 			same = (aAddresses2.MdcaPoint(count).Compare(aAddresses1.MdcaPoint(count)) == 0);
       
  1059 			}
       
  1060 		}		
       
  1061 	return same;
       
  1062 	}
       
  1063 	
       
  1064 void CSmutTest::TestEmailFieldsL()
       
  1065 	{
       
  1066 	iSmsTest.Test().Next(_L("Testing CSmsEmailFields"));
       
  1067 	iSmsTest.Printf(_L("Preparing test CSmsEmailFields"));
       
  1068 
       
  1069 	TMsvId id=iSmsTest.CreateDummyMessageToSendL();
       
  1070 	Session().CleanupEntryPushL(id);
       
  1071 	iSmsTest.SetEntryL(id);
       
  1072 
       
  1073 	_LIT(KTestAddress, "support@symbian.com");
       
  1074 	_LIT(KTestSubject, "Happy Days!");
       
  1075 	
       
  1076 	// Test CSmsEmailFields::NewL()
       
  1077 	CSmsEmailFields* fields1 = CSmsEmailFields::NewL();
       
  1078 	CleanupStack::PushL(fields1);
       
  1079 	
       
  1080 	iSmsTest(fields1->Addresses().MdcaCount()==0);
       
  1081 	iSmsTest(fields1->Subject().Compare(KNullDesC()) == 0);
       
  1082 	iSmsTest(!fields1->HasAddress());
       
  1083 	iSmsTest(fields1->Length() == 0);
       
  1084 	
       
  1085 	// Test address and subject accessors, has-address, length and reset methods
       
  1086 	fields1->AddAddressL(KNullDesC);	// empty address - does nothing!
       
  1087 	iSmsTest(fields1->Addresses().MdcaCount()==0);
       
  1088 	iSmsTest(fields1->Subject().Compare(KNullDesC()) == 0);
       
  1089 	iSmsTest(!fields1->HasAddress());
       
  1090 	iSmsTest(fields1->Length() == 0);
       
  1091 	
       
  1092 	fields1->AddAddressL(KTestAddress);
       
  1093 	iSmsTest(fields1->Addresses().MdcaCount()==1);	
       
  1094 	iSmsTest(fields1->Addresses().MdcaPoint(0).Compare(KTestAddress) == 0);
       
  1095 	iSmsTest(fields1->HasAddress());
       
  1096 	iSmsTest(fields1->Length() == KTestAddress().Length() + 1);	
       
  1097 
       
  1098 	fields1->SetSubjectL(KTestSubject);
       
  1099 	iSmsTest(fields1->HasAddress());
       
  1100 	iSmsTest(fields1->Length() == KTestAddress().Length() + KTestSubject().Length() + 2);
       
  1101 	
       
  1102 	fields1->Reset();
       
  1103 	iSmsTest(fields1->Addresses().MdcaCount()==0);
       
  1104 	iSmsTest(fields1->Subject().Compare(KNullDesC()) == 0);
       
  1105 	iSmsTest(!fields1->HasAddress());
       
  1106 	iSmsTest(fields1->Length() == 0);
       
  1107 	
       
  1108 	fields1->SetSubjectL(KTestSubject);
       
  1109 	iSmsTest(fields1->Subject().Compare(KTestSubject) == 0);
       
  1110 	iSmsTest(!fields1->HasAddress());
       
  1111 	iSmsTest(fields1->Length() == KTestSubject().Length() + 2);
       
  1112 	
       
  1113 	fields1->AddAddressL(KTestAddress);
       
  1114 	iSmsTest(fields1->Addresses().MdcaCount()==1);	
       
  1115 	iSmsTest(fields1->Addresses().MdcaPoint(0).Compare(KTestAddress) == 0);
       
  1116 	iSmsTest(fields1->HasAddress());
       
  1117 	iSmsTest(fields1->Length() == KTestAddress().Length() + KTestSubject().Length() + 2);
       
  1118 
       
  1119 	// Test multiple addresses - add empty address -> not added	
       
  1120 	fields1->AddAddressL(KNullDesC);
       
  1121 	iSmsTest(fields1->Addresses().MdcaCount()==1);
       
  1122 	
       
  1123 	_LIT(KTestAddress2, "support2@symbian.com");
       
  1124 	fields1->AddAddressL(KTestAddress2);
       
  1125 	iSmsTest(fields1->Addresses().MdcaCount()==2);	
       
  1126 	iSmsTest(fields1->Addresses().MdcaPoint(1).Compare(KTestAddress2) == 0);
       
  1127 	iSmsTest(fields1->HasAddress());
       
  1128 	// NOTE - length check; 3 -> 2 for subject delimiters, 1 for address comma separtor.
       
  1129 	iSmsTest(fields1->Length() == KTestAddress().Length() + KTestAddress2().Length() + KTestSubject().Length() + 3);
       
  1130 	
       
  1131 	// Test copy factory c'tor
       
  1132 	CSmsEmailFields* fields2 = CSmsEmailFields::NewL(*fields1);
       
  1133 	CleanupStack::PushL(fields2);
       
  1134 
       
  1135 	iSmsTest(CompareEmailFields(*fields2, *fields1));
       
  1136 	
       
  1137 	// Test store and restore
       
  1138 	StoreEmailFieldsL(*fields1);
       
  1139 	fields2->Reset();
       
  1140 	RestoreEmailFieldsL(*fields2);
       
  1141 
       
  1142 	iSmsTest(CompareEmailFields(*fields2, *fields1));
       
  1143 	
       
  1144 	fields1->Reset();
       
  1145 	StoreEmailFieldsL(*fields1);
       
  1146 	RestoreEmailFieldsL(*fields2);
       
  1147 
       
  1148 	iSmsTest(CompareEmailFields(*fields2, *fields1));
       
  1149 	
       
  1150 	CleanupStack::PopAndDestroy(2, fields1);
       
  1151 	
       
  1152 	// Test parsing - expected data.
       
  1153 	_LIT(KTestBodyData, "Some body text#( )#");
       
  1154 
       
  1155 	_LIT(KTestParseAddress1, "user1@symbian.com");
       
  1156 	_LIT(KTestParseSubject1, "");
       
  1157 	_LIT(KTestEmail1, "user1@symbian.com Some body text#( )#");
       
  1158 	TestEmailFieldsParsePassL(KTestEmail1, KTestParseAddress1, KTestParseSubject1, KTestBodyData);
       
  1159 
       
  1160 	_LIT(KTestParseFullAddress1, "Some User <user1@symbian.com>");
       
  1161 	_LIT(KTestEmail2, "Some User <user1@symbian.com> Some body text#( )#");
       
  1162 	TestEmailFieldsParsePassL(KTestEmail2, KTestParseFullAddress1, KTestParseSubject1, KTestBodyData);
       
  1163 
       
  1164 	_LIT(KTestParseAddress2, "user2@symbian.com");
       
  1165 	_LIT(KTestParseSubject2, "subject (2)");
       
  1166 	_LIT(KTestEmail3, "user2@symbian.com##subject (2)#Some body text#( )#");
       
  1167 	TestEmailFieldsParsePassL(KTestEmail3, KTestParseAddress2, KTestParseSubject2, KTestBodyData);
       
  1168 
       
  1169 	_LIT(KTestParseFullAddress2, "Some User <user2@symbian.com>");
       
  1170 	_LIT(KTestEmail4, "Some User <user2@symbian.com>##subject (2)#Some body text#( )#");
       
  1171 	TestEmailFieldsParsePassL(KTestEmail4, KTestParseFullAddress2, KTestParseSubject2, KTestBodyData);
       
  1172 
       
  1173 	_LIT(KTestParseAddress3, "user3@symbian.com");
       
  1174 	_LIT(KTestParseSubject3, "subject #3");
       
  1175 	_LIT(KTestEmail5, "user3@symbian.com(subject #3)Some body text#( )#");
       
  1176 	TestEmailFieldsParsePassL(KTestEmail5, KTestParseAddress3, KTestParseSubject3, KTestBodyData);
       
  1177 
       
  1178 	_LIT(KTestParseFullAddress3, "Some User <user3@symbian.com>");
       
  1179 	_LIT(KTestEmail6, "Some User <user3@symbian.com>(subject #3)Some body text#( )#");
       
  1180 	TestEmailFieldsParsePassL(KTestEmail6, KTestParseFullAddress3, KTestParseSubject3, KTestBodyData);
       
  1181 	
       
  1182 	_LIT(KTestParseAddress4, "user4@symbian.com");
       
  1183 	_LIT(KTestParseSubject4, "");
       
  1184 	_LIT(KTestEmail7, "user4@symbian.com()Some body text#( )#");
       
  1185 	TestEmailFieldsParsePassL(KTestEmail7, KTestParseAddress4, KTestParseSubject4, KTestBodyData);
       
  1186 
       
  1187 	_LIT(KTestParseFullAddress4, "Some User <user4@symbian.com>");
       
  1188 	_LIT(KTestEmail8, "Some User <user4@symbian.com>()Some body text#( )#");
       
  1189 	TestEmailFieldsParsePassL(KTestEmail8, KTestParseFullAddress4, KTestParseSubject4, KTestBodyData);
       
  1190 
       
  1191 	_LIT(KTestParseAddress5, "user5@symbian.com");
       
  1192 	_LIT(KTestParseSubject5, "");
       
  1193 	_LIT(KTestEmail9, "user5@symbian.com###Some body text#( )#");
       
  1194 	TestEmailFieldsParsePassL(KTestEmail9, KTestParseAddress5, KTestParseSubject5, KTestBodyData);
       
  1195 
       
  1196 	_LIT(KTestParseFullAddress5, "Some User <user5@symbian.com>");
       
  1197 	_LIT(KTestEmail10, "Some User <user5@symbian.com>###Some body text#( )#");
       
  1198 	TestEmailFieldsParsePassL(KTestEmail10, KTestParseFullAddress5, KTestParseSubject5, KTestBodyData);
       
  1199 
       
  1200 	// Test parsing - corrupt but parse-able data.
       
  1201 	_LIT(KTestCorruptAddress1,	"user1@symbian.com");
       
  1202 	_LIT(KTestCorruptSubject1,	"smiley ;");
       
  1203 	_LIT(KTestCorruptBody1,		" subject)Some body text");
       
  1204 	_LIT(KTestCorruptEmail1,	"user1@symbian.com(smiley ;) subject)Some body text");
       
  1205 	TestEmailFieldsParsePassL(KTestCorruptEmail1, KTestCorruptAddress1, KTestCorruptSubject1, KTestCorruptBody1);
       
  1206 	
       
  1207 	_LIT(KTestCorruptAddress2,	"user1@symbian.com");
       
  1208 	_LIT(KTestCorruptSubject2,	"");
       
  1209 	_LIT(KTestCorruptBody2,		"(bad subject)Some body text");
       
  1210 	_LIT(KTestCorruptEmail2,	"user1@symbian.com (bad subject)Some body text");
       
  1211 	TestEmailFieldsParsePassL(KTestCorruptEmail2, KTestCorruptAddress2, KTestCorruptSubject2, KTestCorruptBody2);
       
  1212 
       
  1213 	_LIT(KTestCorruptAddress3,	"user1@symbian.com");
       
  1214 	_LIT(KTestCorruptSubject3,	"");
       
  1215 	_LIT(KTestCorruptBody3,		"bad subject##Some body text");
       
  1216 	_LIT(KTestCorruptEmail3,	"user1@symbian.com###bad subject##Some body text");
       
  1217 	TestEmailFieldsParsePassL(KTestCorruptEmail3, KTestCorruptAddress3, KTestCorruptSubject3, KTestCorruptBody3);
       
  1218 	
       
  1219 	// Test parsing - corrupt and fail.
       
  1220 	_LIT(KTestFailEmail1,	"user#domain1.domain2 Some body text");
       
  1221 	TestEmailFieldsParseFailL(KTestFailEmail1);
       
  1222 	
       
  1223 	_LIT(KTestFailEmail2,	"user@domain1.domain2+Some+body+text");
       
  1224 	TestEmailFieldsParseFailL(KTestFailEmail2);
       
  1225 
       
  1226 	_LIT(KTestFailEmail3,	"user@domain1.domain2##(subject)Some+body+text");
       
  1227 	TestEmailFieldsParseFailL(KTestFailEmail3);
       
  1228 
       
  1229 	_LIT(KTestFailEmail4,	"user@domain1.domain2(##subject#Some+body+text");
       
  1230 	TestEmailFieldsParseFailL(KTestFailEmail4);
       
  1231 
       
  1232 	_LIT(KTestFailEmail5,	"user1@symbian.com#bad subject#Some body text");
       
  1233 	TestEmailFieldsParseFailL(KTestFailEmail5);
       
  1234 	
       
  1235 	// Test composing - ok
       
  1236 	_LIT(KTestComposeAddress1,	"user1@domain1.domain2");
       
  1237 	_LIT(KTestComposeSubject1,	"");
       
  1238 	_LIT(KTestComposeFields1,	"user1@domain1.domain2 ");
       
  1239 	TestEmailFieldsComposeL(KTestComposeFields1, KTestComposeAddress1, KNullDesC, KTestComposeSubject1);
       
  1240 	
       
  1241 	_LIT(KTestComposeAddress2,	"user2@domain1.domain2");
       
  1242 	_LIT(KTestComposeSubject2,	"a subject");
       
  1243 	_LIT(KTestComposeFields2,	"user2@domain1.domain2(a subject)");
       
  1244 	TestEmailFieldsComposeL(KTestComposeFields2, KTestComposeAddress2, KNullDesC, KTestComposeSubject2);
       
  1245 
       
  1246 	_LIT(KTestComposeFields3,	"user1@domain1.domain2,user2@domain1.domain2 ");
       
  1247 	TestEmailFieldsComposeL(KTestComposeFields3, KTestComposeAddress1, KTestComposeAddress2, KTestComposeSubject1);
       
  1248 	
       
  1249 	_LIT(KTestComposeFields4,	"user2@domain1.domain2,user1@domain1.domain2(a subject)");
       
  1250 	TestEmailFieldsComposeL(KTestComposeFields4, KTestComposeAddress2, KTestComposeAddress1, KTestComposeSubject2);
       
  1251 
       
  1252 	// Testing composing - fail, no address.
       
  1253 	CSmsEmailFields* fields3 = CSmsEmailFields::NewL();
       
  1254 	CleanupStack::PushL(fields3);
       
  1255 	
       
  1256 	fields3->AddAddressL(KNullDesC);
       
  1257 	fields3->SetSubjectL(KTestSubject);
       
  1258 
       
  1259 	fields3->ComposeLC();
       
  1260 	
       
  1261 	iSmsTest(err==KErrCorrupt);
       
  1262 	
       
  1263 	CleanupStack::PopAndDestroy(fields3);
       
  1264 
       
  1265 	Session().CleanupEntryPop();
       
  1266 	Session().RemoveEntry(id);
       
  1267 	}
       
  1268 	
       
  1269 void CSmutTest::TestEmailFieldsParsePassL(const TDesC& aMessage, const TDesC& aAddress, const TDesC& aSubject, const TDesC& aBody)
       
  1270 	{
       
  1271 	CSmsEmailFields* fields = CSmsEmailFields::NewL();
       
  1272 	CleanupStack::PushL(fields);
       
  1273 	
       
  1274 	TInt pos = fields->ParseL(aMessage);
       
  1275 	
       
  1276 	TPtrC body(aMessage.Mid(pos));
       
  1277 	iSmsTest(fields->HasAddress());
       
  1278 	iSmsTest(fields->Addresses().MdcaCount()==1);
       
  1279 	iSmsTest(fields->Addresses().MdcaPoint(0).Compare(aAddress) == 0);
       
  1280 	iSmsTest(fields->Subject().Compare(aSubject) == 0);
       
  1281 	iSmsTest(body.Compare(aBody) == 0);
       
  1282 	
       
  1283 	CleanupStack::PopAndDestroy(fields);
       
  1284 	}
       
  1285 
       
  1286 void CSmutTest::TestEmailFieldsParseFailL(const TDesC& aMessage)
       
  1287 	{
       
  1288 	CSmsEmailFields* fields = CSmsEmailFields::NewL();
       
  1289 	CleanupStack::PushL(fields);
       
  1290 	
       
  1291 	TInt pos = fields->ParseL(aMessage);
       
  1292 	
       
  1293 	iSmsTest(pos == KErrCorrupt);
       
  1294 	
       
  1295 	CleanupStack::PopAndDestroy(fields);	
       
  1296 	}
       
  1297 
       
  1298 void CSmutTest::TestEmailFieldsComposeL(const TDesC& aFields, const TDesC& aAddress1, const TDesC& aAddress2, const TDesC& aSubject)
       
  1299 	{
       
  1300 	CSmsEmailFields* fields = CSmsEmailFields::NewL();
       
  1301 	CleanupStack::PushL(fields);
       
  1302 	
       
  1303 	fields->AddAddressL(aAddress1);
       
  1304 	fields->AddAddressL(aAddress2);
       
  1305 	fields->SetSubjectL(aSubject);
       
  1306 	HBufC* buffer = fields->ComposeLC();	
       
  1307 
       
  1308 	iSmsTest(aFields.Compare(*buffer) == 0);
       
  1309 	
       
  1310 	CleanupStack::PopAndDestroy(2, fields);	// fields, buffer
       
  1311 	}
       
  1312 
       
  1313 void CSmutTest::TestHeaderL()
       
  1314 	{
       
  1315 
       
  1316 // Testing class CSmsHeader
       
  1317 	iSmsTest.Test().Next(_L("Testing CSmsHeader"));
       
  1318 	
       
  1319 // A CSmsHeader can be of 6 different types
       
  1320 // First we test constructing ESmsDeliver
       
  1321 	delete iSmsHeader; // deleting the previous one
       
  1322 	iSmsHeader = NULL;
       
  1323 	iSmsHeader=CSmsHeader::NewL(CSmsPDU::ESmsDeliver,*iRichText); // constructing
       
  1324 	iSmsTest(iSmsHeader->Type()==CSmsPDU::ESmsDeliver);	// type ok?
       
  1325 
       
  1326 	CSmsDeliver& deliver = iSmsHeader->Deliver();  // lets get the CSmsPDU of the CSmsHeader
       
  1327 	const CSmsDeliver& deliver2 = iSmsHeader->Deliver();
       
  1328 
       
  1329 	iSmsTest(deliver.Type() == CSmsPDU::ESmsDeliver); // Are the types ok?
       
  1330 	iSmsTest(deliver2.Type() == CSmsPDU::ESmsDeliver);
       
  1331 
       
  1332 // Type ESmsCommand
       
  1333 	delete iSmsHeader; // deleting previous
       
  1334 	iSmsHeader = NULL;
       
  1335 	iSmsHeader=CSmsHeader::NewL(CSmsPDU::ESmsCommand,*iRichText);
       
  1336 	iSmsTest(iSmsHeader->Type()==CSmsPDU::ESmsCommand);
       
  1337 
       
  1338 	CSmsCommand& command=iSmsHeader->Command();
       
  1339 	const CSmsCommand& command2=iSmsHeader->Command();
       
  1340 
       
  1341 	iSmsTest(command.Type() == CSmsPDU::ESmsCommand);
       
  1342 	iSmsTest(command2.Type() == CSmsPDU::ESmsCommand);
       
  1343 
       
  1344 // Type ESmsStatusReport
       
  1345 	delete iSmsHeader; // deleting the previous one
       
  1346 	iSmsHeader = NULL;
       
  1347 	iSmsHeader=CSmsHeader::NewL(CSmsPDU::ESmsStatusReport,*iRichText);
       
  1348 	iSmsTest(iSmsHeader->Type()==CSmsPDU::ESmsStatusReport);
       
  1349 
       
  1350 	CSmsStatusReport& statusreport=iSmsHeader->StatusReport();
       
  1351 	const CSmsStatusReport& statusreport2=iSmsHeader->StatusReport();
       
  1352 
       
  1353 	iSmsTest(statusreport.Type() == CSmsPDU::ESmsStatusReport);
       
  1354 	iSmsTest(statusreport2.Type() == CSmsPDU::ESmsStatusReport);
       
  1355 
       
  1356 // Type ESmsSubmit
       
  1357 	delete iSmsHeader; // deleting the previous one
       
  1358 	iSmsHeader = NULL;
       
  1359 	iSmsHeader=CSmsHeader::NewL(CSmsPDU::ESmsSubmit,*iRichText);
       
  1360 	iSmsTest(iSmsHeader->Type()==CSmsPDU::ESmsSubmit);
       
  1361 
       
  1362 	CSmsSubmit& submit=iSmsHeader->Submit();
       
  1363 	const CSmsSubmit& submit2=iSmsHeader->Submit();
       
  1364 
       
  1365 	iSmsTest(submit.Type() == CSmsPDU::ESmsSubmit);
       
  1366 	iSmsTest(submit2.Type() == CSmsPDU::ESmsSubmit);
       
  1367 
       
  1368 // Lets access the CSmsMessage of our header
       
  1369 	CSmsMessage& message=iSmsHeader->Message();
       
  1370 	const CSmsMessage& message2=iSmsHeader->Message();
       
  1371 
       
  1372 	iSmsTest(message.Type() == CSmsPDU::ESmsSubmit);
       
  1373 	iSmsTest(message2.Type() == CSmsPDU::ESmsSubmit);
       
  1374 
       
  1375 // Lets test the features of CSmsHeader with different values
       
  1376 	iSmsHeader->SetReplyPathProvided(ETrue);
       
  1377 	iSmsTest(iSmsHeader->ReplyPathProvided());
       
  1378 	iSmsHeader->SetReplyPathProvided(EFalse);
       
  1379 	iSmsTest(!iSmsHeader->ReplyPathProvided());
       
  1380 
       
  1381 	iSmsHeader->SetBioMsgIdType(EBioMsgIdUnknown);
       
  1382 	iSmsTest(iSmsHeader->BioMsgIdType()==EBioMsgIdUnknown);
       
  1383 	iSmsHeader->SetBioMsgIdType(EBioMsgIdIana);
       
  1384 	iSmsTest(iSmsHeader->BioMsgIdType()==EBioMsgIdIana);
       
  1385 	iSmsHeader->SetBioMsgIdType(EBioMsgIdNbs);
       
  1386 	iSmsTest(iSmsHeader->BioMsgIdType()==EBioMsgIdNbs);
       
  1387 	iSmsHeader->SetBioMsgIdType(EBioMsgIdWap);
       
  1388 	iSmsTest(iSmsHeader->BioMsgIdType()==EBioMsgIdWap);
       
  1389 	iSmsHeader->SetBioMsgIdType(EBioMsgIdWapSecure);
       
  1390 	iSmsTest(iSmsHeader->BioMsgIdType()==EBioMsgIdWapSecure);
       
  1391 
       
  1392 // Lets set the service center number
       
  1393 	iSmsHeader->SetServiceCenterAddressL(_L("+350508771010"));
       
  1394 	iSmsTest(iSmsHeader->ServiceCenterAddress()==_L("+350508771010"));
       
  1395 
       
  1396 // Lets set one recipient for the message
       
  1397 	CArrayPtrFlat<CSmsNumber>& recipients = iSmsHeader->Recipients();
       
  1398 	CSmsNumber* number=CSmsNumber::NewL();
       
  1399 	CleanupStack::PushL(number);
       
  1400 	number->SetAddressL(_L("+358503367709"));
       
  1401 	recipients.AppendL(number);
       
  1402 	CleanupStack::Pop();
       
  1403 
       
  1404 // Setting settings of the message
       
  1405 	CSmsSettings* smsset = CSmsSettings::NewL();
       
  1406 	CleanupStack::PushL(smsset);
       
  1407 	smsset->AddServiceCenterL(_L("Hippo"), _L("+358508771010"));
       
  1408 	smsset->SetCharacterSet(TSmsDataCodingScheme::ESmsAlphabet7Bit);
       
  1409 	smsset->SetDelivery(ESmsDeliveryImmediately);
       
  1410 	smsset->SetDeliveryReport(EFalse);
       
  1411 	smsset->SetMessageConversion(ESmsConvPIDNone);
       
  1412 	smsset->SetRejectDuplicate(ETrue);
       
  1413 	smsset->SetReplyPath(EFalse);
       
  1414 	smsset->SetValidityPeriod(ESmsVP24Hours);
       
  1415 	smsset->SetValidityPeriodFormat(TSmsFirstOctet::ESmsVPFSemiOctet);
       
  1416 // And copying them to the CSmsHeader
       
  1417 	iSmsHeader->SetSmsSettingsL(*smsset);
       
  1418 	CleanupStack::PopAndDestroy(smsset);
       
  1419 
       
  1420 	CSmsSettings* smsset2 = CSmsSettings::NewL();
       
  1421 	CleanupStack::PushL(smsset2);
       
  1422 // Lets get the same setting from the CSmsHeader
       
  1423 	iSmsHeader->GetSmsSettingsL(*smsset2);
       
  1424 // And compare that they are ok!
       
  1425 	iSmsTest(smsset2->CharacterSet()==TSmsDataCodingScheme::ESmsAlphabet7Bit);
       
  1426 	iSmsTest(!smsset2->DeliveryReport());
       
  1427 	iSmsTest(smsset2->MessageConversion()==ESmsConvPIDNone);
       
  1428 	iSmsTest(smsset2->RejectDuplicate());
       
  1429 	iSmsTest(!smsset2->ReplyPath());
       
  1430 	iSmsTest(smsset2->ValidityPeriod().Int()==ESmsVP24Hours);
       
  1431 	iSmsTest(smsset2->ValidityPeriodFormat()==TSmsFirstOctet::ESmsVPFSemiOctet);
       
  1432 	CleanupStack::PopAndDestroy(smsset2);
       
  1433 
       
  1434 //Test Set/FromAddress()
       
  1435 	iSmsHeader->SetFromAddressL(_L("+358503367709"));
       
  1436 	iSmsTest(iSmsHeader->FromAddress()==_L("+358503367709"));
       
  1437 	
       
  1438 //Test Set/EmailFields()
       
  1439 	_LIT(KTestAddress, "user@domain1.domain2");
       
  1440 	_LIT(KTestSubject, "a subject");
       
  1441 
       
  1442 	CSmsEmailFields* fields1 = CSmsEmailFields::NewL();
       
  1443 	CleanupStack::PushL(fields1);
       
  1444 	
       
  1445 	fields1->AddAddressL(KTestAddress);
       
  1446 	fields1->SetSubjectL(KTestSubject);
       
  1447 
       
  1448 	// Test the PID field value - should be ESmsConvPIDNone...
       
  1449 	CSmsSettings* smsset3 = CSmsSettings::NewL();
       
  1450 	CleanupStack::PushL(smsset3);
       
  1451 
       
  1452 	iSmsHeader->GetSmsSettingsL(*smsset3);
       
  1453 	iSmsTest(smsset3->MessageConversion()==ESmsConvPIDNone);
       
  1454 
       
  1455 	// Set the email fields - check the email fields and the PID value (should 
       
  1456 	// be ESmsConvMail).
       
  1457 	iSmsHeader->SetEmailFieldsL(*fields1);
       
  1458 	const CSmsEmailFields& fields2 = iSmsHeader->EmailFields();
       
  1459 	iSmsHeader->GetSmsSettingsL(*smsset3);
       
  1460 	
       
  1461 	iSmsTest(CompareEmailFields(*fields1, fields2));
       
  1462 	iSmsTest(smsset3->MessageConversion()==ESmsConvMail);
       
  1463 	
       
  1464 	// Reset the fields and then set back in the header - should reset the PID
       
  1465 	// value to ESmsConvPIDNone
       
  1466 	fields1->Reset();
       
  1467 	iSmsHeader->SetEmailFieldsL(*fields1);
       
  1468 	
       
  1469 	const CSmsEmailFields& fields3 = iSmsHeader->EmailFields();
       
  1470 	iSmsHeader->GetSmsSettingsL(*smsset3);
       
  1471 	
       
  1472 	iSmsTest(CompareEmailFields(*fields1, fields3));
       
  1473 	iSmsTest(smsset3->MessageConversion()==ESmsConvPIDNone);
       
  1474 	
       
  1475 	// Set the reply email fields - check email fields (both address and subject)
       
  1476 	// and the PID value (should be ESmsConvMail)
       
  1477 	_LIT(KEmailReplySubjectFormat,	"Re: %S");
       
  1478 	_LIT(KEmailReplySubject,		"Re: a subject");
       
  1479 
       
  1480 	// First test with no subject...
       
  1481 	fields1->AddAddressL(KTestAddress);
       
  1482 	
       
  1483 	iSmsHeader->SetReplyEmailFieldsL(*fields1, KEmailReplySubjectFormat);
       
  1484 	const CSmsEmailFields& replyFields1 = iSmsHeader->EmailFields();
       
  1485 	iSmsHeader->GetSmsSettingsL(*smsset3);
       
  1486 	
       
  1487 	iSmsTest(CompareEmailFieldsAddresses(replyFields1.Addresses(), fields1->Addresses()));
       
  1488 	iSmsTest(replyFields1.Subject().Compare(KNullDesC) == 0);
       
  1489 	iSmsTest(smsset3->MessageConversion()==ESmsConvMail);
       
  1490 	
       
  1491 	// Now set the subject...
       
  1492 	fields1->SetSubjectL(KTestSubject);
       
  1493 
       
  1494 	iSmsHeader->SetReplyEmailFieldsL(*fields1, KEmailReplySubjectFormat);
       
  1495 	const CSmsEmailFields& replyFields2 = iSmsHeader->EmailFields();
       
  1496 	iSmsHeader->GetSmsSettingsL(*smsset3);
       
  1497 	
       
  1498 	iSmsTest(CompareEmailFieldsAddresses(replyFields2.Addresses(), fields1->Addresses()));
       
  1499 	iSmsTest(replyFields2.Subject().Compare(KEmailReplySubject()) == 0);
       
  1500 	iSmsTest(smsset3->MessageConversion()==ESmsConvMail);
       
  1501 	
       
  1502 	// Repeat - test for (lack of) Re: chain.
       
  1503 	fields1->SetSubjectL(KEmailReplySubject);
       
  1504 	
       
  1505 	iSmsHeader->SetReplyEmailFieldsL(*fields1, KEmailReplySubjectFormat);
       
  1506 	const CSmsEmailFields& replyFields3 = iSmsHeader->EmailFields();
       
  1507 	iSmsHeader->GetSmsSettingsL(*smsset3);
       
  1508 	
       
  1509 	iSmsTest(CompareEmailFieldsAddresses(replyFields3.Addresses(), fields1->Addresses()));
       
  1510 	iSmsTest(replyFields3.Subject().Compare(KEmailReplySubject()) == 0);
       
  1511 	iSmsTest(smsset3->MessageConversion()==ESmsConvMail);
       
  1512 	
       
  1513 	// Set the forward email fields - check email fields (both address and subject)
       
  1514 	// and the PID value (should be ESmsConvMail)
       
  1515 	_LIT(KEmailForwardSubjectFormat,	"Fw: %S");
       
  1516 	_LIT(KEmailForwardSubject,			"Fw: a subject");
       
  1517 	
       
  1518 	// First test with no subject...
       
  1519 	fields1->Reset();
       
  1520 	fields1->AddAddressL(KTestAddress);
       
  1521 
       
  1522 	iSmsHeader->SetForwardEmailFieldsL(*fields1, KEmailForwardSubjectFormat);
       
  1523 	const CSmsEmailFields& forwardFields1 = iSmsHeader->EmailFields();
       
  1524 	iSmsHeader->GetSmsSettingsL(*smsset3);
       
  1525 	
       
  1526 	iSmsTest(!forwardFields1.HasAddress());
       
  1527 	iSmsTest(forwardFields1.Addresses().MdcaCount()==0);
       
  1528 	iSmsTest(forwardFields1.Subject().Compare(KNullDesC) == 0);
       
  1529 	iSmsTest(smsset3->MessageConversion()==ESmsConvMail);
       
  1530 
       
  1531 	// Now set the subject...
       
  1532 	fields1->SetSubjectL(KTestSubject);
       
  1533 
       
  1534 	iSmsHeader->SetForwardEmailFieldsL(*fields1, KEmailForwardSubjectFormat);
       
  1535 	const CSmsEmailFields& forwardFields2 = iSmsHeader->EmailFields();
       
  1536 	iSmsHeader->GetSmsSettingsL(*smsset3);
       
  1537 	
       
  1538 	iSmsTest(!forwardFields2.HasAddress());
       
  1539 	iSmsTest(forwardFields2.Addresses().MdcaCount()==0);
       
  1540 	iSmsTest(forwardFields2.Subject().Compare(KEmailForwardSubject()) == 0);
       
  1541 	iSmsTest(smsset3->MessageConversion()==ESmsConvMail);
       
  1542 	
       
  1543 	// Repeat - test for (lack of) Fw: chain.
       
  1544 	fields1->SetSubjectL(KEmailForwardSubject);
       
  1545 	
       
  1546 	iSmsHeader->SetForwardEmailFieldsL(*fields1, KEmailForwardSubjectFormat);
       
  1547 	const CSmsEmailFields& forwardFields3 = iSmsHeader->EmailFields();
       
  1548 	iSmsHeader->GetSmsSettingsL(*smsset3);
       
  1549 	
       
  1550 	iSmsTest(!forwardFields3.HasAddress());
       
  1551 	iSmsTest(forwardFields3.Addresses().MdcaCount()==0);
       
  1552 	iSmsTest(forwardFields3.Subject().Compare(KEmailForwardSubject()) == 0);
       
  1553 	iSmsTest(smsset3->MessageConversion()==ESmsConvMail);
       
  1554 
       
  1555 	// Reset the fields and set back in the header.
       
  1556 	fields1->Reset();
       
  1557 	iSmsHeader->SetEmailFieldsL(*fields1);
       
  1558 
       
  1559 	CleanupStack::PopAndDestroy(2, fields1);
       
  1560 
       
  1561 //Lets store and restore the CSmsHeader and test that the values are right
       
  1562 	TMsvId id = iSmsTest.CreateDummyMessageToSendL();
       
  1563 	Session().CleanupEntryPushL(id);
       
  1564 	iSmsTest.SetEntryL(id);
       
  1565 	
       
  1566 	StoreHeaderL(*iSmsHeader);
       
  1567 	
       
  1568 	// Check that the email fields stream is not present, as there is no email
       
  1569 	// fields data.
       
  1570 	CMsvStore* store1 = iSmsTest.ReadStoreL();
       
  1571 	CleanupStack::PushL(store1);
       
  1572 	iSmsTest(!store1->IsPresentL(KUidMsvSmsEmailFieldsStream));
       
  1573 	CleanupStack::PopAndDestroy(store1);
       
  1574 
       
  1575 	CSmsHeader* header1 = CSmsHeader::NewL(CSmsPDU::ESmsSubmit,*iRichText);
       
  1576 	CleanupStack::PushL(header1);
       
  1577 
       
  1578 	RestoreHeaderL(*header1);
       
  1579 
       
  1580 //Values ok?
       
  1581 	iSmsTest(iSmsHeader->Type()==header1->Type());
       
  1582 	iSmsTest(!header1->ReplyPathProvided());
       
  1583 	iSmsTest(header1->ServiceCenterAddress()==_L("+350508771010"));
       
  1584 	iSmsTest(iSmsHeader->Recipients().Count()==header1->Recipients().Count());
       
  1585 	iSmsTest(iSmsHeader->BioMsgIdType()==header1->BioMsgIdType());
       
  1586 	iSmsTest(iSmsHeader->FromAddress()==header1->FromAddress());
       
  1587 
       
  1588 // Lets get the setting of the message
       
  1589 	CSmsSettings* smsset4 = CSmsSettings::NewL();
       
  1590 	CleanupStack::PushL(smsset4);
       
  1591 	header1->GetSmsSettingsL(*smsset4);
       
  1592 
       
  1593 // And compare that they are the original values
       
  1594 	iSmsTest(smsset4->CharacterSet()==TSmsDataCodingScheme::ESmsAlphabet7Bit);
       
  1595 	iSmsTest(!smsset4->DeliveryReport());
       
  1596 	iSmsTest(smsset4->MessageConversion()==ESmsConvPIDNone);
       
  1597 	iSmsTest(smsset4->RejectDuplicate());
       
  1598 	iSmsTest(!smsset4->ReplyPath());
       
  1599 	iSmsTest(smsset4->ValidityPeriod().Int()==ESmsVP24Hours);
       
  1600 	iSmsTest(smsset4->ValidityPeriodFormat()==TSmsFirstOctet::ESmsVPFSemiOctet);
       
  1601 	
       
  1602 	CleanupStack::PopAndDestroy(2, header1);
       
  1603 	
       
  1604 	// Test with email fields data.
       
  1605 	CSmsEmailFields* fields8 = CSmsEmailFields::NewL();
       
  1606 	CleanupStack::PushL(fields8);
       
  1607 	fields8->AddAddressL(KTestAddress);
       
  1608 	fields8->SetSubjectL(KTestSubject);
       
  1609 	iSmsHeader->SetEmailFieldsL(*fields8);
       
  1610 	
       
  1611 	StoreHeaderL(*iSmsHeader);
       
  1612 
       
  1613 	// Check that the email fields stream is  present, as there is now email
       
  1614 	// fields data.
       
  1615 	CMsvStore* store2 = iSmsTest.EditStoreL();
       
  1616 	CleanupStack::PushL(store2);
       
  1617 	iSmsTest(store2->IsPresentL(KUidMsvSmsEmailFieldsStream));
       
  1618 	CleanupStack::PopAndDestroy(store2);
       
  1619 
       
  1620 	CSmsHeader* header2 = CSmsHeader::NewL(CSmsPDU::ESmsSubmit,*iRichText);
       
  1621 	CleanupStack::PushL(header2);
       
  1622 
       
  1623 	RestoreHeaderL(*header2);
       
  1624 
       
  1625 	iSmsTest(iSmsHeader->Type()==header2->Type());
       
  1626 	iSmsTest(!header2->ReplyPathProvided());
       
  1627 	iSmsTest(header2->ServiceCenterAddress()==_L("+350508771010"));
       
  1628 	iSmsTest(iSmsHeader->Recipients().Count()==header2->Recipients().Count());
       
  1629 	iSmsTest(iSmsHeader->BioMsgIdType()==header2->BioMsgIdType());
       
  1630 	iSmsTest(iSmsHeader->FromAddress()==header2->FromAddress());
       
  1631 
       
  1632 	CSmsSettings* smsset5 = CSmsSettings::NewL();
       
  1633 	CleanupStack::PushL(smsset5);
       
  1634 	header2->GetSmsSettingsL(*smsset5);
       
  1635 
       
  1636 	iSmsTest(smsset5->CharacterSet()==TSmsDataCodingScheme::ESmsAlphabet7Bit);
       
  1637 	iSmsTest(!smsset5->DeliveryReport());
       
  1638 	iSmsTest(smsset5->MessageConversion()==ESmsConvMail);
       
  1639 	iSmsTest(smsset5->RejectDuplicate());
       
  1640 	iSmsTest(!smsset5->ReplyPath());
       
  1641 	iSmsTest(smsset5->ValidityPeriod().Int()==ESmsVP24Hours);
       
  1642 	iSmsTest(smsset5->ValidityPeriodFormat()==TSmsFirstOctet::ESmsVPFSemiOctet);
       
  1643 	
       
  1644 	const CSmsEmailFields& fields9 = iSmsHeader->EmailFields();
       
  1645 	iSmsTest(CompareEmailFields(*fields8, fields9));
       
  1646 	
       
  1647 	CleanupStack::PopAndDestroy(3, fields8);
       
  1648 	
       
  1649 //Test NewL that takes a CSmsMessage - pretend it's an email message.
       
  1650 	RFs fs;
       
  1651 	User::LeaveIfError(fs.Connect());
       
  1652 	CleanupClosePushL(fs);
       
  1653 	
       
  1654 	// Test un-corrupt email - add an appropriate email message
       
  1655 	_LIT(KTestEmailAddress1, 	"user@domain1.domain2");
       
  1656 	_LIT(KTestEmailSubject1, 	"a subject");
       
  1657 	_LIT(KTestEmailBody1,		"some body text");
       
  1658 	_LIT(KTestEmailMessage1,	"user@domain1.domain2##a subject#some body text");
       
  1659 
       
  1660 	CSmsMessage* email1 = CSmsMessage::NewL(fs, CSmsPDU::ESmsDeliver, CSmsEditorBuffer::NewL(*iRichText), EFalse);
       
  1661 	CleanupStack::PushL(email1);
       
  1662 	
       
  1663 	CSmsBufferBase& buffer1 = email1->Buffer();
       
  1664 	buffer1.Reset();
       
  1665 	buffer1.InsertL(0, KTestEmailMessage1());
       
  1666 	
       
  1667 	// Set the PID for email.
       
  1668 	CSmsPDU& pdu1 = email1->SmsPDU();
       
  1669 	if( pdu1.ProtocolIdentifierPresent() )
       
  1670 		{
       
  1671 		pdu1.SetPIDType(TSmsProtocolIdentifier::ESmsPIDTelematicInterworking);
       
  1672 		pdu1.SetTelematicDeviceIndicator(TSmsProtocolIdentifier::ESmsTelematicDevice);
       
  1673 		pdu1.SetTelematicDeviceType(TSmsProtocolIdentifier::ESmsInternetElectronicMail);
       
  1674 		}
       
  1675 
       
  1676 	// create a new SMS header
       
  1677 	delete iSmsHeader;
       
  1678 	iSmsHeader = NULL;
       
  1679 	iSmsHeader = CSmsHeader::NewL(email1); 
       
  1680 	CleanupStack::Pop(email1);
       
  1681 
       
  1682 	// Check that the header is correct...
       
  1683 	// Email fields...
       
  1684 	const CSmsEmailFields& fields10 = iSmsHeader->EmailFields();
       
  1685 	iSmsTest(fields10.HasAddress());
       
  1686 	iSmsTest(fields10.Addresses().MdcaCount()==1);
       
  1687 	iSmsTest(fields10.Addresses().MdcaPoint(0).Compare(KTestEmailAddress1) == 0);
       
  1688 	iSmsTest(fields10.Subject().Compare(KTestEmailSubject1) == 0);
       
  1689 	
       
  1690 	// Message body...
       
  1691 	CSmsBufferBase& body1 = iSmsHeader->Message().Buffer();
       
  1692 	TInt length1 = body1.Length();
       
  1693 	HBufC* buf1 = HBufC::NewLC(length1);
       
  1694 	TPtr bufPtr1(buf1->Des());
       
  1695 	body1.Extract(bufPtr1, 0, length1);
       
  1696 	
       
  1697 	iSmsTest(bufPtr1.Compare(KTestEmailBody1) == 0);
       
  1698 	
       
  1699 	CleanupStack::PopAndDestroy(buf1);
       
  1700 
       
  1701 	// Test corrupt email.
       
  1702 	_LIT(KTestEmailBody2,		"user@domain1.domain2##a subjectsome body text");
       
  1703 	_LIT(KTestEmailMessage2,	"user@domain1.domain2##a subjectsome body text");
       
  1704 
       
  1705 	CSmsMessage* email2 = CSmsMessage::NewL(fs, CSmsPDU::ESmsDeliver, CSmsEditorBuffer::NewL(*iRichText), EFalse);
       
  1706 	CleanupStack::PushL(email2);
       
  1707 	
       
  1708 	CSmsBufferBase& buffer2 = email2->Buffer();
       
  1709 	buffer2.Reset();
       
  1710 	buffer2.InsertL(0, KTestEmailMessage2());
       
  1711 	
       
  1712 	// Set the PID for email.
       
  1713 	CSmsPDU& pdu2 = email2->SmsPDU();
       
  1714 	if( pdu2.ProtocolIdentifierPresent() )
       
  1715 		{
       
  1716 		pdu2.SetPIDType(TSmsProtocolIdentifier::ESmsPIDTelematicInterworking);
       
  1717 		pdu2.SetTelematicDeviceIndicator(TSmsProtocolIdentifier::ESmsTelematicDevice);
       
  1718 		pdu2.SetTelematicDeviceType(TSmsProtocolIdentifier::ESmsInternetElectronicMail);
       
  1719 		}
       
  1720 
       
  1721 	// create a new SMS header
       
  1722 	delete iSmsHeader;
       
  1723 	iSmsHeader = NULL;
       
  1724 	iSmsHeader = CSmsHeader::NewL(email2); 
       
  1725 	CleanupStack::Pop(email2);
       
  1726 
       
  1727 	// Check that the header is correct...
       
  1728 	// Email fields...
       
  1729 	const CSmsEmailFields& fields11 = iSmsHeader->EmailFields();
       
  1730 	iSmsTest(!fields11.HasAddress());
       
  1731 	iSmsTest(fields11.Addresses().MdcaCount()==0);
       
  1732 	iSmsTest(fields11.Subject().Compare(KNullDesC) == 0);
       
  1733 	iSmsTest(fields11.Length() == 0);
       
  1734 	
       
  1735 	// Message body...
       
  1736 	CSmsBufferBase& body2 = iSmsHeader->Message().Buffer();
       
  1737 	TInt length2 = body2.Length();
       
  1738 	HBufC* buf2 = HBufC::NewLC(length2);
       
  1739 	TPtr bufPtr2(buf2->Des());
       
  1740 	body2.Extract(bufPtr2, 0, length2);
       
  1741 	
       
  1742 	iSmsTest(bufPtr2.Compare(KTestEmailBody2) == 0);
       
  1743 	
       
  1744 	CleanupStack::PopAndDestroy(buf2);
       
  1745 	
       
  1746 	CleanupStack::PopAndDestroy(&fs);
       
  1747 
       
  1748 	Session().CleanupEntryPop();
       
  1749 	Session().RemoveEntry(id);
       
  1750 	}
       
  1751 
       
  1752 _LIT(KGetDescriptionTestMessage, "Finland to win the ice hockey world champs");
       
  1753 
       
  1754 #include <emsuserpromptie.h>
       
  1755 #include <emssoundie.h>
       
  1756 _LIT8(KUserMelody, 	"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
       
  1757 	  "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"); // Melody file
       
  1758 
       
  1759 _LIT(KTestEmsVariousMsg1,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
       
  1760 
       
  1761 void CSmutTest::TestSmsEmsExtensionsL()
       
  1762 // Test the modifications for EMS
       
  1763 	{
       
  1764 	// Set up a standard sms message first
       
  1765 	iRichText->Reset();
       
  1766 	iRichText->InsertL(0, KTestEmsVariousMsg1);
       
  1767 	// Make a Deliver so we can get at the protocol identifier
       
  1768 	CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsDeliver,*iRichText);
       
  1769 	CleanupStack::PushL(header);
       
  1770 
       
  1771 	// Create 2 EMS Melody objects followed by a User Prompt Indicator
       
  1772 
       
  1773 	// Create first Melody EMS object
       
  1774 	CEmsSoundIE* object = CEmsSoundIE::NewL(KUserMelody());
       
  1775 	CleanupStack::PushL(object);	
       
  1776 	// Insert the sound object after the 5th byte of the message
       
  1777 	object->SetStartPosition(5);
       
  1778 	// Add it to the CSmsMessage
       
  1779 	header->Message().AddEMSInformationElementL(*object);
       
  1780 	CleanupStack::PopAndDestroy(object);	
       
  1781 
       
  1782 	// Create a second Melody EMS object 
       
  1783 	CEmsSoundIE* object2 = CEmsSoundIE::NewL(KUserMelody());
       
  1784 	CleanupStack::PushL(object2);	
       
  1785 	// Insert the sound object after the 5th byte of the message
       
  1786 	object2->SetStartPosition(5);
       
  1787 	// Add it to the CSmsMessage
       
  1788 	header->Message().AddEMSInformationElementL(*object2);
       
  1789 	CleanupStack::PopAndDestroy(object2);
       
  1790 
       
  1791 	// Create a user prompt indicator and tell it there are 2 EMS objects
       
  1792 	CEmsUserPrompt* prompt = CEmsUserPrompt::NewL(2);
       
  1793 	CleanupStack::PushL(prompt);	
       
  1794 	// Add it after the 5th byte of the message
       
  1795 	prompt->SetStartPosition(5);
       
  1796 	// Add it to the CSmsMessage
       
  1797 	header->Message().AddEMSInformationElementL(*prompt);
       
  1798 	CleanupStack::PopAndDestroy(prompt);
       
  1799  
       
  1800 	// Test the TMsvSmsEntry derived class
       
  1801 	TMsvSmsEntry entry;
       
  1802 	// Check the Existing sms message for User Prompt indicator
       
  1803 	const RPointerArray<const CEmsInformationElement>&  emsElements= header->Message().GetEMSInformationElementsL();
       
  1804 	// Loop through the array checking for a user prompt indicator element
       
  1805 	TInt i(0);
       
  1806 	for(;i<emsElements.Count();i++)
       
  1807 		{
       
  1808 		if(emsElements[i]->Identifier() == CSmsInformationElement::ESmsEnhancedUserPromptIndicator)
       
  1809 			{
       
  1810 			// Set user prompt indicator bit in iMtmData2
       
  1811 			entry.SetUserPromptIndicator(ETrue);
       
  1812 			break;
       
  1813 			}
       
  1814 		}
       
  1815 	// Check the user prompt indicator is set
       
  1816 	if(!entry.UserPromptIndicator())
       
  1817 		User::Leave(KErrCorrupt);
       
  1818 	// Check we can clear it
       
  1819 	entry.SetUserPromptIndicator(EFalse);
       
  1820 	if(entry.UserPromptIndicator())
       
  1821 		User::Leave(KErrCorrupt);
       
  1822 
       
  1823 	// Convenient reference to PDU
       
  1824 	CSmsDeliver& pdu = STATIC_CAST(CSmsDeliver&,header->Message().SmsPDU());
       
  1825 	// Set up the Protocol Identifier to read back
       
  1826 	pdu.SetPIDType(TSmsProtocolIdentifier::ESmsPIDShortMessageType);
       
  1827 	pdu.SetShortMessageType(TSmsProtocolIdentifier::ESmsReplaceShortMessageType1);
       
  1828 
       
  1829 	// Read from the pdu and set the TMsvSmsEntry copy
       
  1830 	entry.SetProtocolIdentifier(*pdu.ProtocolIdentifier());
       
  1831 	// Read it back and check the value
       
  1832 	if(entry.ProtocolIdentifier() != *pdu.ProtocolIdentifier())
       
  1833 		{
       
  1834 		User::Leave(KErrCorrupt);
       
  1835 		}
       
  1836 
       
  1837 	CleanupStack::PopAndDestroy(); //header
       
  1838 
       
  1839 	}
       
  1840 
       
  1841 void CSmutTest::TestSmsUtilitiesL()
       
  1842 	{
       
  1843 	iSmsTest.Test().Next(_L("Testing TSmsUtilities"));
       
  1844 
       
  1845 	iRichText->Reset();
       
  1846 	iRichText->InsertL(0, KGetDescriptionTestMessage);
       
  1847 	CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit,*iRichText);
       
  1848 	CleanupStack::PushL(header);
       
  1849 
       
  1850 	TestSmsUtilities1L(*header);
       
  1851 	TestSmsUtilities2L(*header);
       
  1852 	TestSmsUtilities3L(*header);
       
  1853 
       
  1854 	CleanupStack::PopAndDestroy(); //header
       
  1855 
       
  1856 	TestSmsUtilitiesTimeStampsL();
       
  1857 	}
       
  1858 
       
  1859 void CSmutTest::TestSmsUtilitiesBL()
       
  1860 	{
       
  1861 	iSmsTest.Test().Next(_L("Testing ECOM Plugin for SMS GetDetDesc interface"));
       
  1862 
       
  1863 	iRichText->Reset();
       
  1864 	iRichText->InsertL(0, KGetDescriptionTestMessage);
       
  1865 	CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit,*iRichText);
       
  1866 	CleanupStack::PushL(header);
       
  1867 
       
  1868 	TestSmsUtilities4L(*header);
       
  1869 	TestSmsUtilities5L(*header);
       
  1870 	TestSmsUtilities3L(*header);
       
  1871 
       
  1872 	CleanupStack::PopAndDestroy(); //header
       
  1873 	}
       
  1874 
       
  1875 void CSmutTest::TestSmsUtilities1L(CSmsHeader& aHeader)
       
  1876 /**
       
  1877  * @test Tests TSmsUtilities::GetDescription()
       
  1878  */
       
  1879 	{
       
  1880 	iSmsTest.Printf(_L("Testing TSmsUtilities::GetDescription() - use varying values to test trucation\n"));
       
  1881 
       
  1882 	RResourceFile resFile;
       
  1883 	iSmsTest.OpenResourceFileL(KSmsResourceFile, resFile);
       
  1884 	CleanupClosePushL(resFile);
       
  1885 
       
  1886 //Test GetDescription()
       
  1887 
       
  1888 	TPtrC buf(KGetDescriptionTestMessage);
       
  1889 	const TInt maxLength = buf.Length();
       
  1890 	HBufC* desBuf = HBufC::NewLC(maxLength);
       
  1891 	TPtr desc = desBuf->Des();
       
  1892 
       
  1893 	for( TInt length=1; length <= maxLength; ++length )
       
  1894 		{
       
  1895 		iSmsTest.Printf(_L("-> trucating to length %d\n"), length);
       
  1896 
       
  1897 		desc.Zero();
       
  1898 		User::LeaveIfError(TSmsUtilities::GetDescription(aHeader.Message(), desc, length));
       
  1899 
       
  1900 		iSmsTest.Printf(_L("-> GetDescription() : %S\n"), &desc);
       
  1901 		
       
  1902 		iSmsTest(desc.Length()<=length);
       
  1903 		iSmsTest(desc == buf.Left(desc.Length()) ); //this won't work if buf contains CEditableText::EParagraphDelimiter
       
  1904 		}
       
  1905 	desc.Zero();
       
  1906 
       
  1907 //Test Special Message Indication
       
  1908 
       
  1909 	CSmsPDU& pdu = aHeader.Message().SmsPDU();
       
  1910 	CSmsUserData& userData = pdu.UserData();
       
  1911 	TBuf8<2> msgInd;
       
  1912 	msgInd.Copy(_L("AA"));
       
  1913 
       
  1914 	//Add information element
       
  1915 	msgInd[0] = TSmsUtilities::EEmailMessageWaiting;
       
  1916 	msgInd[1] = 0x00000001; //1 message
       
  1917 
       
  1918 	iSmsTest.Printf(_L("\tAdding information element (Email) to UD\n"));
       
  1919 	userData.AddInformationElementL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication, msgInd);
       
  1920 	User::LeaveIfError(TSmsUtilities::GetDescription(aHeader.Message(), desc));
       
  1921 	CheckDescriptionL(resFile, R_MESSAGE_INDICATION_EMAIL_ONE, desc, 2);
       
  1922 
       
  1923 	// Set the maximum length of desc to be less than the description.
       
  1924 	// The description should truncate to fit into desc.
       
  1925 	User::LeaveIfError(TSmsUtilities::GetDescription(aHeader.Message(), desc, 10));
       
  1926 	iSmsTest(desc.Length() == 10); //Check that the Length of desc is the specified max length.
       
  1927 
       
  1928 	TestSpecialSmsMessageIndicationPduL(resFile, TSmsUtilities::EVoiceMessageWaiting, R_MESSAGE_INDICATION_VOICEMAIL_ONE);
       
  1929 	TestSpecialSmsMessageIndicationPduL(resFile, TSmsUtilities::EFaxMessageWaiting, R_MESSAGE_INDICATION_FAX_ONE);
       
  1930 	TestSpecialSmsMessageIndicationPduL(resFile, TSmsUtilities::EEmailMessageWaiting, R_MESSAGE_INDICATION_EMAIL_ONE);
       
  1931 	TestSpecialSmsMessageIndicationPduL(resFile, TSmsUtilities::EOtherMessageWaiting, R_MESSAGE_INDICATION_OTHER_ONE);
       
  1932 
       
  1933 	CleanupStack::PopAndDestroy(2, &resFile);
       
  1934 
       
  1935 	iSmsTest.Printf(_L("Passed\n"));
       
  1936 	}
       
  1937 
       
  1938 CSmsMessage* CSmutTest::CreateSmsMessageLC(const TDesC8& aHexPdu) const
       
  1939 	{
       
  1940 	HBufC8* binaryPdu = ConvertToBinaryLC(aHexPdu);
       
  1941 	TGsmSms pdu;
       
  1942 	pdu.SetPdu(*binaryPdu);
       
  1943 	CleanupStack::PopAndDestroy(binaryPdu);
       
  1944 	CSmsMessage* message = CSmsMessage::NewL(iSmsTest.FileSession(), pdu, CSmsBuffer::NewL());
       
  1945 	CleanupStack::PushL(message);
       
  1946 	return message;
       
  1947 	}
       
  1948 
       
  1949 HBufC8* CSmutTest::ConvertToBinaryLC(const TDesC8& aHex) const
       
  1950 	{
       
  1951 	const TInt len = aHex.Length();
       
  1952 	if (len % 2 != 0)
       
  1953 		User::Leave(KErrArgument);
       
  1954 
       
  1955 	HBufC8* pdu = HBufC8::NewLC(len / 2);
       
  1956 	TPtr8 ptr(pdu->Des());
       
  1957 
       
  1958 	for (TInt i = 0; i < len; i += 2)
       
  1959 		{
       
  1960 		TLex8 lex(aHex.Mid(i, 2));
       
  1961 		TUint8 val;
       
  1962 		User::LeaveIfError(lex.Val(val, EHex));
       
  1963 		ptr.Append(val);
       
  1964 		}
       
  1965 
       
  1966 	return pdu;
       
  1967 	}
       
  1968 
       
  1969 _LIT(KGetDetailsResult, "\t\tNum In: \"%S\" Name Out: \"%S\"\n");
       
  1970 
       
  1971 void CSmutTest::TestSmsUtilities2L(CSmsHeader& aHeader)
       
  1972 	{
       
  1973 //Test GetDetails
       
  1974 
       
  1975 	iSmsTest.Printf(_L("Test TSmsUtilities::GetDetails()\n"));
       
  1976 
       
  1977 	_LIT(KLongTel, "+378458932945284754456302945754938539");
       
  1978 
       
  1979 	_LIT(KMikkoTel, "+358503367709");
       
  1980 	_LIT(KMikkoFirst, "Mikko");
       
  1981 	_LIT(KMikkoLast, "Rintala");
       
  1982 	_LIT(KMikkoEmail, "mikko@nokia.com");
       
  1983 
       
  1984 	_LIT(KUnqualifiedTel, "8503367710");
       
  1985 	_LIT(KUnqualifiedTel1, "+358503367710");
       
  1986 	_LIT(KUnqualifiedFirst, "Unq");
       
  1987 	_LIT(KUnqualifiedLast, "Wallified");
       
  1988 	_LIT(KUnqualifiedEmail, "unqalified@diysurgery.com");
       
  1989 
       
  1990 //	_LIT(KAnthonyTel, " + 4 "); //is valid
       
  1991 	_LIT(KAnthonyTel, "+ 7 "); //is valid
       
  1992 	_LIT(KAnthonyFirst, "Anthony");
       
  1993 	_LIT(KAnthonyLast, "Alexander");
       
  1994 	_LIT(KAnthonyEmail, "test@symbian.com");
       
  1995 
       
  1996 	_LIT(KHarriTel, "+8"); //is valid
       
  1997 	_LIT(KHarriFirst, "HarriHarriHarriHarriHarriHarriHarri");
       
  1998 	_LIT(KHarriLast, "RäisänenRäisänenRäisänenRäisänenRäisänen");
       
  1999 	_LIT(KHarriEmail, "harri@nokia.com");
       
  2000 
       
  2001 	_LIT(KDupTel, "+44207435676");
       
  2002 	_LIT(KDupFirst1, "Keval");
       
  2003 	_LIT(KDupLast1, "Pindoria");
       
  2004 	_LIT(KDupFirst2, "Jackie");
       
  2005 	_LIT(KDupLast2, "Chan");
       
  2006 	
       
  2007 	_LIT(KBadTel1, "This is a bad Telephone");
       
  2008 	_LIT(KBadTel2, " 5  ");
       
  2009 	_LIT(KBadTel3, "5+");
       
  2010 	_LIT(KBadTel4, "*5565434556");
       
  2011 
       
  2012 	_LIT(KBadFirst, "BadFirstName");
       
  2013 	_LIT(KBadLast, "BadLastName");
       
  2014 
       
  2015 	_LIT(KNoNameTel, "+449005434");
       
  2016 
       
  2017 	_LIT(KDummy, "+44444");
       
  2018 
       
  2019 	TRAPD(err, iSmsTest.DeleteContactsFileL());
       
  2020 	iSmsTest(err == KErrNotFound || err == KErrNone);
       
  2021 
       
  2022 	iSmsTest.Printf(_L("\tTesting without contacts\n"));
       
  2023 
       
  2024 	//Simple test
       
  2025 	TPtrC testTel(KMikkoTel);
       
  2026 	TBuf<KSmsDetailsLength> details;
       
  2027 
       
  2028 	aHeader.Message().SetToFromAddressL(testTel);
       
  2029 	TSmsUtilities::GetDetails(iSmsTest.FileSession(), aHeader.Message(), details);
       
  2030 	iSmsTest.Printf(KGetDetailsResult, &testTel, &details);
       
  2031 	iSmsTest(testTel.FindF(details) != KErrNotFound); //details should contain testTel as there is no contact.
       
  2032 
       
  2033 	TestInvalidContact(testTel, details);
       
  2034 
       
  2035 	testTel.Set(KAnthonyTel);
       
  2036 	aHeader.Message().SetToFromAddressL(testTel);
       
  2037 	err = TSmsUtilities::GetDetails(iSmsTest.FileSession(), aHeader.Message(), details);
       
  2038 	iSmsTest.Printf(KGetDetailsResult, &testTel, &details);
       
  2039 	iSmsTest(testTel.FindF(details) != KErrNotFound); //details should contain testTel as there is no contact.
       
  2040 	iSmsTest(err == KErrNone);
       
  2041 
       
  2042 	TestInvalidContact(testTel, details);
       
  2043 
       
  2044 	// Testing with long telephone number. 
       
  2045 	// The telephone number should truncate to fit into details.
       
  2046 	TestInvalidContact(KLongTel, details);
       
  2047 	iSmsTest(details.Length() == KSmsDetailsLength); //Length of details should be the default max length.
       
  2048 
       
  2049 	//Add contacts
       
  2050 
       
  2051 	iSmsTest.Printf(_L("\tAdding Contacts\n"));
       
  2052 
       
  2053 		//Adding good telephone numbers
       
  2054 
       
  2055 		TContactItemId contId = iSmsTest.CreateContactL(KAnthonyFirst, KAnthonyLast, KAnthonyTel, KAnthonyEmail);
       
  2056 		iSmsTest(contId != KNullContactId);
       
  2057 
       
  2058 		contId = iSmsTest.CreateContactL(KMikkoFirst, KMikkoLast, KMikkoTel, KMikkoEmail);
       
  2059 		iSmsTest(contId != KNullContactId);
       
  2060 
       
  2061 		contId = iSmsTest.CreateContactL(KUnqualifiedFirst, KUnqualifiedLast, KUnqualifiedTel, KUnqualifiedEmail);
       
  2062 		iSmsTest(contId != KNullContactId);
       
  2063 
       
  2064 		contId = iSmsTest.CreateContactL(KHarriFirst, KHarriLast, KHarriTel, KHarriEmail);
       
  2065 		iSmsTest(contId != KNullContactId);
       
  2066 
       
  2067 		//Adding a duplicate telephone
       
  2068 
       
  2069 		contId = iSmsTest.CreateContactL(KDupFirst1, KDupLast1, KDupTel, KNullDesC);
       
  2070 		iSmsTest(contId != KNullContactId);
       
  2071 
       
  2072 		contId = iSmsTest.CreateContactL(KDupFirst2, KDupLast2, KDupTel, KNullDesC);
       
  2073 		iSmsTest(contId != KNullContactId);
       
  2074 
       
  2075 		//Adding bad telephone numbers
       
  2076 
       
  2077 		contId = iSmsTest.CreateContactL(KBadFirst, KBadLast, KBadTel1, KNullDesC);
       
  2078 		iSmsTest(contId != KNullContactId);
       
  2079 
       
  2080 		contId = iSmsTest.CreateContactL(KBadFirst, KBadLast, KBadTel2, KNullDesC);
       
  2081 		iSmsTest(contId != KNullContactId);
       
  2082 
       
  2083 		contId = iSmsTest.CreateContactL(KBadFirst, KBadLast, KBadTel3, KNullDesC);
       
  2084 		iSmsTest(contId != KNullContactId);
       
  2085 
       
  2086 		contId = iSmsTest.CreateContactL(KBadFirst, KBadLast, KBadTel4, KNullDesC);
       
  2087 		iSmsTest(contId != KNullContactId);
       
  2088 
       
  2089 		//Adding no name contact
       
  2090 
       
  2091 		contId = iSmsTest.CreateContactL(KNullDesC, KNullDesC, KNoNameTel, KNullDesC);
       
  2092 		iSmsTest(contId != KNullContactId);
       
  2093 
       
  2094 	iSmsTest.Printf(_L("\tTesting with valid telephone numbers\n"));
       
  2095 
       
  2096 		TestValidTel(KAnthonyTel, KAnthonyFirst, KAnthonyLast, KNullDesC, details);
       
  2097 		TestValidTel(KMikkoTel, KMikkoFirst, KMikkoLast, KNullDesC, details);
       
  2098 		// Test below was added for INC040050. The number of digits matched
       
  2099 		// against in GetDetails changed and resulted in undesirable behaviour
       
  2100 		// when searching for an unqualified number with a fully qualified number.
       
  2101 		TestValidTel(KUnqualifiedTel1, KUnqualifiedFirst, KUnqualifiedLast, KNullDesC, details);
       
  2102 		TestValidTel(KHarriTel, _L("Räisänen"), KNullDesC, _L("Harri"), details);
       
  2103 
       
  2104 	iSmsTest.Printf(_L("\tTesting with invalid telephone numbers\n"));
       
  2105 
       
  2106 		TestInvalidTelephone(KBadTel1, details);
       
  2107 		TestInvalidTelephone(KBadTel2, details);
       
  2108 		TestInvalidTelephone(KBadTel3, details);
       
  2109 		TestInvalidTelephone(KBadTel4, details);
       
  2110 
       
  2111 	iSmsTest.Printf(_L("\tTesting with duplicate telephone numbers\n"));
       
  2112 
       
  2113 		TestDuplicateContact(KDupTel, details);
       
  2114 
       
  2115 	iSmsTest.Printf(_L("\tTesting No Names telephone number\n"));
       
  2116 
       
  2117 		TestInvalidContact(KNoNameTel, details);
       
  2118 		TestInvalidContact(KDummy, details);
       
  2119 
       
  2120 	iSmsTest.Printf(_L("Passed\n"));
       
  2121 	}
       
  2122 
       
  2123 void CSmutTest::TestValidTel(const TDesC& aTel, const TDesC& aExpect1, const TDesC& aExpect2, const TDesC& aNotExpect, TDes& rDetails)
       
  2124 	{
       
  2125 	TInt err = TSmsUtilities::GetDetails(iSmsTest.FileSession(), aTel, rDetails);
       
  2126 	iSmsTest.Printf(KGetDetailsResult, &aTel, &rDetails);
       
  2127 
       
  2128 	if (aExpect1.Length())
       
  2129 		iSmsTest(rDetails.FindF(aExpect1) != KErrNotFound);
       
  2130 
       
  2131 	if (aExpect2.Length())
       
  2132 		iSmsTest(rDetails.FindF(aExpect2) != KErrNotFound);
       
  2133 
       
  2134 	if (aNotExpect.Length())
       
  2135 		iSmsTest(rDetails.FindF(aNotExpect) == KErrNotFound);
       
  2136 
       
  2137 	iSmsTest(err == KErrNone);
       
  2138 	}
       
  2139 
       
  2140 void CSmutTest::TestInvalidTelephone(const TDesC& aTel, TDes& aDetails)
       
  2141 	{
       
  2142 	TInt err = TSmsUtilities::GetDetails(iSmsTest.FileSession(), aTel, aDetails);
       
  2143 	iSmsTest.Printf(KGetDetailsResult, &aTel, &aDetails);
       
  2144 	iSmsTest(aTel.FindF(aDetails) != KErrNotFound);	//aDetails should contain aTel as aTel is invalid.
       
  2145 	iSmsTest(err == KErrNone);
       
  2146 	}	
       
  2147 
       
  2148 void CSmutTest::TestInvalidContact(const TDesC& aTel, TDes& aDetails)
       
  2149 	{
       
  2150 	TInt err = TSmsUtilities::GetDetails(iSmsTest.FileSession(), aTel, aDetails);
       
  2151 	iSmsTest.Printf(KGetDetailsResult, &aTel, &aDetails);
       
  2152 	iSmsTest(aTel.FindF(aDetails) != KErrNotFound); //aDetails should contain aTel as the contact is invalid.
       
  2153 	iSmsTest(err == KErrNone);
       
  2154 	}
       
  2155 
       
  2156 void CSmutTest::TestDuplicateContact(const TDesC& aTel, TDes& aDetails)
       
  2157 	{
       
  2158 	TInt err = TSmsUtilities::GetDetails(iSmsTest.FileSession(), aTel, aDetails);
       
  2159 	iSmsTest.Printf(KGetDetailsResult, &aTel, &aDetails);
       
  2160 	iSmsTest(aTel.FindF(aDetails) != KErrNotFound); //aDetails should contain aTel as there is duplicate contact.
       
  2161 	iSmsTest(err == KErrNone);
       
  2162 	}
       
  2163 
       
  2164 void CSmutTest::TestSmsUtilities3L(CSmsHeader& aHeader)
       
  2165 	{
       
  2166 	iSmsTest.Printf(_L("Test TSmsUtilities::ServiceIdL()\n"));
       
  2167 
       
  2168 	TMsvId id2 = KMsvNullIndexEntryId;
       
  2169 // First tested function is ServiceIdL()
       
  2170 	TSmsUtilities::ServiceIdL(*iSmsTest.iMsvEntry, id2);
       
  2171 	iSmsTest(id2 == iSmsTest.iSmsServiceId);
       
  2172 	iSmsTest.Printf(_L("\tPassed\n"));
       
  2173 
       
  2174 	iSmsTest.Printf(_L("Test TSmsUtilities::PopulateMsgEntry()\n"));
       
  2175 	TMsvEntry entry;
       
  2176 	TSmsUtilities::PopulateMsgEntry(entry,aHeader.Message(), iSmsTest.iSmsServiceId);
       
  2177 // todo More tests
       
  2178 	iSmsTest.Printf(_L("\tPassed\n"));
       
  2179 	}
       
  2180 
       
  2181 void CSmutTest::TestSmsUtilitiesTimeStampsL()
       
  2182 	{
       
  2183 	CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsDeliver,*iRichText);
       
  2184 	CleanupStack::PushL(header);
       
  2185 
       
  2186 	header->Message().SetTime(1);
       
  2187 	CSmsDeliver& deliver = header->Deliver();
       
  2188 	deliver.SetServiceCenterTimeStamp(2);
       
  2189 
       
  2190 	CSmsSettings* settings = CSmsSettings::NewL();
       
  2191 	CleanupStack::PushL(settings);
       
  2192 	RestoreSettingsL(*settings);
       
  2193 
       
  2194 	// Default settings should be to use the time that the SMS message time (the time
       
  2195 	// that the SMS arrives at the phone) as opposed to the time it arrives at the
       
  2196 	// service centre.
       
  2197 
       
  2198 	iSmsTest.Printf(_L("Test PopulateMsgEntry() with settings to use SMS message time\n"));
       
  2199 
       
  2200 	TMsvEntry entry;
       
  2201 	TSmsUtilities::PopulateMsgEntry(entry, header->Message(), iSmsTest.iSmsServiceId, *settings);
       
  2202 	iSmsTest(entry.iDate == 1);
       
  2203 	iSmsTest.Printf(_L("\tPassed\n"));
       
  2204 
       
  2205 	// Now test that we use the service centre timestamp if the SMS setting flag
       
  2206 	// requires us to do so.
       
  2207 	iSmsTest.Printf(_L("Test PopulateMsgEntry() with settings to use service center timestamp\n"));
       
  2208 
       
  2209 	settings->SetUseServiceCenterTimeStampForDate(ETrue);
       
  2210 
       
  2211 	TSmsUtilities::PopulateMsgEntry(entry, header->Message(), iSmsTest.iSmsServiceId, *settings);
       
  2212 	iSmsTest(entry.iDate == 2);
       
  2213 	iSmsTest.Printf(_L("\tPassed\n"));
       
  2214 	
       
  2215 	CleanupStack::PopAndDestroy(2, header);
       
  2216 	}
       
  2217 
       
  2218 void CSmutTest::TestSmsUtilities4L(CSmsHeader& aHeader)
       
  2219 /**
       
  2220  * @test Tests CSmsGetDetDescInterface::GetDescription() default implementation
       
  2221  *
       
  2222  * This is a modified version of TestSmsUtilities1L(CSmsHeader& aHeader), modified to use the 
       
  2223  * CSmsGetDetDescInterface ECOM plugin interface instead of the TSmsUtilies
       
  2224  * interface for ::GetDescription
       
  2225  */
       
  2226 	{
       
  2227 	iSmsTest.Printf(_L("Testing CSmsGetDetDescInterface::GetDescription() - use varying values to test trucation\n"));
       
  2228 
       
  2229 	RResourceFile resFile;
       
  2230 	iSmsTest.OpenResourceFileL(KSmsResourceFile, resFile);
       
  2231 	CleanupClosePushL(resFile);
       
  2232 	
       
  2233 //Test GetDescription()
       
  2234 
       
  2235 	TPtrC buf(KGetDescriptionTestMessage);
       
  2236 	const TInt maxLength = buf.Length();
       
  2237 	HBufC* desBuf = HBufC::NewLC(maxLength); // on the CleanupStack
       
  2238 	TPtr desc = desBuf->Des();
       
  2239 
       
  2240 	// load ECOM interface used to create SMS details and description values.
       
  2241 	iSmsTest.Printf(_L("Loading ECOM Plugin...\n"));
       
  2242 	CSmsGetDetDescInterface* getDetDesc = CSmsGetDetDescInterface::NewL();
       
  2243 	CleanupStack::PushL(getDetDesc);
       
  2244 	iSmsTest.Printf(_L("... Plugin loaded\n"));
       
  2245 	
       
  2246 	for( TInt length=1; length <= maxLength; ++length )
       
  2247 		{
       
  2248 		iSmsTest.Printf(_L("-> trucating to length %d\n"), length);
       
  2249 
       
  2250 		desc.Zero();
       
  2251 		User::LeaveIfError(getDetDesc->GetDescription(aHeader.Message(), desc, length));
       
  2252 
       
  2253 		iSmsTest.Printf(_L("-> GetDescription() : %S\n"), &desc);
       
  2254 		
       
  2255 		iSmsTest(desc.Length()<=length);
       
  2256 		iSmsTest(desc == buf.Left(desc.Length()) ); //this won't work if buf contains CEditableText::EParagraphDelimiter
       
  2257 		}
       
  2258 	desc.Zero();
       
  2259 
       
  2260 //Test Special Message Indication
       
  2261 
       
  2262 	CSmsPDU& pdu = aHeader.Message().SmsPDU();
       
  2263 	CSmsUserData& userData = pdu.UserData();
       
  2264 	TBuf8<2> msgInd;
       
  2265 	msgInd.Copy(_L("AA"));
       
  2266 
       
  2267 	//Add information element
       
  2268 	msgInd[0] = TSmsUtilities::EEmailMessageWaiting;
       
  2269 	msgInd[1] = 0x00000001; //1 message
       
  2270 
       
  2271 	iSmsTest.Printf(_L("\tAdding information element (Email) to UD\n"));
       
  2272 	userData.AddInformationElementL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication, msgInd);
       
  2273 	User::LeaveIfError(getDetDesc->GetDescription(aHeader.Message(), desc));
       
  2274 	CheckDescriptionL(resFile, R_MESSAGE_INDICATION_EMAIL_ONE, desc, 2);
       
  2275 
       
  2276 	// Set the maximum length of desc to be less than the description.
       
  2277 	// The description should truncate to fit into desc.
       
  2278 	User::LeaveIfError(getDetDesc->GetDescription(aHeader.Message(), desc, 10));
       
  2279 	iSmsTest(desc.Length() == 10); //Check that the Length of desc is the specified max length.
       
  2280 
       
  2281 	TestSpecialSmsMessageIndicationPduL(resFile, TSmsUtilities::EVoiceMessageWaiting, R_MESSAGE_INDICATION_VOICEMAIL_ONE);
       
  2282 	TestSpecialSmsMessageIndicationPduL(resFile, TSmsUtilities::EFaxMessageWaiting, R_MESSAGE_INDICATION_FAX_ONE);
       
  2283 	TestSpecialSmsMessageIndicationPduL(resFile, TSmsUtilities::EEmailMessageWaiting, R_MESSAGE_INDICATION_EMAIL_ONE);
       
  2284 	TestSpecialSmsMessageIndicationPduL(resFile, TSmsUtilities::EOtherMessageWaiting, R_MESSAGE_INDICATION_OTHER_ONE);
       
  2285 	
       
  2286 	CleanupStack::PopAndDestroy(getDetDesc);
       
  2287 	REComSession::FinalClose();
       
  2288 
       
  2289 	CleanupStack::PopAndDestroy(2, &resFile);
       
  2290 
       
  2291 	iSmsTest.Printf(_L("Passed\n"));
       
  2292 	}
       
  2293 
       
  2294 void CSmutTest::TestSmsUtilities5L(CSmsHeader& aHeader)
       
  2295 /**
       
  2296  * @test Tests CSmsGetDetDescInterface::GetDetails() default implementation
       
  2297  *
       
  2298  * This is a modified version of TestSmsUtilities2L(CSmsHeader& aHeader), modified to use the 
       
  2299  * CSmsGetDetDescInterface ECOM plugin interface instead of the TSmsUtilies
       
  2300  * interface for ::GetDetails
       
  2301  */
       
  2302 	{
       
  2303 //Test GetDetails
       
  2304 
       
  2305 	iSmsTest.Printf(_L("Test CSmsGetDetDescInterface::GetDetails()\n"));
       
  2306 
       
  2307 	_LIT(KLongTel, "+378458932945284754456302945754938539");
       
  2308 
       
  2309 	_LIT(KMikkoTel, "+358503367709");
       
  2310 	_LIT(KMikkoFirst, "Mikko");
       
  2311 	_LIT(KMikkoLast, "Rintala");
       
  2312 	_LIT(KMikkoEmail, "mikko@nokia.com");
       
  2313 
       
  2314 	_LIT(KUnqualifiedTel, "8503367710");
       
  2315 	_LIT(KUnqualifiedTel1, "+358503367710");
       
  2316 	_LIT(KUnqualifiedFirst, "Unq");
       
  2317 	_LIT(KUnqualifiedLast, "Wallified");
       
  2318 	_LIT(KUnqualifiedEmail, "unqalified@diysurgery.com");
       
  2319 
       
  2320 	_LIT(KAnthonyTel, "+ 7 "); //is valid
       
  2321 	_LIT(KAnthonyFirst, "Anthony");
       
  2322 	_LIT(KAnthonyLast, "Alexander");
       
  2323 	_LIT(KAnthonyEmail, "test@symbian.com");
       
  2324 
       
  2325 	_LIT(KHarriTel, "+8"); //is valid
       
  2326 	_LIT(KHarriFirst, "HarriHarriHarriHarriHarriHarriHarri");
       
  2327 	_LIT(KHarriLast, "RäisänenRäisänenRäisänenRäisänenRäisänen");
       
  2328 	_LIT(KHarriEmail, "harri@nokia.com");
       
  2329 
       
  2330 	_LIT(KDupTel, "+44207435676");
       
  2331 	_LIT(KDupFirst1, "Keval");
       
  2332 	_LIT(KDupLast1, "Pindoria");
       
  2333 	_LIT(KDupFirst2, "Jackie");
       
  2334 	_LIT(KDupLast2, "Chan");
       
  2335 	
       
  2336 	_LIT(KBadTel1, "This is a bad Telephone");
       
  2337 	_LIT(KBadTel2, " 5  ");
       
  2338 	_LIT(KBadTel3, "5+");
       
  2339 	_LIT(KBadTel4, "*5565434556");
       
  2340 
       
  2341 	_LIT(KBadFirst, "BadFirstName");
       
  2342 	_LIT(KBadLast, "BadLastName");
       
  2343 
       
  2344 	_LIT(KNoNameTel, "+449005434");
       
  2345 
       
  2346 	_LIT(KDummy, "+44444");
       
  2347 	
       
  2348 	// load ECOM interface used to create SMS details and description values.
       
  2349 	iSmsTest.Printf(_L("Loading ECOM Plugin...\n"));
       
  2350 	CSmsGetDetDescInterface* getDetDesc = CSmsGetDetDescInterface::NewL();
       
  2351 	CleanupStack::PushL(getDetDesc);
       
  2352 	iSmsTest.Printf(_L("... Plugin loaded\n"));
       
  2353 
       
  2354 
       
  2355 	TRAPD(err, iSmsTest.DeleteContactsFileL());
       
  2356 	iSmsTest(err == KErrNotFound || err == KErrNone);
       
  2357 
       
  2358 	iSmsTest.Printf(_L("\tTesting without contacts\n"));
       
  2359 
       
  2360 	//Simple test
       
  2361 	TPtrC testTel(KMikkoTel);
       
  2362 	TBuf<KSmsDetailsLength> details;
       
  2363 
       
  2364 	aHeader.Message().SetToFromAddressL(testTel);
       
  2365 	getDetDesc->GetDetails(iSmsTest.FileSession(), aHeader.Message(), details);
       
  2366 	iSmsTest.Printf(KGetDetailsResult, &testTel, &details);
       
  2367 	iSmsTest(testTel.FindF(details) != KErrNotFound); //details should contain testTel as there is no contact.
       
  2368 
       
  2369 	TestInvalidContact(testTel, details);
       
  2370 
       
  2371 	testTel.Set(KAnthonyTel);
       
  2372 	aHeader.Message().SetToFromAddressL(testTel);
       
  2373 	err = getDetDesc->GetDetails(iSmsTest.FileSession(), aHeader.Message(), details);
       
  2374 	iSmsTest.Printf(KGetDetailsResult, &testTel, &details);
       
  2375 	iSmsTest(testTel.FindF(details) != KErrNotFound); //details should contain testTel as there is no contact.
       
  2376 	iSmsTest(err == KErrNone);
       
  2377 
       
  2378 	TestInvalidContact(testTel, details);
       
  2379 
       
  2380 	// Testing with long telephone number. 
       
  2381 	// The telephone number should truncate to fit into details.
       
  2382 	TestInvalidContact(KLongTel, details);
       
  2383 	iSmsTest(details.Length() == KSmsDetailsLength); //Length of details should be the default max length.
       
  2384 
       
  2385 	//Add contacts
       
  2386 
       
  2387 	iSmsTest.Printf(_L("\tAdding Contacts\n"));
       
  2388 
       
  2389 		//Adding good telephone numbers
       
  2390 
       
  2391 		TContactItemId contId = iSmsTest.CreateContactL(KAnthonyFirst, KAnthonyLast, KAnthonyTel, KAnthonyEmail);
       
  2392 		iSmsTest(contId != KNullContactId);
       
  2393 
       
  2394 		contId = iSmsTest.CreateContactL(KMikkoFirst, KMikkoLast, KMikkoTel, KMikkoEmail);
       
  2395 		iSmsTest(contId != KNullContactId);
       
  2396 
       
  2397 		contId = iSmsTest.CreateContactL(KUnqualifiedFirst, KUnqualifiedLast, KUnqualifiedTel, KUnqualifiedEmail);
       
  2398 		iSmsTest(contId != KNullContactId);
       
  2399 
       
  2400 		contId = iSmsTest.CreateContactL(KHarriFirst, KHarriLast, KHarriTel, KHarriEmail);
       
  2401 		iSmsTest(contId != KNullContactId);
       
  2402 
       
  2403 		//Adding a duplicate telephone
       
  2404 
       
  2405 		contId = iSmsTest.CreateContactL(KDupFirst1, KDupLast1, KDupTel, KNullDesC);
       
  2406 		iSmsTest(contId != KNullContactId);
       
  2407 
       
  2408 		contId = iSmsTest.CreateContactL(KDupFirst2, KDupLast2, KDupTel, KNullDesC);
       
  2409 		iSmsTest(contId != KNullContactId);
       
  2410 
       
  2411 		//Adding bad telephone numbers
       
  2412 
       
  2413 		contId = iSmsTest.CreateContactL(KBadFirst, KBadLast, KBadTel1, KNullDesC);
       
  2414 		iSmsTest(contId != KNullContactId);
       
  2415 
       
  2416 		contId = iSmsTest.CreateContactL(KBadFirst, KBadLast, KBadTel2, KNullDesC);
       
  2417 		iSmsTest(contId != KNullContactId);
       
  2418 
       
  2419 		contId = iSmsTest.CreateContactL(KBadFirst, KBadLast, KBadTel3, KNullDesC);
       
  2420 		iSmsTest(contId != KNullContactId);
       
  2421 
       
  2422 		contId = iSmsTest.CreateContactL(KBadFirst, KBadLast, KBadTel4, KNullDesC);
       
  2423 		iSmsTest(contId != KNullContactId);
       
  2424 
       
  2425 		//Adding no name contact
       
  2426 
       
  2427 		contId = iSmsTest.CreateContactL(KNullDesC, KNullDesC, KNoNameTel, KNullDesC);
       
  2428 		iSmsTest(contId != KNullContactId);
       
  2429 
       
  2430 	iSmsTest.Printf(_L("\tTesting with valid telephone numbers\n"));
       
  2431 
       
  2432 		TestValidTel(*getDetDesc, KAnthonyTel, KAnthonyFirst, KAnthonyLast, KNullDesC, details);
       
  2433 		TestValidTel(*getDetDesc, KMikkoTel, KMikkoFirst, KMikkoLast, KNullDesC, details);
       
  2434 		// Test below was added for INC040050. The number of digits matched
       
  2435 		// against in GetDetails changed and resulted in undesirable behaviour
       
  2436 		// when searching for an unqualified number with a fully qualified number.
       
  2437 		TestValidTel(*getDetDesc, KUnqualifiedTel1, KUnqualifiedFirst, KUnqualifiedLast, KNullDesC, details);
       
  2438 		TestValidTel(*getDetDesc, KHarriTel, _L("Räisänen"), KNullDesC, _L("Harri"), details);
       
  2439 
       
  2440 	iSmsTest.Printf(_L("\tTesting with invalid telephone numbers\n"));
       
  2441 
       
  2442 		TestInvalidTelephone(*getDetDesc, KBadTel1, details);
       
  2443 		TestInvalidTelephone(*getDetDesc, KBadTel2, details);
       
  2444 		TestInvalidTelephone(*getDetDesc, KBadTel3, details);
       
  2445 		TestInvalidTelephone(*getDetDesc, KBadTel4, details);
       
  2446 
       
  2447 	iSmsTest.Printf(_L("\tTesting with duplicate telephone numbers\n"));
       
  2448 
       
  2449 		TestDuplicateContact(*getDetDesc, KDupTel, details);
       
  2450 
       
  2451 	iSmsTest.Printf(_L("\tTesting No Names telephone number\n"));
       
  2452 
       
  2453 		TestInvalidContact(*getDetDesc, KNoNameTel, details);
       
  2454 		TestInvalidContact(*getDetDesc, KDummy, details);
       
  2455 	
       
  2456 	CleanupStack::PopAndDestroy(getDetDesc);
       
  2457 	REComSession::FinalClose();
       
  2458 
       
  2459 	iSmsTest.Printf(_L("Passed\n"));
       
  2460 	}
       
  2461 
       
  2462 void CSmutTest::TestValidTel(CSmsGetDetDescInterface& aGetDetDesc, const TDesC& aTel, const TDesC& aExpect1, const TDesC& aExpect2, const TDesC& aNotExpect, TDes& rDetails)
       
  2463 	{
       
  2464 	TInt err = aGetDetDesc.GetDetails(iSmsTest.FileSession(), aTel, rDetails);
       
  2465 	iSmsTest.Printf(KGetDetailsResult, &aTel, &rDetails);
       
  2466 
       
  2467 	if (aExpect1.Length())
       
  2468 		iSmsTest(rDetails.FindF(aExpect1) != KErrNotFound);
       
  2469 
       
  2470 	if (aExpect2.Length())
       
  2471 		iSmsTest(rDetails.FindF(aExpect2) != KErrNotFound);
       
  2472 
       
  2473 	if (aNotExpect.Length())
       
  2474 		iSmsTest(rDetails.FindF(aNotExpect) == KErrNotFound);
       
  2475 
       
  2476 	iSmsTest(err == KErrNone);
       
  2477 	}
       
  2478 
       
  2479 void CSmutTest::TestInvalidTelephone(CSmsGetDetDescInterface& aGetDetDesc, const TDesC& aTel, TDes& aDetails)
       
  2480 	{
       
  2481 	TInt err = aGetDetDesc.GetDetails(iSmsTest.FileSession(), aTel, aDetails);
       
  2482 	iSmsTest.Printf(KGetDetailsResult, &aTel, &aDetails);
       
  2483 	iSmsTest(aTel.FindF(aDetails) != KErrNotFound);	//aDetails should contain aTel as aTel is invalid.
       
  2484 	iSmsTest(err == KErrNone);
       
  2485 	}	
       
  2486 
       
  2487 void CSmutTest::TestInvalidContact(CSmsGetDetDescInterface& aGetDetDesc, const TDesC& aTel, TDes& aDetails)
       
  2488 	{
       
  2489 	TInt err = aGetDetDesc.GetDetails(iSmsTest.FileSession(), aTel, aDetails);
       
  2490 	iSmsTest.Printf(KGetDetailsResult, &aTel, &aDetails);
       
  2491 	iSmsTest(aTel.FindF(aDetails) != KErrNotFound); //aDetails should contain aTel as the contact is invalid.
       
  2492 	iSmsTest(err == KErrNone);
       
  2493 	}
       
  2494 
       
  2495 void CSmutTest::TestDuplicateContact(CSmsGetDetDescInterface& aGetDetDesc, const TDesC& aTel, TDes& aDetails)
       
  2496 	{
       
  2497 	TInt err = aGetDetDesc.GetDetails(iSmsTest.FileSession(), aTel, aDetails);
       
  2498 	iSmsTest.Printf(KGetDetailsResult, &aTel, &aDetails);
       
  2499 	iSmsTest(aTel.FindF(aDetails) != KErrNotFound); //aDetails should contain aTel as there is duplicate contact.
       
  2500 	iSmsTest(err == KErrNone);
       
  2501 	}
       
  2502 
       
  2503 void CSmutTest::TestSpecialSmsMessageIndicationPduL(RResourceFile& aResFile, TSmsUtilities::TSmsUtilitiesSpecialMessageType aMessageType, TInt aId)
       
  2504 	{
       
  2505 	iSmsTest.Printf(_L("\tTestSpecialSmsMessageIndicationPduL Type=%d..."), aMessageType);
       
  2506 
       
  2507 	const TUint8 KMaxCount = 0xFF;
       
  2508 	for (TUint8 i = 0; i < KMaxCount; i++)
       
  2509 		{
       
  2510 		TInt resId = aId;
       
  2511 		if (i != 1)
       
  2512 			resId++;
       
  2513 
       
  2514 		TestSpecialSmsMessageIndicationPduL(aResFile, STATIC_CAST(TUint8, aMessageType), i, resId);
       
  2515 		TestSpecialSmsMessageIndicationPduL(aResFile, STATIC_CAST(TUint8, aMessageType | 0x80), i, resId);
       
  2516 		}
       
  2517 
       
  2518 	iSmsTest.Printf(_L("Passed\n"));
       
  2519 	}
       
  2520 
       
  2521 void CSmutTest::TestSpecialSmsMessageIndicationPduL(RResourceFile& aResFile, TUint8 aMessageType, TUint8 aMessageCount, TInt aId)
       
  2522 	{
       
  2523 	_LIT8(KFaxIndicationPdu, "440B916407586704F900002010011153710406040102810200");
       
  2524 	const TInt KIndicationPosition = 44;
       
  2525 	TBuf<KSmsDescriptionLength> desc;
       
  2526 
       
  2527 	//Replace the Message Indication in this PDU
       
  2528 	RMobileSmsMessaging::TMobileSmsGsmTpdu miPdu(KFaxIndicationPdu);
       
  2529 	_LIT8(KFormat, "%02X%02X");
       
  2530 	TPtr8 ptr(&miPdu[KIndicationPosition], 0, 4);
       
  2531 	ptr.AppendFormat(KFormat, aMessageType, aMessageCount);
       
  2532 
       
  2533 
       
  2534 	CSmsMessage* msg = CreateSmsMessageLC(miPdu);
       
  2535 	User::LeaveIfError(TSmsUtilities::GetDescription(*msg, desc));
       
  2536 	CleanupStack::PopAndDestroy(msg);
       
  2537 
       
  2538 	if (aMessageCount != 1)
       
  2539 		CheckDescriptionL(aResFile, aId, desc, aMessageCount);
       
  2540 	else
       
  2541 		CheckDescriptionL(aResFile, aId, desc);
       
  2542 	}
       
  2543 
       
  2544 void CSmutTest::CheckDescriptionL(RResourceFile& aResFile, TInt aId, TRefByValue<const TDesC> aDesc, ...)
       
  2545 	{
       
  2546 	const TDesC& ref = aDesc;
       
  2547 
       
  2548 	TBuf<256> resDesc;
       
  2549 	TBuf<256> resString;
       
  2550 
       
  2551 	VA_LIST list;
       
  2552 	VA_START(list, aDesc);
       
  2553 
       
  2554 	iSmsTest.ReadResourceStringL(aResFile, aId, resString);
       
  2555 	resDesc.AppendFormatList(resString, list);
       
  2556 
       
  2557 	if (ref != resDesc)
       
  2558 		{
       
  2559 		iSmsTest.Printf(_L("\tMISMATCH Desc \"%S\" Resource \"%S\"\n"), &ref, &resDesc);
       
  2560 		iSmsTest(EFalse);
       
  2561 		}
       
  2562 	}
       
  2563 
       
  2564 TBool CSmutTest::CheckSmsEntry(
       
  2565 							const TMsvSmsEntry& aEntry, 
       
  2566 							TBool aClassExpected, 
       
  2567 							TSmsDataCodingScheme::TSmsClass aClass, 
       
  2568 							TUint8 aPID, 
       
  2569 							TBool aUPI, 
       
  2570 							TMsvSmsEntry::TMsvSmsEntryAckSummary aDeliverySummary, 
       
  2571 							TBool aValidMessageId, 
       
  2572 							TInt32 aMessageId) const
       
  2573 	{
       
  2574 	TCompare retVal(ETrue);
       
  2575 
       
  2576 	TSmsDataCodingScheme::TSmsClass dummyClass;
       
  2577 
       
  2578 	retVal((aEntry.Class(dummyClass) && aClassExpected) || (!aEntry.Class(dummyClass) && !aClassExpected));
       
  2579 
       
  2580 	if (aClassExpected)
       
  2581 		retVal(dummyClass == aClass);
       
  2582 
       
  2583 	retVal(aEntry.ProtocolIdentifier() == aPID);
       
  2584 	retVal((aEntry.UserPromptIndicator() && aUPI) || (!aEntry.UserPromptIndicator() && !aUPI));
       
  2585 
       
  2586 	retVal(aEntry.AckSummary(ESmsAckTypeDelivery) == aDeliverySummary);
       
  2587 
       
  2588 	TInt32 dummyMessageId;
       
  2589 
       
  2590 	retVal( (aEntry.MessageId(dummyMessageId) && aValidMessageId) || (!aEntry.MessageId(dummyMessageId) && !aValidMessageId) );
       
  2591 	if( aValidMessageId )
       
  2592 		retVal( dummyMessageId == aMessageId );
       
  2593 
       
  2594 	return retVal;
       
  2595 	}
       
  2596 
       
  2597 void CSmutTest::TestSmsEntryL()
       
  2598 	{
       
  2599 	iSmsTest.Test().Next(_L("Testing TMsvSmsEntry"));
       
  2600 
       
  2601 	TMsvSmsEntry entry;
       
  2602 	iSmsTest(CheckSmsEntry(entry, EFalse, TSmsDataCodingScheme::ESmsClass0, 0, EFalse, TMsvSmsEntry::ENoAckSummary, EFalse, 0));
       
  2603 
       
  2604 	entry.SetUserPromptIndicator(ETrue);
       
  2605 	iSmsTest(CheckSmsEntry(entry, EFalse, TSmsDataCodingScheme::ESmsClass0, 0, ETrue, TMsvSmsEntry::ENoAckSummary, EFalse, 0));
       
  2606 
       
  2607 	entry.SetUserPromptIndicator(EFalse);
       
  2608 	iSmsTest(CheckSmsEntry(entry, EFalse, TSmsDataCodingScheme::ESmsClass0, 0, EFalse, TMsvSmsEntry::ENoAckSummary, EFalse, 0));
       
  2609 
       
  2610 	entry.SetProtocolIdentifier(123);
       
  2611 	iSmsTest(CheckSmsEntry(entry, EFalse, TSmsDataCodingScheme::ESmsClass0, 123, EFalse, TMsvSmsEntry::ENoAckSummary, EFalse, 0));
       
  2612 
       
  2613 	entry.SetProtocolIdentifier(100);
       
  2614 	entry.SetUserPromptIndicator(ETrue);
       
  2615 	iSmsTest(CheckSmsEntry(entry, EFalse, TSmsDataCodingScheme::ESmsClass0, 100, ETrue, TMsvSmsEntry::ENoAckSummary, EFalse, 0));
       
  2616 
       
  2617 	entry.SetClass(ETrue, TSmsDataCodingScheme::ESmsClass0);
       
  2618 	iSmsTest(CheckSmsEntry(entry, ETrue, TSmsDataCodingScheme::ESmsClass0, 100, ETrue, TMsvSmsEntry::ENoAckSummary, EFalse, 0));
       
  2619 
       
  2620 	entry.SetClass(ETrue, TSmsDataCodingScheme::ESmsClass1);
       
  2621 	iSmsTest(CheckSmsEntry(entry, ETrue, TSmsDataCodingScheme::ESmsClass1, 100, ETrue, TMsvSmsEntry::ENoAckSummary, EFalse, 0));
       
  2622 
       
  2623 	entry.SetClass(ETrue, TSmsDataCodingScheme::ESmsClass2);
       
  2624 	iSmsTest(CheckSmsEntry(entry, ETrue, TSmsDataCodingScheme::ESmsClass2, 100, ETrue, TMsvSmsEntry::ENoAckSummary, EFalse, 0));
       
  2625 	
       
  2626 	entry.SetClass(ETrue, TSmsDataCodingScheme::ESmsClass3);
       
  2627 	iSmsTest(CheckSmsEntry(entry, ETrue, TSmsDataCodingScheme::ESmsClass3, 100, ETrue, TMsvSmsEntry::ENoAckSummary, EFalse, 0));
       
  2628 
       
  2629 	entry.SetClass(EFalse);
       
  2630 	iSmsTest(CheckSmsEntry(entry, EFalse, TSmsDataCodingScheme::ESmsClass3, 100, ETrue, TMsvSmsEntry::ENoAckSummary, EFalse, 0));
       
  2631 
       
  2632 	entry.SetUserPromptIndicator(EFalse);
       
  2633 	iSmsTest(CheckSmsEntry(entry, EFalse, TSmsDataCodingScheme::ESmsClass3, 100, EFalse, TMsvSmsEntry::ENoAckSummary, EFalse, 0));
       
  2634 
       
  2635 	entry.SetClass(ETrue, TSmsDataCodingScheme::ESmsClass0);
       
  2636 	
       
  2637 	TInt classCounter, upiCounter, classDef, deliverySummary, messageIdValid;
       
  2638 	TSmsDataCodingScheme::TSmsClass tempClass;
       
  2639 	TMsvSmsEntry::TMsvSmsEntryAckSummary tempDelivery;
       
  2640 	TUint8 pidCounter;
       
  2641 	TInt32 messageId = 123456789;
       
  2642 
       
  2643 	for (classCounter = 0; classCounter < 4; classCounter++)
       
  2644 		{
       
  2645 		for (pidCounter = 0; pidCounter < 128; pidCounter++)
       
  2646 			{
       
  2647 			for (upiCounter = 0; upiCounter < 2; upiCounter++)
       
  2648 				{
       
  2649 				for (classDef = 0; classDef < 2; classDef++)
       
  2650 					{
       
  2651 					for( deliverySummary = 0; deliverySummary < 5; ++deliverySummary )
       
  2652 						{
       
  2653 						for( messageIdValid = 0; messageIdValid < 2; ++messageIdValid)
       
  2654 							{
       
  2655 							entry = TMsvSmsEntry();
       
  2656 							tempClass = static_cast<TSmsDataCodingScheme::TSmsClass>(classCounter);
       
  2657 							tempDelivery = static_cast<TMsvSmsEntry::TMsvSmsEntryAckSummary>(deliverySummary);
       
  2658 							entry.SetClass(classDef, tempClass);
       
  2659 							entry.SetProtocolIdentifier(pidCounter);
       
  2660 							entry.SetUserPromptIndicator(upiCounter);
       
  2661 							entry.SetAckSummary(ESmsAckTypeDelivery, tempDelivery);
       
  2662 							entry.SetMessageId(messageId, messageIdValid);
       
  2663 							iSmsTest(CheckSmsEntry(entry, classDef, tempClass, pidCounter, upiCounter, tempDelivery, messageIdValid, messageId));
       
  2664 							}
       
  2665 						}
       
  2666 					}
       
  2667 				}
       
  2668 			}
       
  2669 		}
       
  2670 	
       
  2671 	for (classCounter = 0; classCounter < 4; classCounter++)
       
  2672 		{
       
  2673 		for (pidCounter = 0; pidCounter < 128; pidCounter++)
       
  2674 			{
       
  2675 			for (upiCounter = 0; upiCounter < 2; upiCounter++)
       
  2676 				{
       
  2677 				for (classDef = 0; classDef < 2; classDef++)
       
  2678 					{
       
  2679 					for( deliverySummary = 0; deliverySummary < 5; ++deliverySummary )
       
  2680 						{
       
  2681 						for( messageIdValid = 0; messageIdValid < 2; ++messageIdValid)
       
  2682 							{
       
  2683 							tempClass = static_cast<TSmsDataCodingScheme::TSmsClass>(classCounter);
       
  2684 							tempDelivery = static_cast<TMsvSmsEntry::TMsvSmsEntryAckSummary>(deliverySummary);
       
  2685 							entry.SetClass(classDef, tempClass);
       
  2686 							entry.SetProtocolIdentifier(pidCounter);
       
  2687 							entry.SetUserPromptIndicator(upiCounter);
       
  2688 							entry.SetAckSummary(ESmsAckTypeDelivery, tempDelivery);
       
  2689 							entry.SetMessageId(messageId, messageIdValid);
       
  2690 							iSmsTest(CheckSmsEntry(entry, classDef, tempClass, pidCounter, upiCounter, tempDelivery, messageIdValid, messageId));
       
  2691 							}
       
  2692 						}
       
  2693 					}
       
  2694 				}
       
  2695 			}
       
  2696 		}
       
  2697 	}