--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarks/locationlandmarks/tsrc/LandmarkTestModule/src/FT_CPosTp106.cpp Tue Aug 31 15:37:04 2010 +0300
@@ -0,0 +1,580 @@
+/*
+* 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 <e32std.h>
+#include <ss_std.h>
+
+#include <EPos_CPosLandmarkDatabase.h>
+#include <EPos_CPosLandmark.h>
+#include <EPos_CPosLmDatabaseManager.h>
+
+#include "FT_CPosTp106.h"
+
+// Nr of simultaneous clients (threads)
+const TInt KNoMultipleClients = 5;
+
+// Nr of created dbs
+const TInt KNrOfDBs=25;
+const TInt KCheckIfExistDBs=10;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CPosTp106::CloseTest
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp106::CloseTest()
+ {
+ iLog->Log(_L("CloseTest"));
+ for (TInt i=0; i<iThreads.Count(); i++)
+ {
+ iThreads[i].Close();
+ }
+
+ iThreads.Close();
+
+ delete iDatabase;
+ iDatabase=NULL;
+
+ iUseLogFromThreadIsDisabled = EFalse;
+
+ TRAPD(err, RemoveAllLmDatabasesL());
+ if (err != KErrNone) iLog->Log(_L("Error when deleting all lm dbs"));
+
+ }
+
+// ---------------------------------------------------------
+// CPosTp106::StartL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp106::StartL()
+ {
+ MakeSurePanicDebugFileExistsL();
+
+ RemoveAllLmDatabasesL();
+
+ iUseLogFromThreadIsDisabled = ETrue;
+
+ TBuf<150> buf;
+
+ _LIT(KTrace1, "Create %d x %d (=%d) nr of dbs took = %d msec");
+ _LIT(KTrace2, "Copy %d x %d (=%d) nr of dbs took = %d msec");
+ _LIT(KTrace3, "Get and Set default URI for %d x %d (=%d) nr of dbs took = %d msec");
+ _LIT(KTrace4, "Get display name for %d x %d (=%d) nr of dbs took = %d msec");
+ _LIT(KTrace5, "Check if db exist for %d x %d (=%d) nr of dbs took = %d msec");
+ _LIT(KTrace6, "Delete %d x %d (=%d) nr of dbs took = %d msec");
+
+ iTestStep=Step1;
+ StartMultipleClientsL(KNoMultipleClients);
+ TInt64 msec = (iStop.Int64() - iStart.Int64())/1000;
+ buf.Format(KTrace1, KNrOfDBs, KNoMultipleClients, KNrOfDBs*KNoMultipleClients, msec);
+ iLog->Log(buf);
+
+ iTestStep=Step2;
+ StartMultipleClientsL(KNoMultipleClients);
+ msec = (iStop.Int64() - iStart.Int64())/1000;
+ buf.Format(KTrace2, KNrOfDBs, KNoMultipleClients, KNrOfDBs*KNoMultipleClients, msec);
+ iLog->Log(buf);
+
+ iTestStep=Step3;
+ StartMultipleClientsL(KNoMultipleClients);
+ msec = (iStop.Int64() - iStart.Int64())/1000;
+ buf.Format(KTrace3, KNrOfDBs, KNoMultipleClients, KNrOfDBs*KNoMultipleClients, msec);
+ iLog->Log(buf);
+
+ iTestStep=Step4;
+ StartMultipleClientsL(KNoMultipleClients);
+ msec = (iStop.Int64() - iStart.Int64())/1000;
+ buf.Format(KTrace4, KNrOfDBs, KNoMultipleClients, KNrOfDBs*KNoMultipleClients, msec);
+ iLog->Log(buf);
+
+ iTestStep=Step5;
+ StartMultipleClientsL(KNoMultipleClients);
+ msec = (iStop.Int64() - iStart.Int64())/1000;
+ buf.Format(KTrace5, KNrOfDBs, KNoMultipleClients, KNrOfDBs*KNoMultipleClients, msec);
+ iLog->Log(buf);
+
+ iTestStep=Step6;
+ StartMultipleClientsL(KNoMultipleClients);
+ msec = (iStop.Int64() - iStart.Int64())/1000;
+ buf.Format(KTrace6, KNrOfDBs, KNoMultipleClients, KNrOfDBs*KNoMultipleClients, msec);
+ iLog->Log(buf);
+
+ }
+
+// ---------------------------------------------------------
+// CPosTp106::StartMultipleClientsL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp106::StartMultipleClientsL(const TUint aNoClients)
+ {
+ _LIT(KMultipleErr, "Error %d from thread %d");
+ _LIT(KPanicErr, "Thread %d has panicked or is alive");
+ _LIT(KSuccess, "Thread %d is successful");
+
+ CreateThreadsL(aNoClients);
+
+ RArray<TRequestStatus> statuses;
+ CleanupClosePushL(statuses);
+
+ // Start measuring time
+ iStart.UniversalTime();
+
+ for (TUint j=0; j<aNoClients; j++)
+ {
+ TRequestStatus status;
+ statuses.Append(status);
+ }
+
+ TInt i=0;
+ for (i=0; i<iThreads.Count(); i++)
+ {
+ iThreads[i].Logon(statuses[i]);
+ iThreads[i].Resume();
+ }
+
+ for (i=0; i<iThreads.Count(); i++)
+ {
+ User::WaitForRequest(statuses[i]);
+ }
+
+ TInt errors=0;
+ for (i=0; i<iThreads.Count(); i++)
+ {
+ TInt exitReason = iThreads[i].ExitReason();
+ TBuf<100> info;
+
+ if (exitReason != KErrNone)
+ {
+ errors++;
+ info.Format(KMultipleErr, exitReason, i+1);
+ }
+ else
+ {
+ info.Format(KSuccess, i+1);
+ }
+ iLog->Log(info);
+
+ AssertTrueSecL(iThreads[i].ExitType() == EExitKill, KPanicErr, i+1);
+ AssertTrueSecL(exitReason == KErrNone || exitReason == KErrLocked, info);
+ }
+
+ // Stop measuring time
+ iStop.UniversalTime();
+/*
+ if (iTestStep != EReadLockTaken)
+ {
+ AssertTrueSecL(errors == KNoMultipleClients - 1, KAllErr);
+ }
+ else
+ {
+ // All imports should have failed since the started search should have taken a read lock
+ AssertTrueSecL(errors == KNoMultipleClients, KAllNotFailedErr);
+ }
+ */
+
+ for (i=0; i<iThreads.Count(); i++)
+ {
+ iThreads[i].Close();
+ }
+
+ iThreadIndex=0;
+ iThreads.Close();
+ CleanupStack::PopAndDestroy(&statuses);
+ }
+
+// ---------------------------------------------------------
+// CPosTp106::RunTestL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp106::RunTestL(TAny* aData)
+ {
+ CPosTp106* self = reinterpret_cast<CPosTp106*>(aData);
+ TInt index = ++self->iThreadIndex;
+
+ TBuf<100> info;
+ _LIT(KInfo2, "Thread %d before execute");
+ info.Format(KInfo2, index);
+ RDebug::Print(info);
+
+ switch (self->iTestStep)
+ {
+ case Step1:
+ self->CreateAndListDatabasesL(index);
+ break;
+ case Step2:
+ self->CopyDatabasesL(index);
+ break;
+ case Step3:
+ self->SetAndGetUriL(index);
+ break;
+ case Step4:
+ self->GetDisplayNameL();
+ break;
+ case Step5:
+ self->CheckIfExistL(index);
+ break;
+ case Step6:
+ self->DeleteDatabasesL();
+ break;
+ }
+
+ _LIT(KInfo3, "Thread %d after execute");
+ info.Format(KInfo3, index);
+ RDebug::Print(info);
+ }
+
+// ---------------------------------------------------------
+// CPosTp106::CreateAndListDatabasesL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp106::CreateAndListDatabasesL(TInt index)
+ {
+ CPosLmDatabaseManager* manager = CPosLmDatabaseManager::NewL();
+ CleanupStack::PushL(manager);
+
+ _LIT(KLmName, "Thread_%d_LmDbIndex%d.ldb");
+ _LIT(KLmURI, "file://C:Thread_%d_LmDbIndex%d.ldb");
+ TBuf<50> lmDbName;
+ TBuf<50> lmDbUri;
+ TInt i=0;
+ TInt NrOfFoundDbs=0;
+ // Create KNrOfDBs nr of landmark dbs
+
+ HPosLmDatabaseInfo* dbInfo = NULL;
+ for (i=0;i<KNrOfDBs;i++)
+ {
+ lmDbName.Zero();
+ lmDbName.Format(KLmName, index, i);
+ dbInfo = HPosLmDatabaseInfo::NewLC(lmDbName);
+ manager->CreateDatabaseL(*dbInfo);
+ CleanupStack::PopAndDestroy(dbInfo);
+ /*
+ This increases the filesize to much
+ CPosLandmarkDatabase* db = CPosLandmarkDatabase::OpenL(lmDbName);
+ CleanupStack::PushL(db);
+
+ if (db->IsInitializingNeeded())
+ {
+ ExecuteAndDeleteLD(db->InitializeL());
+ }
+ CleanupStack::PopAndDestroy(db);
+ */
+ }
+
+ // List all dbs
+ CDesCArray* dbArray = manager->ListDatabasesLC();
+ TInt nr = dbArray->Count();
+
+ // Check that at least KNrOfDBs nr of dbs exist
+ if (nr < KNrOfDBs) User::Panic(_L("Wrong Nr"), -666);
+
+ // Check that all created dbs are listed
+ for (TInt j=0;j<KNrOfDBs;j++)
+ {
+ lmDbUri.Zero();
+ lmDbUri.Format(KLmURI, index, j);
+ for (i=0;i<nr;i++)
+ {
+ if ((*dbArray)[i].CompareC(lmDbUri) == KErrNone)
+ {
+ // Found
+ i=nr;
+ NrOfFoundDbs++;
+ }
+ }
+ }
+
+ if (NrOfFoundDbs != KNrOfDBs) User::Panic(_L("Wrong Nr"), -667);
+
+ CleanupStack::PopAndDestroy(dbArray);
+ CleanupStack::PopAndDestroy(manager);
+ }
+
+// ---------------------------------------------------------
+// CPosTp106::CopyDatabasesL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp106::CopyDatabasesL(TInt index)
+ {
+ CPosLmDatabaseManager* manager = CPosLmDatabaseManager::NewL();
+ CleanupStack::PushL(manager);
+
+ _LIT(KLmName, "Thread_%d_LmDbIndex%d.ldb");
+ _LIT(KLmNameCopy, "Thread_%d_LmDbIndex%d_Copy.ldb");
+ _LIT(KLmURICopy, "file://C:Thread_%d_LmDbIndex%d_Copy.ldb");
+ TBuf<50> lmDbName;
+ TBuf<50> lmDbNameCopy;
+ TBuf<50> lmDbUriCopy;
+ TInt i=0;
+ TInt NrOfFoundDbs=0;
+ // Create KNrOfDBs nr of landmark dbs
+ for (i=0;i<KNrOfDBs;i++)
+ {
+ lmDbName.Zero();
+ lmDbName.Format(KLmName, index, i);
+
+ lmDbNameCopy.Zero();
+ lmDbNameCopy.Format(KLmNameCopy, index, i);
+ manager->CopyDatabaseL(lmDbName, lmDbNameCopy);
+ }
+
+ // List all dbs
+ CDesCArray* dbArray = manager->ListDatabasesLC();
+ TInt nr = dbArray->Count();
+
+ // Check that at least all copied dbs are listed
+ for (TInt j=0;j<KNrOfDBs;j++)
+ {
+ lmDbUriCopy.Zero();
+ lmDbUriCopy.Format(KLmURICopy, index, j);
+ for (i=0;i<nr;i++)
+ {
+ if ((*dbArray)[i].Compare(lmDbUriCopy) == KErrNone)
+ {
+ // Found
+ i=nr;
+ NrOfFoundDbs++;
+ }
+ }
+ }
+
+ if (NrOfFoundDbs != KNrOfDBs) User::Panic(_L("WrongNrOfCopiedDb"), -667);
+
+ CleanupStack::PopAndDestroy(dbArray);
+ CleanupStack::PopAndDestroy(manager);
+ }
+
+// ---------------------------------------------------------
+// CPosTp106::DeleteDatabasesL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp106::DeleteDatabasesL()
+ {
+ CPosLmDatabaseManager* manager = CPosLmDatabaseManager::NewL();
+ CleanupStack::PushL(manager);
+
+ // _LIT(KLmURICopy, "file://C:Thread_%d_LmDbIndex%d_Copy.LDB");
+ // _LIT(KLmURI, "file://C:THREAD_%d_LMDBINDEX%d.LDB");
+
+ TBuf<50> lmDbUri;
+ TBuf<50> lmDbUriCopy;
+
+ CDesCArray* dbArray = manager->ListDatabasesLC();
+ TInt nr = dbArray->Count();
+
+ // Delete all created dbs and copied dbs
+ for (TInt j=0;j<nr;j++)
+ {
+ TRAPD(err, manager->DeleteDatabaseL((*dbArray)[j]));
+ }
+
+ /*
+ // Delete all created dbs and copied dbs
+ for (TInt j=0;j<KNrOfDBs;j++)
+ {
+ lmDbUriCopy.Zero();
+ lmDbUri.Zero();
+ lmDbUriCopy.Format(KLmURICopy, index, j);
+ lmDbUri.Format(KLmURI, index, j);
+
+ manager->DeleteDatabaseL(lmDbUriCopy);
+ manager->DeleteDatabaseL(lmDbUri);
+ }
+ */
+
+ CleanupStack::PopAndDestroy(dbArray);
+ CleanupStack::PopAndDestroy(manager);
+ }
+
+// ---------------------------------------------------------
+// CPosTp106::SetAndGetUriL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp106::SetAndGetUriL(TInt /*index*/)
+ {
+ CPosLmDatabaseManager* manager = CPosLmDatabaseManager::NewL();
+ CleanupStack::PushL(manager);
+
+ _LIT(KLmURI, "file://C:Thread_%d_LmDbIndex%d.ldb");
+
+ // Try to set (and get) defaultdb to dbs created by first thread
+ TBuf<50> name;
+
+ // index = 0;
+ for (TInt j=0;j<KNrOfDBs;j++)
+ {
+ name.Zero();
+ // Use first thread index 1
+ name.Format(KLmURI, 1, j);
+ manager->SetDefaultDatabaseUriL(name);
+
+ HBufC* defaultName = manager->DefaultDatabaseUriLC();
+
+ // TBD Maybe some other client has succeeded in changing the default name already
+ if (defaultName->Compare(name) != KErrNone)
+ {
+ User::Panic(_L("WrongDefaultDb"), -671);
+ }
+ CleanupStack::PopAndDestroy(defaultName);
+ }
+ CleanupStack::PopAndDestroy(manager);
+ }
+
+// ---------------------------------------------------------
+// CPosTp106::GetDisplayNameL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp106::GetDisplayNameL()
+ {
+ CPosLmDatabaseManager* manager = CPosLmDatabaseManager::NewL();
+ CleanupStack::PushL(manager);
+
+ // Get display name for default db
+ for (TInt j=0;j<KNrOfDBs;j++)
+ {
+ HBufC* dbUri = manager->DefaultDatabaseUriLC();
+ HPosLmDatabaseInfo* dbInfo = HPosLmDatabaseInfo::NewLC(dbUri->Des());
+ TPosLmDatabaseSettings settings = dbInfo->Settings();
+ TPtrC displayName = settings.DatabaseName();
+ CleanupStack::PopAndDestroy(2);
+ }
+
+ CleanupStack::PopAndDestroy(manager);
+ }
+
+// ---------------------------------------------------------
+// CPosTp106::CheckIfExistL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp106::CheckIfExistL(TInt index)
+ {
+ CPosLmDatabaseManager* manager = CPosLmDatabaseManager::NewL();
+ CleanupStack::PushL(manager);
+
+ _LIT(KLmURICopy, "file://C:Thread_%d_LmDbIndex%d_Copy.ldb");
+ _LIT(KLmURI, "file://C:Thread_%d_LmDbIndex%d.ldb");
+
+ _LIT(KLmNonExistingURI, "file://C:THREAD_%d_PELLE_%d.LDB");
+
+ TBuf<50> lmDbUri;
+ TBuf<50> lmDbUriCopy;
+ TBuf<50> lmDbNonExistingUri;
+
+ TInt j=0;
+ // Check that some created dbs and copied dbs exist
+ // Check that non existing db does not exist
+
+ // Check files created by first thread only
+ index=1;
+
+ for (j=0;j<KCheckIfExistDBs;j++)
+ {
+ lmDbUriCopy.Zero();
+ lmDbUri.Zero();
+ lmDbUriCopy.Format(KLmURICopy, index, j);
+ lmDbUri.Format(KLmURI, index, j);
+
+ lmDbNonExistingUri.Zero();
+ lmDbNonExistingUri.Format(KLmNonExistingURI, index, j);
+
+ // Should exist
+ TBool res = manager->DatabaseExistsL(lmDbUriCopy);
+ if (!res) User::Panic(_L("DbNotExist"), -668);
+
+ // Should exist
+ res = manager->DatabaseExistsL(lmDbUri);
+ if (!res) User::Panic(_L("DbNotExist"), -669);
+
+ // Should NOT exist
+ res = manager->DatabaseExistsL(lmDbNonExistingUri);
+ if (res) User::Panic(_L("DbExist"), -670);
+ }
+
+ CleanupStack::PopAndDestroy(manager);
+ }
+
+// ---------------------------------------------------------
+// ThreadFunction
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+LOCAL_C TInt ThreadFunction(TAny* aData)
+ {
+ CTrapCleanup* cleanup=CTrapCleanup::New();
+
+ CActiveScheduler* actSch = new (ELeave) CActiveScheduler;
+ CActiveScheduler::Install(actSch);
+
+ TRAPD(err, CPosTp106::RunTestL(aData));
+
+ delete actSch;
+ delete cleanup;
+ return err;
+ }
+
+// ---------------------------------------------------------
+// CPosTp106::CreateThreadsL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp106::CreateThreadsL(const TUint aNoThreads)
+ {
+ _LIT(KThreadName, "Tp106testthread%d");
+ _LIT(KCreateThreadErr, "Create thread failed with %d");
+
+ for (TUint i=0; i<aNoThreads; i++)
+ {
+ RThread thread;
+ TBuf<32> name;
+ name.Format(KThreadName, 1 + iThreadNum++);
+
+ TInt err;
+ err = thread.Create(name, ThreadFunction, KDefaultStackSize, KMinHeapSize, KMaxHeapSize, reinterpret_cast<TAny*>(this));
+
+ AssertTrueSecL(err == KErrNone, KCreateThreadErr, err);
+
+ iThreads.Append(thread);
+ }
+ }
+
+// End of File