pimappsupport/vcardandvcal/tsrc/toom.cpp
author Simon Howkins <simonh@symbian.org>
Mon, 22 Nov 2010 16:01:09 +0000
branchRCL_3
changeset 93 d216ae5a8733
parent 0 f979ecb2b13e
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
//

#include <e32std.h>
#include <e32test.h>

#include <versit.h>
#include <vcal.h>
#include <vcard.h>

#include <coreappstest/testserver.h>

_LIT(KTestName,"Versit OOM Tests");

LOCAL_D RFs fs;

LOCAL_D RTest test(KTestName);

_LIT8(KVCalendarAllMandatoryProperties,	
"BEGIN:VCALENDAR\r\n" 
"VERSION:1.0\r\n"
"BEGIN:VEVENT\r\n"
"CATEGORIES:APPOINTMENT;MEETING\r\n"
"SUMMARY:Meeting with SyncML team\r\n"
"DESCRIPTION:Check mandatory vCalendar compliance\r\n"
"DTSTART:20010316T170000Z\r\n"
"DTEND:20010316T180000Z\r\n"
"STATUS:NEEDS ACTION\r\n"
"X-EPOCAGENDAENTRYTYPE:APPOINTMENT\r\n"
//"AALARM:\r\n"
"AALARM:20010607T084500\r\n"
"AALARM;TYPE=X-EPOCSOUND:20000110T084500Z;;0;Chimes\r\n"
"END:VEVENT\r\n"
"BEGIN:VTODO\r\n"
"DESCRIPTION:To-do item\r\n"
"PRIORITY:1\r\n"
"DUE:20010316T000000Z\r\n"
"COMPLETED:20010314T000000Z\r\n"
//"RRULE:\r\n" Standard leave
"RRULE:D1 #0\r\n"
"RRULE:MD1 10+ #0\r\n"
"RRULE:MP1 2+ MO #0\r\n"
"RRULE:MP12 2+ MO #0\r\n"
"RRULE:W1 MO #0\r\n"
"RRULE:YM1 1 #0\r\n"
"RRULE:W2 SU TU TH SA 19991130T000000\r\n"
"RRULE:M1 19990821T000000\r\n" //invalid format from 9110
"CLASS:PUBLIC\r\n"
//"PRIORITY:\r\n" KErrNotFound
"PRIORITY:9\r\n"
"DCREATED:20000113T000000Z\r\n"
"LAST-MODIFIED:20000113T122400Z\r\n"
"UID:28\r\n"
"PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN\r\n"
"TRANSP:1\r\n"
"END:VTODO\r\n"
"END:VCALENDAR\r\n");

_LIT8(KVCardAllMandatoryProperties,
"BEGIN:VCARD\r\n"
"VERSION:2.1\r\n"
"REV:20010608T125751Z\r\n"
"TEL;CAR:\r\n"
"TEL;HOME;VOICE:\r\n"
"TEL;WORK;VOICE:\r\n"
"N:Contact;Starfish;;\r\n"
"NOTE:\r\n"
"TEL;PAGER:\r\n"
//"BDAY:\r\n" standard leave
"ADR;WORK:;;;;;;\r\n"
"ADR;HOME:;;;;;;\r\n"
"URL:\r\n"
"TEL;CELL:\r\n"
"TEL;FAX;HOME:\r\n"
"ORG:\r\n"
"EMAIL;INTERNET:\r\n"
"TEL;FAX;WORK:\r\n"
"END:VCARD\r\n");

_LIT(KVCalImportFileName,"c:\\oomvcal.vcs");
_LIT(KVCalExportFileName,"c:\\oomvcal2.vcs");
_LIT(KVCardImportFileName,"c:\\oomvcard.vcf");
_LIT(KVCardExportFileName,"c:\\oomvcard2.vcf");

/** Defines an interface for Versit OOM tests */
class MVersitOOMTest 
	{
public:
	virtual void DoTestL() = 0;
	};

/** versit alarm creation OOM test */
class CVersitAlarmCreateTest: public CBase, public MVersitOOMTest
	{
public:
	static CVersitAlarmCreateTest* NewLC();
	~CVersitAlarmCreateTest();
public: //From MVersitOOMTest
	void DoTestL();
private:
	CVersitAlarmCreateTest();
	};

/** vCalendar import OOM test */
class CVersitVCalImportTest : public CBase, public MVersitOOMTest
	{
public:
	static CVersitVCalImportTest* NewLC();
	~CVersitVCalImportTest();
public: //From MVersitOOMTest
	void DoTestL();
private:
	void CheckingImportResultL(CParserVCal& aVCalParser);
	CVersitVCalImportTest();
	};


/** vCalendar export OOM test */
class CVersitVCalExportTest : public CBase, public MVersitOOMTest
	{
public:
	static CVersitVCalExportTest* NewLC();
	~CVersitVCalExportTest();
public: //From MVersitOOMTest
	void DoTestL();
private:
	CVersitVCalExportTest();
	};


/** vCard import OOM test */
class CVersitVCardImportTest : public CBase, public MVersitOOMTest
	{
public:
	static CVersitVCardImportTest* NewLC();
	~CVersitVCardImportTest();
public: //From MVersitOOMTest
	void DoTestL();
private:
	CVersitVCardImportTest();
	};

/** vCard export OOM test */
class CVersitVCardExportTest : public CBase, public MVersitOOMTest
	{
public:
	static CVersitVCardExportTest* NewLC();
	~CVersitVCardExportTest();
public: //From MVersitOOMTest
	void DoTestL();
private:
	CVersitVCardExportTest();
	};

// Cleanup callback for versit entities.
GLREF_C void ResetAndDestroyArrayOfEntities(TAny* aObject)
	{
	CArrayPtr<CVersitParser>* array=REINTERPRET_CAST(CArrayPtr<CVersitParser>*,aObject);
	if (array)
		array->ResetAndDestroy();
	delete array;
	}

CVersitAlarmCreateTest* CVersitAlarmCreateTest::NewLC()
	{
	CVersitAlarmCreateTest* self = new(ELeave) CVersitAlarmCreateTest;
	CleanupStack::PushL(self);
	return self;	
	}

void CVersitAlarmCreateTest::DoTestL()
	{
	TDateTime date(2001,ENovember,1,0,15,0,0);
	TVersitDateTime* runtime = new(ELeave) TVersitDateTime(date, TVersitDateTime::EIsMachineLocal);
	CleanupStack::PushL(runtime);
	CVersitAlarm* alarm = CVersitAlarm::NewL(runtime,0,0,_L("Fanfare"),KNullDesC);
	CleanupStack::Pop(runtime);
	delete alarm;
	}

CVersitAlarmCreateTest::~CVersitAlarmCreateTest()
	{
	}

CVersitAlarmCreateTest::CVersitAlarmCreateTest()
	{
	}

CVersitVCalImportTest* CVersitVCalImportTest::NewLC()
	{
	CVersitVCalImportTest* self = new(ELeave) CVersitVCalImportTest;
	CleanupStack::PushL(self);
	return self;
	}

void CVersitVCalImportTest::DoTestL()
	{
	CParserVCal* parser = CParserVCal::NewL();
	CleanupStack::PushL(parser);
	RFile infile;
	User::LeaveIfError(infile.Open(fs,KVCalImportFileName,EFileRead));
	CleanupClosePushL(infile);
	RFileReadStream readStream(infile);
	CleanupClosePushL(readStream);
	parser->InternalizeL(readStream);
	CheckingImportResultL(*parser);
	CleanupStack::PopAndDestroy(3);
	}

void CVersitVCalImportTest::CheckingImportResultL(CParserVCal& aVCalParser)
	{
	//Test get entities and properties without taking ownership
	CArrayPtr<CVersitParser>* entities = aVCalParser.EntityL(KVersitVarTokenVTODO,EFalse);	
	test(entities != NULL);
	CleanupStack::PushL(entities);
	CArrayPtr<CParserProperty>* properties = (*entities)[0]->PropertyL(KVersitTokenRRULE, TUid::Uid(KVCalPropertyRecurrenceUid), EFalse);
	test(properties != NULL);
	delete properties;
	CleanupStack::PopAndDestroy(entities);
		
	//Test get entities and properties with taking ownership
	entities = aVCalParser.EntityL(KVersitVarTokenVEVENT,ETrue);
	test(entities != NULL);
	CleanupStack::PushL(TCleanupItem(ResetAndDestroyArrayOfEntities, entities));
	properties = (*entities)[0]->PropertyL(KVersitTokenCATEGORIES, TUid::Uid(KVersitPropertyCDesCArrayUid), ETrue);
	test(properties != NULL);
	properties->ResetAndDestroy();
	delete properties;
	CleanupStack::PopAndDestroy(entities);
	}

CVersitVCalImportTest::CVersitVCalImportTest()
	{
	}

CVersitVCalImportTest::~CVersitVCalImportTest()
	{
	}

CVersitVCalExportTest* CVersitVCalExportTest::NewLC()
	{
	CVersitVCalExportTest* self = new(ELeave) CVersitVCalExportTest;
	CleanupStack::PushL(self);
	return self;
	}

CVersitVCalExportTest::~CVersitVCalExportTest()
	{
	}

void CVersitVCalExportTest::DoTestL()
	{
	CParserVCal* parser = CParserVCal::NewL();
	CleanupStack::PushL(parser);
	CParserVCalEntity* entity =  CParserVCalEntity::NewL();	
	CleanupStack::PushL(entity);
	entity->SetEntityNameL(KVersitVarTokenVEVENT);

	TInt KUidValue=0;
	CParserPropertyValueInt* intValue= new(ELeave) CParserPropertyValueInt(KUidValue);
	CleanupStack::PushL(intValue);
	CParserProperty* UIDprop = CParserProperty::NewL(*intValue, KVersitTokenUID, NULL);  
	CleanupStack::Pop(intValue);	
	entity->AddPropertyL(UIDprop);
	
	_LIT(KVCalDescription,"Small devices come in many shapes and sizes");
	CParserPropertyValueHBufC* hbufValue = CParserPropertyValueHBufC::NewL(KVCalDescription);
	CleanupStack::PushL(hbufValue);
	CParserProperty* DESCRIPTIONprop = CParserProperty::NewL(*hbufValue, KVersitTokenDESCRIPTION, NULL);
	CleanupStack::Pop(hbufValue);
	entity->AddPropertyL(DESCRIPTIONprop);

	CleanupStack::Pop(entity);
	parser->AddEntityL(entity);

	RFile outfile;
	User::LeaveIfError(outfile.Replace(fs,KVCardExportFileName,EFileWrite));
	CleanupClosePushL(outfile);
	RFileWriteStream writeStream(outfile);
	CleanupClosePushL(writeStream);
	parser->ExternalizeL(writeStream);
	CleanupStack::PopAndDestroy(3);
	}

CVersitVCalExportTest::CVersitVCalExportTest()
	{
	}

CVersitVCardImportTest* CVersitVCardImportTest::NewLC()
	{
	CVersitVCardImportTest* self = new(ELeave) CVersitVCardImportTest;
	CleanupStack::PushL(self);
	return self;
	}

void CVersitVCardImportTest::DoTestL()
	{
	CParserVCard* parser = CParserVCard::NewL();
	CleanupStack::PushL(parser);
	RFile infile;
	User::LeaveIfError(infile.Open(fs,KVCardImportFileName,EFileRead));
	CleanupClosePushL(infile);
	RFileReadStream readStream(infile);
	CleanupClosePushL(readStream);
	parser->InternalizeL(readStream);
	CleanupStack::PopAndDestroy(3);
	}

CVersitVCardImportTest::CVersitVCardImportTest()
	{
	}

CVersitVCardImportTest::~CVersitVCardImportTest()
	{
	}

CVersitVCardExportTest* CVersitVCardExportTest::NewLC()
	{
	CVersitVCardExportTest* self = new(ELeave) CVersitVCardExportTest;
	CleanupStack::PushL(self);
	return self;
	}

CVersitVCardExportTest::~CVersitVCardExportTest()
	{
	}

void CVersitVCardExportTest::DoTestL()
	{
	CParserVCard* parser = CParserVCard::NewL();
	CleanupStack::PushL(parser);

	TTime lastModified;
	lastModified.UniversalTime();
	TVersitDateTime* dateTime=new(ELeave)TVersitDateTime(lastModified.DateTime(),TVersitDateTime::EIsMachineLocal);
	CleanupStack::PushL(dateTime);
	CParserPropertyValueDateTime* valueDateTime=new(ELeave) CParserPropertyValueDateTime(dateTime);
	CleanupStack::Pop(dateTime);	
	CleanupStack::PushL(valueDateTime);
	CParserGroupedProperty* property=CParserGroupedProperty::NewL(*valueDateTime,KVersitTokenREV,NULL,NULL);
	CleanupStack::Pop(valueDateTime);
	parser->AddPropertyL(property);
	
	RFile outfile;
	User::LeaveIfError(outfile.Replace(fs,KVCalExportFileName,EFileWrite));
	CleanupClosePushL(outfile);
	RFileWriteStream writeStream(outfile);
	CleanupClosePushL(writeStream);
	parser->ExternalizeL(writeStream);
	CleanupStack::PopAndDestroy(3);
	}

CVersitVCardExportTest::CVersitVCardExportTest()
	{
	}

void runOOMTestL(MVersitOOMTest& aTest)
	{
	TInt ret=KErrNoMemory;
	TInt failAt=0;
	while (ret!=KErrNone)
		{
		failAt++;
		TBuf<200>indicator;
		indicator.Format(_L("Memory fail at \t%d\x0d\x0a"),failAt);
		if(failAt%100==0)
			test.Printf(indicator);
		__UHEAP_SETFAIL(RHeap::EDeterministic,failAt);
		__UHEAP_MARK;			
		TRAP(ret, aTest.DoTestL());
		__UHEAP_MARKEND;
		__UHEAP_RESET;
		if (ret!=KErrNoMemory&&ret!=KErrNone)
			{
			test.Printf(_L("Non standard error: %d\n"),ret);
			test.Getch();
			}
		test(ret==KErrNoMemory||ret==KErrNone);
		}
	}

LOCAL_C void ExpandCleanupStackL()
	{
	// reserve some space on the cleanup stack:
	{for (TInt ii=0;ii<1000;++ii)
		CleanupStack::PushL(&ii);}
	CleanupStack::Pop(1000);
	}
void createTestFilesL()
	{
	RFile file;
	TInt err=file.Replace(fs,KVCalImportFileName, EFileWrite+EFileShareAny+EFileStreamText);
	User::LeaveIfError(err);
	file.Write(KVCalendarAllMandatoryProperties);
	file.Close();

	err=file.Replace(fs,KVCardImportFileName, EFileWrite+EFileShareAny+EFileStreamText);
	User::LeaveIfError(err);
	file.Write(KVCardAllMandatoryProperties);
	file.Close();
	}

/**
@SYMTestCaseID PIM-TOOM-0001
*/	
void runOOMTestsL()
	{
	User::LeaveIfError(fs.Connect());
	CleanupClosePushL(fs);	

	CTestRegister* TempFiles = CTestRegister::NewLC();
	TempFiles->RegisterL(KVCalImportFileName);
	TempFiles->RegisterL(KVCalExportFileName);
	TempFiles->RegisterL(KVCardImportFileName);
	TempFiles->RegisterL(KVCardExportFileName);

	test.Start(_L("@SYMTestCaseID PIM-TOOM-0001 Test One"));
	createTestFilesL();
	ExpandCleanupStackL();

	_LIT(KTestvCalImport,"vCal Import Test\n");
	test.Printf(KTestvCalImport);
	CVersitVCalImportTest* oomtest1 = CVersitVCalImportTest::NewLC();
	runOOMTestL(*oomtest1);
	CleanupStack::PopAndDestroy(oomtest1);
	
	_LIT(KTestvCardImport,"vCard Import Test\n");
	test.Printf(KTestvCardImport);
	CVersitVCardImportTest* oomtest2 = CVersitVCardImportTest::NewLC();
	runOOMTestL(*oomtest2);
	CleanupStack::PopAndDestroy(oomtest2);

	_LIT(KTestvCalExport,"vCal Export Test\n");
	test.Printf(KTestvCalExport);
	CVersitVCalExportTest* oomtest3 = CVersitVCalExportTest::NewLC();
	runOOMTestL(*oomtest3);
	CleanupStack::PopAndDestroy(oomtest3);

	_LIT(KTestvCardExport,"vCard Export Test\n");
	test.Printf(KTestvCardExport);
	CVersitVCardExportTest* oomtest4 = CVersitVCardExportTest::NewLC();
	runOOMTestL(*oomtest4);
	CleanupStack::PopAndDestroy(oomtest4);
	
	_LIT(KTestVersitAlarm,"Versit Alarm OOM Test\n");
	test.Printf(KTestVersitAlarm);
	CVersitAlarmCreateTest* oomtest5 = CVersitAlarmCreateTest::NewLC();
	runOOMTestL(*oomtest5);
	CleanupStack::PopAndDestroy(oomtest5);
	
	test.End();
	test.Close();
	CleanupStack::PopAndDestroy(2); // TempFiles, fs
	}

GLDEF_C TInt E32Main()
	{	
	
	TTime startTime;
	startTime.UniversalTime();
	
	__UHEAP_MARK;

	CTrapCleanup* theCleanup=CTrapCleanup::New();
	TRAPD(ret,runOOMTestsL());
	test(ret==KErrNone);
	delete theCleanup;	

	__UHEAP_MARKEND;
	
	TTime finishTime;
	finishTime.UniversalTime();
	TReal elapsed = (TReal)finishTime.MicroSecondsFrom(startTime).Int64();
	test.Printf(_L("Elapsed time: %.4f\n"), elapsed/1000000);
	
	return(KErrNone);
	}