pimappsupport/vcardandvcal/tsrc/tvgen.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) 1999-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:
// Versit tests
// 
//

// System includes
#include <bautils.h>
#include <e32test.h>
#include <s32file.h>
#include <e32math.h>
#include <versit.h>
#include <vprop.h>
#include <vuid.h>
#include <vcard.h>
#include <vcal.h>

// User includes
#include "thelpers.h"

//
// STRUCTS
//
struct TPropertyDef
	{
	HBufC8*				iPropertyName;
	TInt				iNumberOfValuesExpected;		// only used by array items
	TUint32				iType;
	};


struct TPropertyParameterDef
	{
	HBufC8*				iParameterName;
	HBufC8*				iParameterValue;
	};


//
// GLOBAL DATA
//
LOCAL_D RTest									gTest(_L("TVERSIT2"));
LOCAL_D CTrapCleanup*							gCleanup;
LOCAL_D RFs										gFsSession;

LOCAL_D CArrayFixFlat<TPropertyParameterDef>*	gParameterDefinitions;
LOCAL_D CArrayFixFlat<TPropertyDef>*			gPropertyDefinitions;

LOCAL_D CArrayFixFlat<TDateTime>*				gDateTimeArray;
LOCAL_D CDesCArrayFlat*							gTextArray;

LOCAL_D TInt64									gSeed;


//
// vCard files & directories needed for this test code
//

// Source vCards that are randomly generated by this code - they are written in this directory
// for reference (this is the output exactly as it was generated)
_LIT(KDirRandomlyGeneratedOut,			"C:\\vCards\\RandomlyGenerated\\Original\\");

// This is the the vCard ouput that has been read in from the directory above and then
// written back out to file without any modifications. They should theoretically be identical
// (except any CHARSET parameters are removed, as this means that the original and newly created
// vCard may potentially be encoded in different ways making comparison difficult).
_LIT(KDirRandomlyGeneratedIn,			"C:\\vCards\\RandomlyGenerated\\ReadInAndThenWrittenOut\\");

// This is the name of the vCard generated to be unique in the directory.
_LIT(KNameGeneratedVCardName,			"vCard_for_test_%d");
_LIT(KNameGeneratedVCardExtension,		".vcf");
_LIT(KNameDeleteFileSpec,				"*.vcf");

// This is the name of the log file generated for errors 
_LIT(KNameErrorLogfile,"c:\\tvgen.log");

//
// Other contants
//
_LIT(KFailureDescription,		"Failed on %S tag\n");
_LIT(KTestIndicator,			"Test [%d] about to commence\n");
_LIT(KTestIndicatorSeparator,	"=================================\n\n");
const TInt KMinNumberOfTestsToPerform = 100;
const TInt KMaxNumberOfTestsToPerform = 100;


//****************************************************************************************
LOCAL_C void CreateArraysL()
	{
	gParameterDefinitions	= new(ELeave) CArrayFixFlat<TPropertyParameterDef>(10);
	gPropertyDefinitions	= new(ELeave) CArrayFixFlat<TPropertyDef>(10);
	gTextArray				= new(ELeave) CDesCArrayFlat(10);
	gDateTimeArray			= new(ELeave) CArrayFixFlat<TDateTime>(10);
	}


//****************************************************************************************
LOCAL_C void DestroyArraysL()
	{
	TInt count = gParameterDefinitions->Count();
	for(TInt i=0; i<count; i++)
		{
		TPropertyParameterDef& def = gParameterDefinitions->At(i);
		delete def.iParameterName;	def.iParameterName = NULL;
		delete def.iParameterValue;	def.iParameterValue= NULL;
		}

	count = gPropertyDefinitions->Count();
	for(TInt j=0; j<count; j++)
		{
		TPropertyDef& def = gPropertyDefinitions->At(j);
		delete def.iPropertyName;	def.iPropertyName = NULL;
		}

	delete gPropertyDefinitions;
	delete gParameterDefinitions;
	delete gTextArray;
	delete gDateTimeArray;
	}


//****************************************************************************************
LOCAL_C void CreatePropertyParamL(const TDesC8& aParamName, const TDesC8& aParamValue)
	{
	TInt amountToPop = 1;
	TPropertyParameterDef def;
	def.iParameterName			= aParamName.AllocL();
	CleanupStack::PushL(def.iParameterName);

	if	(aParamValue.Length())
		{
		def.iParameterValue		= aParamValue.AllocL();
		CleanupStack::PushL(def.iParameterValue);
		amountToPop = 2;
		}
	else
		def.iParameterValue = NULL;

	gParameterDefinitions->AppendL(def);
	
	CleanupStack::Pop(amountToPop);
	}


//****************************************************************************************
LOCAL_C void CreatePropertyDefinitionL(const TDesC8& aName, TUint32 aExpectedType, TInt aValueCount)
	{
	TPropertyDef def;
	def.iNumberOfValuesExpected	= aValueCount;
	def.iType					= aExpectedType;
	def.iPropertyName			= aName.AllocL();
	CleanupStack::PushL(def.iPropertyName);
	gPropertyDefinitions->AppendL(def);
	CleanupStack::Pop();
	}


//****************************************************************************************
LOCAL_C TBool CheckWhetherPropertyAlreadyExistsL(CVersitParser* aParser, const TDesC8& aPropertyName)
	{
	CArrayPtr<CParserProperty>* propertyArray = aParser->ArrayOfProperties(EFalse); // don't take ownership
	if	(!propertyArray)
		return EFalse;
	
	const TInt count = propertyArray->Count();
	for(TInt i=0; i<count; i++)
		{
		if	(propertyArray->At(i)->Name() == aPropertyName)
			return ETrue;
		}
	return EFalse;
	}


//****************************************************************************************
LOCAL_C void CreatePropertyValuesL()
	{
	// Simple text items
	gTextArray->AppendL(_L("symbian.foundation@exp.example.test"));
	gTextArray->AppendL(_L("me@here.com"));
	gTextArray->AppendL(_L("this@there.com"));
	gTextArray->AppendL(_L("1 Example Road Example Town ZZ99 EXP"));
	gTextArray->AppendL(_L("Somewhere Road Example Town ZZ99 EXP"));
	gTextArray->AppendL(_L("wibble"));
	gTextArray->AppendL(_L("@@me@@here@@.com"));
	gTextArray->AppendL(_L("01632 575 24211 10"));
	gTextArray->AppendL(_L("5757847=====d98==y"));
	gTextArray->AppendL(_L("@@me@@here@@.com"));
	gTextArray->AppendL(_L("01632 575==24211"));
	gTextArray->AppendL(_L("557895789æ?øö!¦µØ"));
	gTextArray->AppendL(_L("item1"));
	gTextArray->AppendL(_L("item2"));
	gTextArray->AppendL(_L("item3"));
	gTextArray->AppendL(_L("item4"));
	gTextArray->AppendL(_L("item5"));
	gTextArray->AppendL(_L("Some house"));
	gTextArray->AppendL(_L("called some name"));
	gTextArray->AppendL(_L("at some address"));
	gTextArray->AppendL(_L("in this place"));
	gTextArray->AppendL(_L("UK"));
	gTextArray->AppendL(_L("testing multi"));
	gTextArray->AppendL(_L("lines of text"));
	gTextArray->AppendL(_L("addresses"));
	gTextArray->AppendL(_L("with post;code"));
	gTextArray->AppendL(_L("Firstname"));
	gTextArray->AppendL(_L("Lastname"));
	gTextArray->AppendL(_L("namefirst"));
	gTextArray->AppendL(_L("namelast"));
	gTextArray->AppendL(_L("246256265"));
	gTextArray->AppendL(_L("/3/3/3/3"));
	gTextArray->AppendL(_L("+=+=+==="));
	gTextArray->AppendL(_L("+1+1=244=]1/2234"));

	// Date items
	TDateTime time(1999, EOctober, 15, 12, 53, 0, 0);
	gDateTimeArray->AppendL(time);
	time.SetYear(2000); time.SetMonth(EJanuary); time.SetDay(2);
	gDateTimeArray->AppendL(time);
	time.SetYear(1); time.SetMonth(EAugust); time.SetDay(10);
	gDateTimeArray->AppendL(time);
	time.SetYear(9999); time.SetMonth(EDecember); time.SetDay(20);
	gDateTimeArray->AppendL(time);

	// Date Time
	TDateTime time2(1999, EOctober, 15, 12, 53, 0, 0);
	gDateTimeArray->AppendL(time2);
	time2.SetYear(2000); time2.SetHour(18); time2.SetMonth(EJanuary);
	gDateTimeArray->AppendL(time2);
	time2.SetYear(1); time2.SetHour(0); time2.SetMonth(EJanuary); time2.SetMinute(1);
	gDateTimeArray->AppendL(time2);
	time2.SetYear(9999); time2.SetHour(23); time2.SetMinute(59); time2.SetSecond(59);
	gDateTimeArray->AppendL(time2);
	}


//****************************************************************************************
LOCAL_C void CreatePropertyParametersL()
	{
	// Misc params
	CreatePropertyParamL(_L8("WORK"), _L8(""));
	CreatePropertyParamL(_L8("HOME"), _L8(""));
	CreatePropertyParamL(_L8("INTERNET"), _L8(""));
	CreatePropertyParamL(_L8("DEFAULT"), _L8(""));
	CreatePropertyParamL(_L8("FAX"), _L8(""));
	CreatePropertyParamL(_L8("CELL"), _L8(""));
	CreatePropertyParamL(_L8("VOICE"), _L8(""));
	CreatePropertyParamL(_L8("MOBILE"), _L8(""));
	CreatePropertyParamL(_L8("PARCEL"), _L8(""));
	CreatePropertyParamL(_L8("AVI"), _L8(""));
	CreatePropertyParamL(_L8("MPEG"), _L8(""));
	CreatePropertyParamL(_L8("GIF"), _L8(""));

	/*
	CreatePropertyParamL(_L("ENCODING"), _L("8-BIT"));
	CreatePropertyParamL(_L("ENCODING"), _L("BASE64"));
	CreatePropertyParamL(_L("ENCODING"), _L("QUOTED-PRINTABLE"));
	CreatePropertyParamL(_L("CHARSET"), _L("UTF-8"));
	CreatePropertyParamL(_L("CHARSET"), _L("UTF-7"));
	CreatePropertyParamL(_L("CHARSET"), _L("ISO-8859-1"));
	CreatePropertyParamL(_L("CHARSET"), _L("ISO-8859-2"));
	CreatePropertyParamL(_L("CHARSET"), _L("ISO-8859-5"));
	CreatePropertyParamL(_L("CHARSET"), _L("ISO-8859-9"));
	*/

	CreatePropertyParamL(_L8("CHARSET"), _L8("ASCII"));
	CreatePropertyParamL(_L8("LANGUAGE"), _L8("en"));
	CreatePropertyParamL(_L8("LANGUAGE"), _L8("fr-CA"));

	// Epoc extended labels
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("Misc"));
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("Wibble"));
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("Wobble"));
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("This"));
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("That"));
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("Work address"));
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("Home address"));
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("Moble phone"));
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("Epoc"));
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("Symbian"));
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("Psion"));
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("Palm"));
	CreatePropertyParamL(_L8("X-EPOCCNTMODELFIELDLABEL"), _L8("App Engines"));
	}


//****************************************************************************************
LOCAL_C void CreatePropertyDefinitionsL()
	{	
	CreatePropertyDefinitionL(_L8("FN"),			KVersitPropertyHBufCUid,		1);
	CreatePropertyDefinitionL(_L8("N"),			KVersitPropertyCDesCArrayUid,	2);
	CreatePropertyDefinitionL(_L8("ADR"),		KVersitPropertyCDesCArrayUid,	5);
	CreatePropertyDefinitionL(_L8("TITLE"),		KVersitPropertyHBufCUid,		1);
	CreatePropertyDefinitionL(_L8("TEL"),		KVersitPropertyHBufCUid,		1);
	CreatePropertyDefinitionL(_L8("EMAIL"),		KVersitPropertyHBufCUid,		1);
	CreatePropertyDefinitionL(_L8("ROLE"),		KVersitPropertyHBufCUid,		1);
	CreatePropertyDefinitionL(_L8("LABEL"),		KVersitPropertyHBufCUid,		1);
	CreatePropertyDefinitionL(_L8("URL"),		KVersitPropertyHBufCUid,		1);
	CreatePropertyDefinitionL(_L8("ORG"),		KVersitPropertyCDesCArrayUid,	1);
	CreatePropertyDefinitionL(_L8("BDAY"),		KVersitPropertyDateUid,			1);
	CreatePropertyDefinitionL(_L8("NOTE"),		KVersitPropertyHBufCUid,		1);
	CreatePropertyDefinitionL(_L8("VERSION"),	KVersitPropertyHBufCUid,		1);
	CreatePropertyDefinitionL(_L8("REV"),		KVersitPropertyDateTimeUid,		1);
	}


//****************************************************************************************
LOCAL_C void CreateUserDefinedPropertyDefinitionsL()
	{	
	CreatePropertyDefinitionL(_L8("X-WVID"),			KVersitPropertyHBufCUid,		1);
	CreatePropertyDefinitionL(_L8("X-MYPROP"),			KVersitPropertyHBufCUid,		1);	
	}

//****************************************************************************************
LOCAL_C CParserPropertyValue* GetRandomPropertyValueL(TUint32 aType, TInt aNumberOfValues /*for array parameters*/)
	{
	TInt randomIndex = KErrNotFound;
	switch (aType)
		{
		case KVersitPropertyHBufCUid:
			{
			randomIndex = VTestHelpers::MakeRandomNumber(0, gTextArray->Count()-1, gSeed);
			return VTestHelpers::CreateTextPropertyValueL((*gTextArray)[randomIndex]);
			}

		case KVersitPropertyDateTimeUid:
			{
			randomIndex = VTestHelpers::MakeRandomNumber(0, gDateTimeArray->Count()-1, gSeed);
			return VTestHelpers::CreateDateTimePropertyValueL((*gDateTimeArray)[randomIndex]);
			}

		case KVersitPropertyDateUid:
			{
			randomIndex = VTestHelpers::MakeRandomNumber(0, gDateTimeArray->Count()-1, gSeed);
			return VTestHelpers::CreateDatePropertyValueL((*gDateTimeArray)[randomIndex]);
			}

		case KVersitPropertyCDesCArrayUid:
			{
			CDesCArray* array = NULL;
			if (aNumberOfValues>0)
				array = new(ELeave) CDesCArrayFlat(5);
			TInt length=0;
			TBool addSpace;
			for(TInt i=0; i<aNumberOfValues; i++)
				{
				randomIndex = VTestHelpers::MakeRandomNumber(0, gTextArray->Count()-1, gSeed);
				length+=(*gTextArray)[randomIndex].Length();
				addSpace=(length>15);
				if (addSpace)
					length=0;
				VTestHelpers::CreateDescriptorArrayL((*gTextArray)[randomIndex], array, addSpace);
				}
			CParserPropertyValueCDesCArray* propertyValue = VTestHelpers::CreateArrayPropertyValueL(array);
			return propertyValue;
			}

		default:
			User::Panic(_L("TVGen"), 0);
			return NULL; // never reached
		}
	}


//****************************************************************************************
LOCAL_C CVersitParser* CreateVCardObjectLC()
	{
	// Crete vCard object

	CVersitParser* parser = CParserVCard::NewL();
	CleanupStack::PushL(parser);

	const TInt KRandomNumberOfProperties = VTestHelpers::MakeRandomNumber(4, gPropertyDefinitions->Count()-1, gSeed);
	const TInt maxLineLength=KMaxExternalizedTokenLength/3+1;
	const TInt maxLineLength2=KMaxExternalizedTokenLength/2;
	TInt lineLength=0;		//To stop a warning

	for(TInt i=0; i<KRandomNumberOfProperties; i++)
		{
		// First of all pick a random property name from the property name array...
		TInt randomNameIndex = -1;
		TBool propertyIsValid = EFalse;
		for(TInt j=0; j<gPropertyDefinitions->Count(); j++)
			{
			randomNameIndex = VTestHelpers::MakeRandomNumber(0, gPropertyDefinitions->Count()-1, gSeed); 
			TPtrC8 name(*gPropertyDefinitions->At(randomNameIndex).iPropertyName);
			if	(!CheckWhetherPropertyAlreadyExistsL(parser, name))
				{
				propertyIsValid = ETrue;
				lineLength=name.Length()+1;
				break;
				}
			}

		if	(!propertyIsValid)
			return parser; // no more unique properties to be added

		// We've now established that "name" is unique in the current list of properties, so the 
		// next step is to populate this property with random parameter data...
		TInt randomNumberOfParametersToAdd = VTestHelpers::MakeRandomNumber(0, gParameterDefinitions->Count()-1, gSeed);
		CArrayPtr<CParserParam>* arrayOfParams = NULL;
		if	(randomNumberOfParametersToAdd)
			{
			arrayOfParams = new(ELeave) CArrayPtrFlat<CParserParam>(randomNumberOfParametersToAdd);
			CleanupStack::PushL(arrayOfParams);
			}
		TInt oldLineLength;
		for(TInt k=0; k<randomNumberOfParametersToAdd && lineLength<maxLineLength; k++)
			{
			// Get a random property
			TPropertyParameterDef def = gParameterDefinitions->At(VTestHelpers::MakeRandomNumber(0, gParameterDefinitions->Count()-1, gSeed));
			
			// Check whether this property has already been added
			if	(VTestHelpers::DoesParameterAlreadyExist(arrayOfParams, *def.iParameterName))
				continue; // get another param as this one is already been added to the array

			//CParserParam* param = CParserParam::NewL(*def.iParameterName,def.iParameterValue);
			TPtr8 value(NULL,0);
			oldLineLength=lineLength;
			lineLength+=def.iParameterName->Length()+1;
			if (def.iParameterValue)
				{
				value.Set(def.iParameterValue->Des());
				lineLength+=def.iParameterValue->Length()+1;
				}
			if (lineLength>maxLineLength2)
				{
				lineLength=oldLineLength;
				continue;
				}
			CParserParam* param = CParserParam::NewL(*def.iParameterName,value);
			CleanupStack::PushL(param);
			arrayOfParams->AppendL(param);
			CleanupStack::Pop();
			}


		// Now generate a suitable property name & value pair for this property
		TPropertyDef def			= gPropertyDefinitions->At(randomNameIndex);
		CParserPropertyValue* value	= GetRandomPropertyValueL(def.iType, def.iNumberOfValuesExpected);
		CParserProperty* property	= CParserProperty::NewL(*value, *def.iPropertyName, arrayOfParams);
		parser->AddPropertyL(property); // will push on the cleanupstack and then pop off if no problem... odd, but thats the way it was written!

		if	(randomNumberOfParametersToAdd)
			CleanupStack::Pop(); // arrayOfParams
		}

	return parser;
	}


void DoWriteVCardToFileL(CVersitParser* aParserObject, const TDesC& aFileName)
	{
	RFile outputFile;
	User::LeaveIfError(outputFile.Replace(gFsSession, aFileName, EFileShareExclusive | EFileStream | EFileWrite));
	aParserObject->ExternalizeL(outputFile);
	outputFile.Close();
	}

void WriteVCardToFile(CVersitParser* aParserObject, TInt aTestNumber, TDes& aFileName)
	{
	const TUint KAppendChar = '_';

	// Generate the first bit of a unique filename
	TInt repetitions = 0;
	TFileName out;
	do
		{
		aFileName.Format(KNameGeneratedVCardName, aTestNumber);
		aFileName.AppendFill(KAppendChar, repetitions++);
		aFileName += KNameGeneratedVCardExtension;
		out += KDirRandomlyGeneratedOut;
		out += aFileName;
		} while(BaflUtils::FileExists(gFsSession, out));

	DoWriteVCardToFileL(aParserObject, out);

	// At this point we need to remove all ocurrances of the CHARSET tag as this messes
	// up the comparison when the text is written to file and then streamed in again later.

	CArrayPtr<CParserProperty>* properties = aParserObject->ArrayOfProperties(EFalse);
	TInt propCount = properties->Count();
	for(TInt i=0; i<propCount; i++)
		{
		STATIC_CAST(CParserPropertyWithoutCharsetTags*, properties->At(i))->RemoveAllCharsetTagsFromParametersL();
		}

	DoWriteVCardToFileL(aParserObject, _L("C:\\Test.vcf"));
	}


CVersitParser* ReadVCardFromFileLC(const TDesC& aFileName)
	{
	// Read in the written out file and then write it out straight away so that a comparison
	// may be made manually if required.
	// Then read in the 
	TFileName file(KDirRandomlyGeneratedOut);
	file += aFileName;

	TInt bytesThroughFile = 0;
	RFile inputFile;
	User::LeaveIfError(inputFile.Open(gFsSession, file, EFileShareReadersOnly | EFileStream | EFileRead));

	CVersitParser* readParser = CParserVCard::NewL();
	CleanupStack::PushL(readParser);
	readParser->InternalizeL(inputFile, bytesThroughFile);
	inputFile.Close();

	file  = KDirRandomlyGeneratedIn;
	file += aFileName;
	DoWriteVCardToFileL(readParser, file);

	return readParser;
	}


TBool CreateVCardL(TInt aTestNumber, TFileText& aLogFile)
	{
	// Create a fully populated vCard.
	CVersitParser* parser = CreateVCardObjectLC();

	// Write the vCard to a file whilst obtaining the filename of the file written to
	TFileName file;
	WriteVCardToFile(parser, aTestNumber, file);

	// Read the vCard from a file
	CVersitParser* readParser = ReadVCardFromFileLC(file);

	// Get a list of properties read from the file and from the artifically created vCard
	CArrayPtr<CParserProperty>*	readProperties	= readParser->ArrayOfProperties(EFalse);
	CArrayPtr<CParserProperty>*	properties		= parser->ArrayOfProperties(EFalse);

	// Test that the property count is the same
	TInt count = readProperties->Count();
	gTest(count == properties->Count());

	// Compare the properties one by one
	TBool passedTest = ETrue;
	for(TInt i=0; i<count; i++)
		{
		CComparitorParserProperty* property = STATIC_CAST(CComparitorParserProperty*, properties->At(i));
		CComparitorParserProperty* readProperty = STATIC_CAST(CComparitorParserProperty*, readProperties->At(i));
		if (!property->IsEqualL(readProperty))
			{
			passedTest=EFalse;
			TPtrC8 propertyName = property->Name();
			gTest.Printf(KFailureDescription, &propertyName);
			// write to log file
			TBuf<128> error;
			error.Format(_L("Test %d failed on property %S\r"),aTestNumber,&propertyName);
			aLogFile.Write(error);
			}
		}
	
	if (passedTest)
		{
		TBuf<32> success;
		success.Format(_L("Test %d passed\r"),aTestNumber);
		aLogFile.Write(success);
		}
	
	CleanupStack::PopAndDestroy(2); // parser, readParser
	return passedTest;
	}


void MakeDirectoriesL()
	{
	gFsSession.MkDirAll(KDirRandomlyGeneratedIn);
	gFsSession.MkDirAll(KDirRandomlyGeneratedOut);
	}


void DeleteAllPreviousTestsL()
	{
	TFileName fileSpecToDelete;
	
	CFileMan* fileMan = CFileMan::NewL(gFsSession);
	CleanupStack::PushL(fileMan);

	// Delete all the vCards in the Original directory...
	fileSpecToDelete  = KDirRandomlyGeneratedOut;
	fileSpecToDelete += KNameDeleteFileSpec;
	fileMan->Delete(fileSpecToDelete);

	// Delete all the vCards in the ReadInWrittenOut directory...
	fileSpecToDelete  = KDirRandomlyGeneratedIn;
	fileSpecToDelete += KNameDeleteFileSpec;
	fileMan->Delete(fileSpecToDelete);

	CleanupStack::PopAndDestroy(); // fileMan
	}

void FileCleanup(TAny * aFileMan)
	{
	gFsSession.Delete(_L("C:\\Test.vcf"));
	CFileMan* FileMan = (CFileMan*)aFileMan;
	FileMan->RmDir(_L("C:\\vCards\\"));
	}

void PrepareForTestsL()
	{
	MakeDirectoriesL();
	DeleteAllPreviousTestsL();
	}

void doMainL()
	{
	CFileMan* FileMan = CFileMan::NewL(gFsSession);
	CleanupStack::PushL(FileMan);
	CleanupStack::PushL(TCleanupItem(FileCleanup, FileMan));

	TTime time;
	time.UniversalTime();
	gSeed = time.Int64();
#if defined(__WINS__)
	//gSeed=MAKE_TINT64(0x00e07096,0xb1f742e0);
	TInt64 sSeed=gSeed;
#endif

	RFile file;
	TInt err = file.Replace(gFsSession, KNameErrorLogfile(), EFileWrite+EFileShareAny+EFileStreamText);
	User::LeaveIfError(err);
	CleanupClosePushL(file);
	TFileText logFile;
	logFile.Set(file);

	/*TBuf<1> u;
	u.Append(0xfffe);
	logFile.Write(u);*/

	CreateArraysL();
	CreatePropertyValuesL();
	CreatePropertyParametersL();
	CreatePropertyDefinitionsL();

	const TInt KNumberOfTests = VTestHelpers::MakeRandomNumber(KMinNumberOfTestsToPerform, KMaxNumberOfTestsToPerform, gSeed);
	TInt firstFail=0;
	for(TInt ii=1; ii<KNumberOfTests; ++ii)
		{
		gTest.Console()->ClearScreen();
		gTest.Printf(KTestIndicator,ii);
		gTest.Printf(KTestIndicatorSeparator);
		if (!CreateVCardL(ii,logFile) && firstFail==0)
			firstFail=ii;
		}
	if (firstFail>0)
		{
		_LIT(KFail,"First test to fail = %d\n");
		gTest.Printf(KFail,firstFail);
		}

	DestroyArraysL();
	
	PrepareForTestsL();
	_LIT(KFail,"\r\n Starting Test for creating user properties\n");
	gTest.Printf(KFail);

	CreateArraysL();
	CreatePropertyValuesL();
	CreatePropertyParametersL();
	CreateUserDefinedPropertyDefinitionsL();

	const TInt KNumberOfTests1 = VTestHelpers::MakeRandomNumber(KMinNumberOfTestsToPerform, KMaxNumberOfTestsToPerform, gSeed);
	firstFail=0;
	for(TInt jj=1; jj<KNumberOfTests1; ++jj)
		{
		gTest.Console()->ClearScreen();
		gTest.Printf(KTestIndicator,jj);
		gTest.Printf(KTestIndicatorSeparator);
		if (!CreateVCardL(jj,logFile) && firstFail==0)
			firstFail=jj;
		}
	if (firstFail>0)
		{
		_LIT(KFail,"First test to fail = %d\n");
		gTest.Printf(KFail,firstFail);
		}

	DestroyArraysL();
	
	CleanupStack::Pop(); //file.Close()
	CleanupStack::PopAndDestroy(2, FileMan);
	}

/**
@SYMTestCaseID PIM-TVGEN-0001
*/	
GLDEF_C TInt E32Main()
	{	
	
	TTime startTime;
	startTime.UniversalTime();
	
	__UHEAP_MARK;
	gTest.Start(_L("@SYMTestCaseID PIM-TVGEN-0001 TVGEN"));
	gTest.Title();
	gCleanup = CTrapCleanup::New();
	gFsSession.Connect();

	TInt error = KErrNone;

	TRAP(error, PrepareForTestsL());	
	TRAP(error, doMainL());	
	gTest(error==KErrNone);
	delete gCleanup;	

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