landmarks/locationlandmarks/tsrc/LandmarkTestModule/src/FT_CPosTp116.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:37:04 +0300
branchRCL_3
changeset 44 2b4ea9893b66
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2005 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: 
*   ?description_line
*
*/


//  INCLUDES
#include "FT_CPosTp116.h"
#include <EPos_CPosLandmarkDatabase.h> 
#include <d32dbms.h>
#include <StifLogger.h>
//  CONSTANTS

// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------
// CPosTp116::CloseTest
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CPosTp116::CloseTest()
    {
    iLog->Log(_L("CloseTest"));
    delete iActiveLmEvent;
    iActiveLmEvent = NULL;
    }

// ---------------------------------------------------------
// CPosTp116::StartL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CPosTp116::StartL()
    {
    // First remove all landmark databases
    RemoveAllLmDatabasesL();
    	
    // Start test
    LandmarkEventTestL();
   
    // Remove all landmark databases
   RemoveAllLmDatabasesL();
	}

// ---------------------------------------------------------
// CPosTp28::LandmarkEventTestL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CPosTp116::LandmarkEventTestL()
    {
    iLog->Log(_L("LandmarkEventTestL"));

  //  _LIT(KDatabase, "file://c:eposlm.ldb");
    _LIT(KDatabase, "file://c:Tp116Test.ldb");
    _LIT(KDatabase1, "file://c:Tp116LmDb_1.ldb");

#ifdef __WINS__
    // For WINS use C drive
    _LIT(KDatabase1_OnMedia, "file://c:Tp116LmDb_1_OnMedia.ldb");
    _LIT(KDatabase2_OnMedia, "file://c:Tp116LmDb_2_OnMedia.ldb");
#else
    //Media card must therefore be inserted
    _LIT(KDatabase1_OnMedia, "file://F:Tp116LmDb_1_OnMedia.ldb");
    _LIT(KDatabase2_OnMedia, "file://F:Tp116LmDb_2_OnMedia.ldb");
#endif
    
    _LIT(KDatabase2, "file://c:Tp116LmDb_2.ldb");
    _LIT(KDatabase3, "file://c:Tp116LmDb_3.ldb");
    _LIT(KDatabase4, "file://c:Tp116LmDb_4.ldb");
    
    _LIT(KDatabase5, "file://c:Tp116DummyLmDb_5.ldb");
    _LIT(KDatabase6, "file://c:Tp116DummyLmDb_6.ldb");
    _LIT(KDatabase7, "file://c:Tp116DummyLmDb_7.ldb");
	_LIT(KDatabase8, "file://c:Tp116DummyLmDb_8.ldb");
	_LIT(KDatabase9, "file://c:Tp116DummyLmDb_9.ldb");
	_LIT(KDatabase10, "file://c:Tp116DummyLmDb_10.ldb");
	_LIT(KDatabase11, "file://c:Tp116DummyLmDb_11.ldb");
	_LIT(KDatabase12, "file://c:Tp116DummyLmDb_12.ldb");
	_LIT(KDatabase13, "file://c:Tp116LmDb_13.ldb");
	_LIT(KDatabase14, "file://c:Tp116LmDb_14.ldb");
	
	_LIT(KRemoteDb1, "test://RemoteDb1.ldb");
    _LIT(KRemoteDbName1, "RemoteDb1New");
    _LIT(KNonExistingDb, "ANonExistingDb.ldb");

    TInt err = KErrNone;
    iLog->Log(_L("Warning: this test case requires E: drive"));
    
    iActiveLmEvent = CTP116ActiveLmEvent::NewL(iLog);

    CPosLmDatabaseManager* manager = CPosLmDatabaseManager::NewL();
    CleanupStack::PushL(manager);
    
    HPosLmDatabaseInfo* dbInfo = HPosLmDatabaseInfo::NewLC(KDatabase);
    manager->CreateDatabaseL(*dbInfo);
    CleanupStack::PopAndDestroy(dbInfo);
    
    // This db must exist, set here so that when setting default db next it is different from before
    // otherwise no event
    manager->SetDefaultDatabaseUriL(KDatabase);

    // 1) iActiveLmEvent will listen for multiple database events
    iActiveLmEvent->Start();
    
    iLog->Log(_L("2) EDatabaseCreated "));
    // 2) Create a landmark database, db1 on the c: drive
    HPosLmDatabaseInfo* dbInfo1 = HPosLmDatabaseInfo::NewLC(KDatabase1);
    manager->CreateDatabaseL(*dbInfo1);
    CleanupStack::PopAndDestroy(dbInfo1);
    
    //iActiveLmEvent->iExpectedEvent = CPosLmDatabaseManager::EDatabaseCreated;
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseRegistered;
    
    iActiveLmEvent->SetExpectedDatabase(KDatabase1);
    CActiveScheduler::Start();
      
   	iLog->Log(_L("3) ENewDefaultDbLocation "));
    // 3) Set the defaultdb to point at the newly created db
    manager->SetDefaultDatabaseUriL(KDatabase1);
    iActiveLmEvent->iExpectedEvent = EPosLmDbNewDefaultDbLocation;
    iActiveLmEvent->SetExpectedDatabase(KDatabase1);
    CActiveScheduler::Start();


    iLog->Log(_L("5) EDatabaseCreated "));
    // 5) Copy db1 to media drive
    manager->CopyDatabaseL(KDatabase1, KDatabase1_OnMedia);
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseRegistered;
    iActiveLmEvent->SetExpectedDatabase(KDatabase1_OnMedia);
    CActiveScheduler::Start();

    iLog->Log(_L("6) EDatabaseDeleted "));
    // 6) Delete copied db from media card
    manager->DeleteDatabaseL(KDatabase1_OnMedia);
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseUnregistered;
    iActiveLmEvent->SetExpectedDatabase(KDatabase1_OnMedia);
    CActiveScheduler::Start();

    iLog->Log(_L("7) EDatabaseCreated - EDatabaseDeleted"));
   // 7) Move db1 to media drive as db1_2-> First copy it and then delete (in same operation phase)
    manager->CopyDatabaseL(KDatabase1, KDatabase2_OnMedia);
    manager->DeleteDatabaseL(KDatabase1);
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseRegistered;
    iActiveLmEvent->SetExpectedDatabase(KDatabase2_OnMedia);
    CActiveScheduler::Start();
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseUnregistered;
    iActiveLmEvent->SetExpectedDatabase(KDatabase1);
    CActiveScheduler::Start();

    iLog->Log(_L("8) EDatabaseCreated"));
    //8) Create a db, db2, on media card
    
    HPosLmDatabaseInfo* dbInfo2 = HPosLmDatabaseInfo::NewLC(KDatabase2);
    manager->CreateDatabaseL(*dbInfo2);
    CleanupStack::PopAndDestroy(dbInfo2);
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseRegistered;
    iActiveLmEvent->SetExpectedDatabase(KDatabase2);
    CActiveScheduler::Start();

    iLog->Log(_L("9) ENewDefaultDbLocation"));
    // 9) Set the defaultdb to point at the newly created db
    manager->SetDefaultDatabaseUriL(KDatabase2);
    iActiveLmEvent->iExpectedEvent = EPosLmDbNewDefaultDbLocation;
    iActiveLmEvent->SetExpectedDatabase(KDatabase2);
    CActiveScheduler::Start();
    
    iLog->Log(_L("9b) EPosLmDbSettingsModified"));
    // 9b) Set the defaultdb to point at the newly created db
    HPosLmDatabaseInfo* dbInfoChange = HPosLmDatabaseInfo::NewLC(KDatabase2);
    TPosLmDatabaseSettings settings = dbInfo2->Settings();
    _LIT(KNewDbName, "TP116 Disp Name");
    TPosLmDatabaseName bufName(KNewDbName);
    settings.SetDatabaseName(bufName);
    manager->ModifyDatabaseSettingsL(KDatabase2, settings);
    CleanupStack::PopAndDestroy(dbInfoChange);
    
    iActiveLmEvent->iExpectedEvent = EPosLmDbSettingsModified;
    iActiveLmEvent->SetExpectedDatabase(KDatabase2);
    CActiveScheduler::Start();

    iLog->Log(_L("10) EDatabaseDeleted"));
    // 10) Delete db2 from media card
    manager->DeleteDatabaseL(KDatabase2);
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseUnregistered;
    iActiveLmEvent->SetExpectedDatabase(KDatabase2);
    CActiveScheduler::Start();

    iLog->Log(_L("11) EDatabaseCreated"));
    // 11) Copy db1_2 to C:\ as db1_3
    manager->CopyDatabaseL(KDatabase2_OnMedia, KDatabase3);
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseRegistered;
    iActiveLmEvent->SetExpectedDatabase(KDatabase3);
    CActiveScheduler::Start();

    iLog->Log(_L("12) EDatabaseDeleted"));
    // 12) Move db1_2 from media to C:\ drive as db1_4 -> First 
    // copy it and then delete (in same operation phase)
    manager->CopyDatabaseL(KDatabase2_OnMedia, KDatabase4);
    manager->DeleteDatabaseL(KDatabase2_OnMedia);
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseRegistered;
    iActiveLmEvent->SetExpectedDatabase(KDatabase4);
    CActiveScheduler::Start();
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseUnregistered;
    iActiveLmEvent->SetExpectedDatabase(KDatabase2_OnMedia);
    CActiveScheduler::Start();

    iLog->Log(_L("13) ENewDefaultDbLocation"));
    // 13) Set the defaultdb to point at db1_4
    manager->SetDefaultDatabaseUriL(KDatabase4);
    iActiveLmEvent->iExpectedEvent = EPosLmDbNewDefaultDbLocation;
    iActiveLmEvent->SetExpectedDatabase(KDatabase4);
    CActiveScheduler::Start();

    iLog->Log(_L("14) EDatabaseDeleted"));
    // 14) Delete db1_4
    manager->DeleteDatabaseL(KDatabase4);
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseUnregistered;
    iActiveLmEvent->SetExpectedDatabase(KDatabase4);
    CActiveScheduler::Start();
    
	iLog->Log(_L("15) --------- "));
	// Try to create a queue of events that is bigger than the internal queue buffer
	// should causes unknown event to happen and no databaseUri
    HPosLmDatabaseInfo* dbInfo13 = HPosLmDatabaseInfo::NewLC(KDatabase13);
    manager->CreateDatabaseL(*dbInfo13);
    CleanupStack::PopAndDestroy(dbInfo13);
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseRegistered;
    iActiveLmEvent->SetExpectedDatabase(KDatabase13);
    iActiveLmEvent->iQueueTest = ETrue;
    CActiveScheduler::Start();

	HPosLmDatabaseInfo* dbInfo4 = HPosLmDatabaseInfo::NewLC(KDatabase4);
	HPosLmDatabaseInfo* dbInfo5 = HPosLmDatabaseInfo::NewLC(KDatabase5);
	HPosLmDatabaseInfo* dbInfo6 = HPosLmDatabaseInfo::NewLC(KDatabase6);
	HPosLmDatabaseInfo* dbInfo7 = HPosLmDatabaseInfo::NewLC(KDatabase7);
	HPosLmDatabaseInfo* dbInfo8 = HPosLmDatabaseInfo::NewLC(KDatabase8);
	HPosLmDatabaseInfo* dbInfo9 = HPosLmDatabaseInfo::NewLC(KDatabase9);
	
	manager->CreateDatabaseL(*dbInfo4);
	manager->CreateDatabaseL(*dbInfo5);
	manager->DeleteDatabaseL(KDatabase4);
	manager->CopyDatabaseL(KDatabase5, KDatabase10);
	manager->CreateDatabaseL(*dbInfo6);
	manager->DeleteDatabaseL(KDatabase5);
	manager->CreateDatabaseL(*dbInfo7);
	manager->DeleteDatabaseL(KDatabase6);
	manager->CopyDatabaseL(KDatabase10, KDatabase11);
	manager->CreateDatabaseL(*dbInfo8);
	manager->DeleteDatabaseL(KDatabase7);
	manager->CreateDatabaseL(*dbInfo9);
	manager->CopyDatabaseL(KDatabase10, KDatabase12);
	manager->DeleteDatabaseL(KDatabase9);
	manager->DeleteDatabaseL(KDatabase8);
	
	CleanupStack::PopAndDestroy(dbInfo9);
	CleanupStack::PopAndDestroy(dbInfo8);
	CleanupStack::PopAndDestroy(dbInfo7);
	CleanupStack::PopAndDestroy(dbInfo6);
	CleanupStack::PopAndDestroy(dbInfo5);
	CleanupStack::PopAndDestroy(dbInfo4);
		
    // Check for unknown
	iActiveLmEvent->iExpectedEvent = EPosLmDbUnknownEvent;
    iActiveLmEvent->SetExpectedDatabase(KNullDesC);
    iActiveLmEvent->Start();
    CActiveScheduler::Start();
	
	iActiveLmEvent->iQueueTest = EFalse;
	
	TInt errorsFound = iActiveLmEvent->GetErrors();
    
    iActiveLmEvent->DoCancel();
    
    iActiveLmEvent->Start();
    
	iLog->Log(_L("16) EDatabaseCreated "));
    // 16) Check correct event after unknown event
    // Note: This does not work, new events are added to the queue after unknown event, so instead we 
    // cancel the event handling
    HPosLmDatabaseInfo* dbInfo14 = HPosLmDatabaseInfo::NewLC(KDatabase14);
    manager->CreateDatabaseL(*dbInfo14);
    CleanupStack::PopAndDestroy(dbInfo14);
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseRegistered;
    iActiveLmEvent->SetExpectedDatabase(KDatabase14);
    CActiveScheduler::Start();
    
    errorsFound = iActiveLmEvent->GetErrors();
    
    iActiveLmEvent->DoCancel();
    delete iActiveLmEvent;
    iActiveLmEvent = NULL;
    iActiveLmEvent = CTP116ActiveLmEvent::NewL(iLog);
    
    // Start listening
    iActiveLmEvent->Start();
        
	iLog->Log(_L("17) --------- "));
    // 17) Test that event handling is working for "remote" provider (use the test provider)
    //  as well
    HPosLmDatabaseInfo* db1 = HPosLmDatabaseInfo::NewLC(KRemoteDb1);
	manager->CreateDatabaseL(*db1);
    // Register remote db
    manager->RegisterDatabaseL(*db1);
    
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseRegistered;
    iActiveLmEvent->SetExpectedDatabase(KRemoteDb1);
    CActiveScheduler::Start();
    
    iLog->Log(_L("18) --------- "));
    // 18) Test that event handling is working for "remote" provider (use the test provider)
    //  as well
    // Modify Settings
    TPosLmDatabaseSettings remoteSettings = db1->Settings();
    TPosLmDatabaseName remoteName(KRemoteDbName1);
    remoteSettings.SetDatabaseName(remoteName);
    manager->ModifyDatabaseSettingsL(KRemoteDb1, remoteSettings);
    
    iActiveLmEvent->iExpectedEvent = EPosLmDbSettingsModified;
    iActiveLmEvent->SetExpectedDatabase(KRemoteDb1);
    CActiveScheduler::Start();
    CleanupStack::PopAndDestroy(db1);
    
    iLog->Log(_L("19) --------- "));
    // 19) Test that event handling is working for "remote" provider (use the test provider)
    //  as well
    // Unregister remote db
    manager->UnregisterDatabaseL(KRemoteDb1);
    iActiveLmEvent->iExpectedEvent = EPosLmDbDatabaseUnregistered;
    iActiveLmEvent->SetExpectedDatabase(KRemoteDb1);
    CActiveScheduler::Start();
       
	iLog->Log(_L("20) --------- "));
    // 20) Set the defaultdb to point at a non-existing db
    TRAP(err, manager->SetDefaultDatabaseUriL(KNonExistingDb));
    if (err != KErrNotFound) 
    {
    	iLog->Log(_L("SetDefaultDatabaseL(KNonExistingDb) should leave with KErrNotFound"));
    	User::Leave(err);
    }
    iLog->Log(_L("20 Done"));
    
    CleanupStack::PopAndDestroy(manager);
        
	errorsFound += iActiveLmEvent->GetErrors();
	
	delete iActiveLmEvent;
    iActiveLmEvent = NULL;
	
	if (errorsFound != KErrNone) 
		{
		iLog->Log(_L("Errors were found in TP116"));
    	User::Leave(-1);
		}

    }

// -----------------------------------------------------------------------------
// CTP116ActiveLmEvent::NewL
//
//(other items were commented in a header).
// -----------------------------------------------------------------------------
//
CTP116ActiveLmEvent* CTP116ActiveLmEvent::NewL(CStifLogger* aLog)
    {
    CTP116ActiveLmEvent* self = new(ELeave) CTP116ActiveLmEvent(aLog);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop();
    return self;
    }

// -----------------------------------------------------------------------------
// CTP116ActiveLmEvent::ConstructL
//
//(other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CTP116ActiveLmEvent::ConstructL()
    {
    iManager = CPosLmDatabaseManager::NewL();
    }

// -----------------------------------------------------------------------------
// CTP116ActiveLmEvent::CTP116ActiveLmEvent
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//

CTP116ActiveLmEvent::CTP116ActiveLmEvent(CStifLogger* aLog) : 
    CActive(EPriorityNormal),
    iLog(aLog)
    {   
    CActiveScheduler::Add(this);
    iGlobalErr=KErrNone;
    iQueueTest = EFalse;
    }

// Destructor
CTP116ActiveLmEvent::~CTP116ActiveLmEvent()
    {
    Cancel();
    delete iManager;
    iManager = NULL;
    }

// ---------------------------------------------------------
// CTP116ActiveLmEvent::SetExpectedDatabase
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CTP116ActiveLmEvent::SetExpectedDatabase(const TDesC& aDatabaseUri)
    {
    iExpectedDatabase.Zero();
    
    iExpectedDatabase.Append(aDatabaseUri);
    }

// ---------------------------------------------------------
// CTP116ActiveLmEvent::StartL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CTP116ActiveLmEvent::Start()                          
    {
    // Get ready for event
    iManager->NotifyDatabaseEvent(iEvent, iStatus);
    SetActive();
    }

// ---------------------------------------------------------
// CTP116ActiveLmEvent::RunL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CTP116ActiveLmEvent::RunL()
    {
     iLog->Log(_L("CTP116ActiveLmEvent::RunL"));

    TPosLmDatabaseEvent event = iEvent;
    VerifyEvent(event);
    if (!iQueueTest)
    	{
    	// Get ready for next event
    	iManager->NotifyDatabaseEvent(iEvent, iStatus); 
    	SetActive();
    	}
    }

// ---------------------------------------------------------
// CActiveLmOperation::DoCancel
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CTP116ActiveLmEvent::DoCancel()
    {
    iLog->Log(_L("CTP116ActiveLmEvent::DoCancel"));
    iManager->CancelNotifyDatabaseEvent();
    }

// ---------------------------------------------------------
// CActiveLmOperation::GetErrors
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
TInt CTP116ActiveLmEvent::GetErrors()
    {
	return iGlobalErr;
    }
    
// ---------------------------------------------------------
// CTP116ActiveLmEvent::VerifyEvent
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CTP116ActiveLmEvent::VerifyEvent(TPosLmDatabaseEvent event)
    {
    iLog->Log(_L("CTP116ActiveLmEvent::VerifyEvent"));
    TBuf<150> buffe;
    
    buffe.Format(_L("VerifyEvent Event: %d "), event.iEventType);
	iLog->Log(buffe);
	    
    // Verify event here
    if (event.iEventType != iExpectedEvent) 
        {
        buffe.Zero();
        buffe.Format(_L("ERROR: Wrong event: exp %d got %d"),iExpectedEvent, event.iEventType);
        iLog->Log(buffe);
        iGlobalErr++;
        }
    	
	if (event.iEventType != EPosLmDbUnknownEvent)	
		{
		
	    HBufC16* dbUri = iManager->DatabaseUriFromLastEventLC();
	    buffe.Zero();
	    buffe.Format(_L("Event: %d URI %S"), event.iEventType, dbUri);
	    iLog->Log(buffe);
    
		if (iExpectedDatabase.CompareC(*dbUri) != 0)
			{
			iLog->Log(_L("ERROR: Wrong db name"));
			buffe.Zero();
			buffe.Append(_L("Should be "));
			buffe.Append(iExpectedDatabase);
			iLog->Log(buffe);
	        iGlobalErr++;
			}
	    CleanupStack::PopAndDestroy(dbUri);			
		}
	else
		{
		buffe.Format(_L("EUnknownEvent Event: %d "), event.iEventType);
	    iLog->Log(buffe);
		}
        
	CActiveScheduler::Stop();
   
	iLog->Log(_L("VerifyEvent Done"));
    }

//  End of File