// Copyright (c) 2005-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 <e32test.h>
#include "cntdb.h" 

#include "T_CProgressNotification.h"

/* 
3 steps to create test
======================
1	Derive from MContactUiCompactObserver
2	Get an instance fo the activebase class via - CContactActiveCompress* CContactDatabase::CreateCompressorLC()
3	Call CContactActiveCompress::SetObserver to recieve notifications
*/	

_LIT(KTestDbName, "c:T_CProgressNotification.cdb");
	
void CProgressNotificationTest::AddContactsL(TInt aNoOfCnts)
	{
	TInt max = KMaxArraySize < aNoOfCnts ? KMaxArraySize : aNoOfCnts;
	// Add contacts
	CContactItem* cntItem = NULL;
	for (TInt ii = 0; ii < max; ++ii)
		{
		cntItem = iCntItemBldr->GetCntItemLC();
		iIDarray[ii] = iCntDb->AddNewContactL(*cntItem);
		CleanupStack::PopAndDestroy(cntItem);
		}
	}
	
void CProgressNotificationTest::DeleteContactsL(TInt aNoOfCnts)
	{
	TInt max = KMaxArraySize < aNoOfCnts ? KMaxArraySize : aNoOfCnts;
	//Remove the contacts
	for (TInt ii = 0; ii < max; ++ii)
		{
		iCntDb->DeleteContactL(iIDarray[ii]);
		iIDarray[ii] = 0;
		}
	}
	
	
void CProgressNotificationTest::HandleError(TInt aError)
	{
	iTest->Printf(_L(" - Received Compress Recover ERROR code:  %d \r\n"), aError);
	(*iTest)(EFalse); //Panic here
	}

	

void CProgressNotificationTest::Step(TInt aStep)
	{
	iTest->Printf(_L(" - Recieved Compress/Recover Event - Step: %d \r\n"), aStep);
	iSteps = aStep;

	if(aStep > 0 && iActiveCompress != NULL) 
		{
		if(!(iActiveCompress->StepsTogo() > 0 ))
			{
			iTest->Printf(_L(" ---- *****ERROR**** Compress Test Error - StepsTogo should be greater than zero \r\n"));
			(*iTest)(EFalse); //Panic here
			}
		}
	}
	

void CProgressNotificationTest::RunCompressNotifyTestL()
	{
  	iTest->Start(_L("Compress Test"));

	if (iActiveCompress)
		delete iActiveCompress;
	iActiveCompress = iCntDb->CreateCompressorLC();
	CleanupStack::Pop(iActiveCompress);
	
	// check if first step is greater than 0; CreateCompressorLC should have started the compression
	if(!(iActiveCompress->StepsTogo() > 0 ))
		{
		iTest->Printf(_L(" ---- *****ERROR**** Compress Test Error - StepsTogo should be greater than zero \r\n"));
		(*iTest)(EFalse); //Panic here
		}

	iActiveCompress->SetObserver(static_cast<MContactUiCompactObserver*>(this));
	while(iActiveCompress->Step()) {};
	
	iTest->End(); //If we are here test completed with success
	}
	
	
void CProgressNotificationTest::RunCompressNotifyCancelTestL()	
	{
  	iTest->Start(_L("Compress CANCEL Test"));

	if (iActiveCompress)
		delete iActiveCompress;
	iActiveCompress = iCntDb->CreateCompressorLC();
	CleanupStack::Pop(iActiveCompress);
	
	iActiveCompress->SetObserver(static_cast<MContactUiCompactObserver*>(this));
	iActiveCompress->Step();
	TInt halfSteps = iSteps/2;
	
	while (iSteps > halfSteps)
		{
		iActiveCompress->Step();
		}

	delete iActiveCompress;
	iActiveCompress = NULL;
	
	iTest->End(); //If we are here test completed with success
	}
	
	
void CProgressNotificationTest::RunRecoverNotifyCancelTestL()
	{
	iTest->Start(_L("Recover CANCEL Test"));
	
	iCntDb->DamageDatabaseL(0x666);
	
	if (iCntDb->IsDamaged() == EFalse)
		{
		iTest->Printf(_L(" ---- DATABASE IS NOT DAMAGED For Test ---- \r\n"));	
#ifndef __SYMBIAN_CNTMODEL_USE_SQLITE__		
		(*iTest)(EFalse); //Panic here
#else
		return;  // test has no meaning with SQLite
#endif		
		}
	
	if (iActiveRecover)
		delete iActiveRecover;
	iActiveRecover = iCntDb->CreateRecoverLC();
	CleanupStack::Pop(iActiveRecover);
	
	iActiveRecover->SetObserver(static_cast<MContactUiCompactObserver*>(this));
	
	//do only one step
	iActiveRecover->Step();
	
	if (iCntDb->IsDamaged() == EFalse)
		{
		iTest->Printf(_L(" ---- DATABASE IS NOT DAMAGED For Test ---- \r\n"));	
		(*iTest)(EFalse); //Panic here
		}
		
	TRAPD(err, AddContactsL(1));
	if(err == KErrNone)
		{
		iTest->Printf(_L(" ---- *****ERROR**** recover cancellation does not works ---- \r\n"));	
		(*iTest)(EFalse); //Panic here
		}

	//recover stop in destructor
	delete iActiveRecover;
	iActiveRecover = NULL;	
	
	iCntDb->RecoverL();
	
	iTest->End(); //If we are here test completed with success
	}

	
void CProgressNotificationTest::RunRecoverNotifyTestL()
	{
	iTest->Start(_L("Recover Test"));
	
	iCntDb->DamageDatabaseL(0x666);
	if (iCntDb->IsDamaged())
		{
		iTest->Printf(_L(" ---- DATABASE IS DAMAGED ---- \r\n"));	
		}
	
  	if (iActiveRecover)
		delete iActiveRecover;
	iActiveRecover = iCntDb->CreateRecoverLC();
	CleanupStack::Pop(iActiveRecover);
	
	iActiveRecover->SetObserver(static_cast<MContactUiCompactObserver*>(this));
	while(iActiveRecover->Step()) {};	
	
	if (iCntDb->IsDamaged())
		{
		iTest->Printf(_L(" ----*****ERROR**** DATABASE IS STILL DAMAGED ---- \r\n"));	
		(*iTest)(EFalse); //Panic here
		}
		
	iTest->End(); //If we are here test completed with success
	}

	
CProgressNotificationTest* CProgressNotificationTest::NewLC()
	{
	CProgressNotificationTest* self = new (ELeave) CProgressNotificationTest();
	CleanupStack::PushL(self);
	self->ConstructL();
	return self;		
	}
	
CProgressNotificationTest::CProgressNotificationTest()
	{}
	

void CProgressNotificationTest::ConstructL()
	{
	// For multi-threaded test harness.
	iTest = new(ELeave) RTest(_L(""));

	iCntDb = CContactDatabase::ReplaceL(KTestDbName); // Default Database.
	const CContactTemplate& sysTempl(GetSysTemplateL() );
	iCntItemBldr = CCntItemBuilder::NewLC(sysTempl);
	CleanupStack::Pop(iCntItemBldr);
	}

CProgressNotificationTest::~CProgressNotificationTest()
	{
	iTest->Close();
	delete iTest;
	
	delete iCntDb;
	delete iGoldenTemplate;
	delete iCntItemBldr;

	delete iActiveCompress;
	delete iActiveRecover;
	TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KTestDbName));
	}

const CContactTemplate& CProgressNotificationTest::GetSysTemplateL()
	{
	if (!iGoldenTemplate)
		{
		CContactItemViewDef* matchAll = CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EIncludeHiddenFields);
		matchAll->AddL(KUidContactFieldMatchAll);

		iGoldenTemplate = static_cast<CContactTemplate*>(iCntDb->ReadContactL(iCntDb->TemplateId(), *matchAll));
		CleanupStack::PopAndDestroy(matchAll);
		}
	return *iGoldenTemplate;
	} 
  	
		
